/************主 程序*************/
void main(void)
{
void tkey(void);
void led(void);
void delay(int);
SCON=0x00;
TI=0;
while(TURE)
{
Tkey();
led();
delay(2000);
}
}
/********矩键查寻键值4*4程序******/按键为P1.0---P1.7
void Tkey(void)
{
uchar readkey;//rereadkey;
uchar x_temp,y_temp;
P1=0x0f;
x_temp=P1&0x0f;
if(x_temp==0x0f) goto keyout;
P1=0xf0;
y_temp=P1&0xf0;
readkey=x_temp|y_temp;
readkey=~readkey;
switch(readkey)
{
case 0x11:key=0; break;
case 0x21:key=1; break;
case 0x41:key=2; break;
case 0x81:key=3; break;
case 0x12:key=4; break;
case 0x22:key=5; break;
case 0x42:key=6; break;
case 0x82:key=7; break;
case 0x14:key=8; break;
case 0x24:key=9; break;
case 0x44:key=10;break;
case 0x84:key=11;break;
case 0x18:key=12;break;
case 0x28:key=13;break;
case 0x48:key=14;break;
case 0x88:key=15;break;
default: key=16;break;
}
keyout:_nop_();
}
/************显示程序*************/
void led(void)
{uchar code LEDValue[]=
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0-9
uchar data num[6];
uchar k;
num[0]=0;
num[1]=0;
num[2]=0;
num[3]=0;
num[4]=key/10;
num[5]=key-(key/10)*10;
for(k=0;k<=5;k++)
{
SBUF=LEDValue[num[5-k]];
while(TI==0);
TI=0;
}
}
/************延时程序*************/
void delay(del)
{
for(del;del>0;del--);
}
;伪定义
KEYBUF EQU 30H ;键值暂存单元,查表时用
;*************************************
;* *
;* 主程序和中断程序入口 *
;* *
;*************************************
ORG 0000H ;程序执行开始地址
AJMP MAIN ;跳至MAIN执行
;*************************************
;* *
;* 主 程 序 *
;* *
;*************************************
ORG 0040H
MAIN: MOV P1,#0FFH
MOV P3,#0FFH
LCALL KEYSCAN ;主体程序。调用查键子程序
LJMP MAIN ;转MAIN循环
NOP ;软件陷阱
NOP
NOP
LJMP MAIN
;*************************************
;* *
;* 键盘工作子程序(4 * 5 阵列) *
;* 接口为2051的P3和P1口 *
;*************************************
KEYSCAN:MOV P3,#0FFH ;清P3口,初始化键低电平有效
CLR P3.2 ;清P3.2口
MOV A,P1 ;读P1口状态
ANL A,#0FH ;清高4位,保留低四位低电平有效
XRL A,#0FH ;异或相同则为0不同结果为1,为0则表;示无键被按下(这一行)
JZ NOKEY1 ;为0则转下一行键值处理
LCALL DL10MS ;有键按下则延时10ms再测一次抗干扰
MOV A,P1
ANL A,#0FH
XRL A,#0FH
JZ NOKEY1 ;是干扰则转下一行键值处理程序
MOV A,P1
ANL A,#0FH ;保留低四?
KB1: CJNE A,#0EH,KB2 ;如果值为#0E则为P1.4与P1.0组合的键
MOV KEYBUF,#0 ;赋键值
LJMP KEYWORK ;转键处理
KB2: CJNE A,#0DH,KB3 ;如果值为#0D则为P1.4与P1.1组合的键
MOV KEYBUF,#1
LJMP KEYWORK
KB3: CJNE A,#0BH,KB4 ;如果值为#0B则为P1.4与P1.2组合的
MOV KEYBUF,#2
LJMP KEYWORK
KB4: CJNE A,#07H,KB5 ;如果值为#07则为P1.4与P1.3组合的
MOV KEYBUF,#3
LJMP KEYWORK
KB5: NOP
;
NOKEY1: MOV P3,#0FFH
CLR P3.3
MOV A,P1
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
LCALL DL10MS
MOV A,P1
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
MOV A,P1
ANL A,#0FH
CJNE A,#0EH,KB6
MOV KEYBUF,#4
LJMP KEYWORK
KB6: CJNE A,#0DH,KB7
MOV KEYBUF,#5
LJMP KEYWORK
KB7: CJNE A,#0BH,KB8
MOV KEYBUF,#6
LJMP KEYWORK
KB8: CJNE A,#07H,KB9
MOV KEYBUF,#7
LJMP KEYWORK
KB9: NOP
;