免费电子智能抢答器(单片机)(一)信息工(3)
2013-05-21 01:16
导读:9,A,B DB9CH,7AH,9EH,8EH ;C,D,+,- END DBUFEQU30H;三位显示缓冲区首址 ORG0000H AJMPMAIN ORG0030H MAIN:MOVSP,#60H ACALLKEYSCAN;调用键盘扫描子程序判断是加分或减分 CJNEA,#0EH,NEXT2
9,A,B
DB 9CH,7AH,9EH,8EH ;C,D,+,-
END
DBUF EQU 30H ;三位显示缓冲区首址
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN: MOV SP,#60H
ACALL KEYSCAN ;调用键盘扫描子程序判断是加分或减分
CJNE A,#0EH,NEXT2 ;不是加分键,则转移判断是减分键?
NEXT1: ACALL KEYSZ ;是加分键,调用键盘设置子程序
ACALL DISPLAY ;调用串口静态显示子程序
SJMP MAIN
NEXT2: CJNE A,#0FH,MAIN ;都不是,则转MAIN
AJMP NEXT1 ;是减分键,调用键盘设置子程序
ORG 0100H
KEYSZ: PUSH PSW ;键盘设置子程序
PUSH ACC
SETB RS1
MOV R0,#DBUF ;R0指向显示缓冲区首地址
MOV R7,#3 ;设置键盘输入位数
L1: CLR RS1
ACALL KEYSCAN ;调用键盘扫描子程序取按下键的键号
SETB RS1
CJNE A,#0AH,L2 ;键入数合法性检测(是否大于9)
L2: JNC L1 ;大于9,重新键入
MOV R0,A ;键号送显示缓冲区
INC R0
DJNZ R7,L1 ;3位数值输入完否?未完继续,否则返回
POP ACC
POP PSW
CLR RS1
RET
KEYSCAN: MOV R3, #0F7H ;扫描初值(P0.3=0)
MOV R1, #00H ;取码指针
L3: MOV A, R3 ;开始扫描
(科教作文网 zw.nseac.com整理)
MOV P0, A ;将扫描值输出至P1
MOV A, P0 ;读入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, P0 ;延时后再读入P1值
XRL A, R4 ;与上次读入值作比较
JZ D3 ;A=0,表示按键未放,等待按键释放
MOV A, R1 ;按键已放开,取码指针载入累加器
MOV DPTR,#TABLE ;键盘码表首地址送DPTR
MOVC A, @A+DPTR ;查键