免费电子智能抢答器(单片机)(一)信息工(2)
2013-05-21 01:16
导读:MOVR0,A;键号送显示缓冲区 INCR0 DJNZR7,L1;3位数值输入完否?未完继续,否则返回 POPACC POPPSW CLRRS1 RET KEYSCAN:MOVR3, #0F7H;扫描初值(P1.3=0) MOVR1,#00H;取码指针 L3:MO
MOV R0,A ;键号送显示缓冲区
INC R0
DJNZ R7,L1 ;3位数值输入完否?未完继续,否则返回
POP ACC
POP PSW
CLR RS1
RET
KEYSCAN:MOV R3, #0F7H ;扫描初值(P1.3=0)
MOV R1, #00H ;取码指针
L3: MOV A, R3 ;开始扫描
MOV P1, A ;将扫描值输出至P1
MOV A, P1 ;读入P1值,判断是否有键按下
MOV R4, A ;存入R4,以判断按键是否放开
SETB C ;C=1
MOV R5, #04H ;扫描P1.4~P1.7
L4: RLC A ;将按键左移一位
JNC KEYIN ;判断C=0?有键按下则C=0,跳至KEYIN
INC R1 ;C=1,则无键按下,将取码指针值加1
DJNZ R5, L4 ;4列扫描完毕了吗?
MOV A, R3 ;扫描值载入
SETB C ;C=1
RRC A ;扫描下一行(P1.3~P1.0)
MOV R3, A ;存回扫描寄存器
JC L3 ;C=1?是则P1.0尚未扫描到
SJMP KEYSCAN ;C=0,则四行已扫描完毕
KEYIN: MOV R7, #60 ;延时消除抖动
D2: MOV R6, #248 ;
DJNZ R6, $ ;
DJNZ R7, D2 ;
D3: MOV A, P1 ;延时后再读入P1值
(科教范文网http://fw.NSEAC.com编辑发布)
XRL A, R4 ;与上次读入值作比较
JZ D3 ;A=0,表示按键未放,等待按键释放
MOV A, R1 ;按键已放开,取码指针载入累加器
MOV DPTR,#TABLE ;键盘码表首地址送DPTR
MOVC A, @A+DPTR ;查键码
RET ;返回
TABLE: DB 00H,01H,02H,03H ;键码安排表与键盘相同
DB 04H,05H,06H,07H
DB 08H,09H,0AH,0BH
DB 0CH,0DH,0EH,0FH
ORG 0200H
DISPLAY:MOV R0, #DBUF ;串口静态显示子程序
MOV R2,#3 ;显示3位数码
MOV DPTR,#SEGTAB;
DISP: MOV A,@R0 ;
MOVC A,@A+DPTR ;取字段码
MOV SCON,#0 ;置串口工作方式0
MOV SBUF,A ;开始发送
JNB TI,$ ;等待发送完毕
CLR TI ;发送完毕,标志位清零
INC R0 ;缓冲单元地址增1
DJNZ R2,DISP ;三位数码发送完否?
RET ;发送完毕,则返回
SEGTAB: DB 0FCH,60H,0DAH,0F2H ;0,1,2,3(共阳极字段码表)
DB 66H,0B6H, 0BEH,0E0H ;4,5,6,7
DB 0FEH,0F6H,0EEH,3EH ;8,