MOV A,#0D1H ;置清显示命令字 MOVX @DPTR,A ;送清显示命令 WEIT:MOVX A,@DPTR ;读状态
JB ACC.7,WEIT ;等待清显示RAM结束 MOV A,#34H ;置分频系数,晶振12MHz MOVX @DPTR,A ;送分频系数 MOV A,#00H ;置键盘/显示命令 MOVX @DPTR,A ;送键盘/显示命令 MOV IE,#84H ;允许8279中断 RET
显示子程序如下:
DIS:MOV DPTR,#7FFFH ;置8279命令/状态口地址 MOV R0,#30H ;字段码首地址 MOV R7,#08H ;8位显示 MOV A,#90H ;置显示命令字 MOVX @DPTR,A ;送显示命令 MOV DPTR,#7FFEH ;置数据口地址 LP:MOV A,@R0 ;取显示数据 ADD A,#6 ;加偏移量
MOVC A,@A+PC ;查表,取得数据的段码 MOVX @DPTR,A ;送段码显示 INC R0 ;调整数据指针 DJNZ R7,LP ; RET
SEG:DB 3FH,06H,5BH,4FH,66H,6DH ;字符0、1、2、3、4、5段码
44
DB 7DH,07H,7EH,6FH,77H,7CH ;字符6、7、8、9、A、B段码 DB 39H,5EH,79H,71H,73H,3EH ;字符C、d、E、F、P、U段码 DB 76H,38H,40H,6EH,FFH,00H ;字符H、L、-、Y、“空”段码
键盘中断子程序如下:
KEY:PUSH PSW PUSH DPL PUSH DPH PUSH ACC PUSH B SETB PSW.3
MOV DPTR,#7FFFH ;置状态口地址 MOVX A,@DPTR ;读FIFO状态 ANL A,#0FH ; JZ PKYR ;
MOV A,#40H ;置读FIFO命令 MOVX @DPTR,A ;送读FIFO命令 MOV DPTR,#7FFEH ;置数据口地址 MOVX A,@DPTR ;读数据
LJMP KEY1 ;转键值处理程序 PKYR: POP B POP ACC POP DPH POP DPL
45
POP PSW
RETI ;
KEY1: … … ;键值处理程序 键盘程序清单:
KEY1: ACALL KS1 ; 有无键按下子程序 JNZ LK1 ;有键按下,转去抖延时
AJMP
KEY1
;无键按下,继续扫描
LK1: ACALL DELA12 ;12ms延时程序调用 ACALL KS1 ;判断键是否真正按下 JNZ LK2 ;有键按下,转逐列扫描 AJMP
KEY1
;无键按下,继续扫描
LK2: MOV R2,#0FEH ;设置首列扫描字 MOV R4,#00H
;保存首列号
LK4: MOV DPTR,#7F01H;列扫描字送至PA口 MOV
A,R2
MOVX
@DPTR,A
INC DPTR ;指向PC口
INC DPTR MOVX
A,@DPTR ;读入行状态
JB ACC.0,LONE ;第0行无键按下,转LONE MOV A,#00H ;有键按下,设置行首键号 AJMP
LKP ;转求键号
LONE: JB ACC.1,LTWO ;第1行无键按下,转LTWO MOV A,#08H ;有键按下,设置行首键号 AJMP
LKP ;转求键号
46
LTWO: JB ACC.2,LTHR ;第2行无键按下,转LTHR MOV A,#10H ;有键按下,设置行首键? AJMP LKP ;转求键号
LTHR: JB ACC.3,NEXT ;第3行无键按下,查下一列 MOV A,#18H ;有键按下,设置行首键 LKP: ADD A,R4 ;求键号,键号=行首键号+列号 PUSH
ACC ;保护键号
LK3: ACALL KS1 ;等待键释放
JNZ LK3 ;键未释放,继续等待 POP ACC ;键释放,键号送A AJMP
OVER
;键扫描结束
NEXT: INC R4 ;列号加1,指向下一列 MOV A,R2
;判断8列扫描完否
JNB ACC.7,KND ;8列扫描完,继续 RL A ;扫描字左移一位 MOV R2,A ;送扫描字
AJMP
LK4 ;转下一列扫描
KND: AJMP
KEY1
OVER: RET ;键扫描结束 KS1: MOV DPTR,#7F01H
;指向PA口
MOV A,#00H ;设置扫描字 MOVX
@DPTR,A
;扫描字送PA口
INC DPTR ;指向PC口
INC DPTR MOVX
A,@DPTR ;读入PC口状态
47
CPL ;以高电平表示有键按下 ANL A,#0FH ;屏蔽高4位 RET
初始化程序如下:
INIT:MOV DPTR,#7FFFH ;置8279命令/状态口地址 MOV A,#0D1H ;置清显示命令字 MOVX @DPTR,A ;送清显示命令 WEIT:MOVX A,@DPTR ;读状态
JB ACC.7,WEIT ;等待清显示RAM结束 MOV A,#34H ;置分频系数,晶振12MHz MOVX @DPTR,A ;送分频系数 MOV A,#00H ;置键盘/显示命令 MOVX @DPTR,A ;送键盘/显示命令 MOV IE,#84H ;允许8279中断 RET 显示子程序如下:
DIS:MOV DPTR,#7FFFH ;置8279命令/状态口地址 MOV R0,#30H ;字段码首地址 MOV R7,#08H ;8位显示 MOV A,#90H ;置显示命令字 MOVX @DPTR,A ;送显示命令 MOV DPTR,#7FFEH ;置数据口地址 LP:MOV A,@R0 ;取显示数据 ADD A,#6 ;加偏移量
MOVC A,@A+PC ;查表,取得数据的段码 MOVX @DPTR,A ;送段码显示
48