100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 4*4按键扫描程序c语言 【资料】单片机4*4矩阵键盘扫描程序(c语言+汇编语言2个版本)...

4*4按键扫描程序c语言 【资料】单片机4*4矩阵键盘扫描程序(c语言+汇编语言2个版本)...

时间:2021-05-17 22:13:39

相关推荐

4*4按键扫描程序c语言 【资料】单片机4*4矩阵键盘扫描程序(c语言+汇编语言2个版本)...

;4X4矩阵键盘程序。主要原理为扫描键盘矩阵时,每次只有一行电平拉低。在逐次扫描拉低的这些行的同时,去读那些列的电平。

;被拉低的行上,按下的键对应的列的电平为0 ,其它为1. 用左移位的指令,在进位位CY里就可以检测出是0还是1.为1表示无按下,

;为0表示该键按下。在扫描按键时,如无按下,则取码指针R1加1后,继续扫描 。如有键按下,转按键处理子程序,按键按下标志位

;F0清0(表示按下)。此时,取码指针的值,就是按键的键名。 随后继续进入按键检测子程序重新扫描。

;注:本程序只通过仿真,因无按键防抖,实物中正常与否,未能确定 。

; 04 10 D:\DPJ\4X4KEY.ASM

ORG 00H

AJMP MAIN

ORG 30H

MAIN:

MOV SP,#60H

MOV DPTR,#TABLE

KEY:

ACALL KEY0_1 ;调用KEY0_1,判断是否有键按下

JB F0,$-2 ;无键按下,转ACALL KEY0_1,继续扫描

MOV A,R1 ;R1为取码指针

MOVC A,@A+DPTR;取码,关送显示

MOV P1,A

AJMP KEY

KEY0_1: ;按键检测子程序

SETB F0 ;设F0=1

MOV R3,#0F7H;行扫描指针初值(P2.3=0)

MOV R1,#00H ;取码指针初值

L2:

MOV A,R3 ;载入扫描指针

MOV P2,A ;输出至P2,开始扫描为0的一行

NOP

MOV A,P2 ;读入P2

SETB C

MOV R5,#4 ;检测P2.7~P2.4,共4 列

L3: ;检测4列

RLC A ;左移一位(P2.7~P2.4)

JNC KEY1 ;检测到C=0,表示被按下

INC R1 ;无键按下则取码指针加1

DJNZ R5,L3 ;4列检测完毕?

MOV A,R3 ;载入扫描指针

SETB C

RRC A ;扫描为0的下一行,

MOV R3,A ;存回R3扫描指针寄存器

JC L2 ;C=0,行扫描完毕

RET

KEY1:

CLR F0 ;F0清0 ,表示按键按下

RET

TABLE:

DB 0C0H;0

DB 0F9H;1

DB 0A4H;2

DB 0B0H;3

DB 099H;4

DB 092H;5

DB 082H;

DB 0F8H;7

DB 080H;8

DB 090H;9

DB 088H;A

DB 083H;b

DB 0C6H;C

DB 0A1H;d

DB 086H;E

DB 08EH;F

END

其实4X4矩阵的51C程序很多,有的也简单。这个完全按上面汇编的写成C的,有点繁了。

//E:\DPJ_C\4X4KEY\4X4KEY.C

// 04 17 更新

#include

#include

#define uchar unsigned char

#define uint unsigned int

uchar a,b,temp;//a

bit flag;

uchar code tab[]={

0xC0,/*0*/

0xF9,/*1*/

0xA4,/*2*/

0xB0,/*3*/

0x99,/*4*/

0x92,/*5*/

0x82,/*6*/

0xF8,/*7*/

0x80,/*8*/

0x90,/*9*/

0x88,/*A*/

0x83,/*b*/

0xC6,/*C*/

0xA1,/*d*/

0x86,/*E*/

0x8E,/*F*/

};

void keyscan()

{

uchar i,j;

flag=1;//flag 有键按下标志

temp=0xf7; //temp 行扫描指针

a=0;

for(j=0;j<4;j++)

{

P2=temp;

_nop_();

b=P2; // b 列

for(i=0;i<4;i++)

{

b=b<<1;

IF(!CY)

{

flag=0;//有键按下,标志置0

return; //跳出

}

else

a++;//无键按下,

}

temp=_cror_(temp,1);//扫描下一行

}

}

void main()

{

while(1)

{

keyscan();

if(!flag)

P1=tab[a];

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。