利用8279可实现对键盘/显示器的自动扫描,以减轻CPU负担,并具有显示稳定、程序简单、不会出现误动作等特点。
本系统中8279的状态/命令口地址位8701H;数据口地址位8700H。
示例程序运行将显示"8279 --",并等待按键输入,将键值显示在数码管上(只响应0-F按键)。
源代码:
Z8279 EQU 08701H ;8279 状态/命令口地址
D8279 EQU 08700H ;8279 数据口地址
LEDMOD EQU 10H ;右端输入 八位字符显示
;外部译码键扫描方式,双键互锁
LEDFEQ EQU 38H ;扫描速率
LEDCLS EQU 0D1H ;清除
LEDWR0 EQU 80H ;设定的将要写入的显示RAM地址
ORG 0000H
AJMP START
ORG 0040H
START:
MOV SP,#60H
LCALL INIT8279 ;初始化8279
WAIT: MOV DPTR,#Z8279
MOVX A,@DPTR
ANL A,#0FH
JZ WAIT
MOV A,#40H
MOVX @DPTR,A
MOV DPTR,#D8279
MOVX A,@DPTR
ANL A,#3FH
MOV R4,#00H
MOV R5,A
LCALL DISLED
SJMP WAIT
INIT8279: ;8279初始化子程序
PUSH DPH ;保存现场
PUSH DPL
PUSH ACC
LCALL DELAY ;延时
MOV DPTR ,#Z8279
MOV A,#LEDMOD ;置8279工作方式
MOVX @DPTR,A
MOV A,#LEDFEQ ;置键盘扫描速率
MOVX @DPTR,A
MOV A,#LEDCLS ;清除 LED 显示
MOVX @DPTR,A
LCALL DELAY ;延时
MOV DPTR,#Z8279
MOV A,#90H
MOV DPTR,#D8279
MOV A,#40H
MOVX @DPTR,A
MOV A,#40H
MOVX @DPTR,A
MOV A,#0H
MOVX @DPTR,A
MOV A,#0H
MOVX @DPTR,A
MOV A,#0EFH
MOVX @DPTR,A
MOV A,#27H
MOVX @DPTR,A
MOV A,#5BH
MOVX @DPTR,A
MOV A,#7FH
MOVX @DPTR,A
POP ACC ;恢复现场
POP DPL
POP DPH
RET
;显示字符子程序
;输入: R4,位置 R5,值
DISLED: PUSH DPH ;保存现场
PUSH DPL
PUSH ACC
MOV A,#LEDWR0 ;置显示起始地址
ADD A,R4 ;加位置偏移量
MOV DPTR,#Z8279
MOVX @DPTR,A ;设定显示位置
MOV DPTR,#LEDSEG ;置显示常数表起始位置
MOV A,R5
MOVC A,@A+DPTR ;查表
MOV DPTR,#D8279
MOVX @DPTR,A ;显示数据
POP ACC ;恢复现场
POP DPL
POP DPH
RET
DELAY: ;延时子程序
PUSH 0 ;保存现场
PUSH 1
MOV 0,#0H
DELAY1: MOV 1,#0H
DJNZ 1,$
DJNZ 0,DELAY1
POP 1 ;恢复现场
POP 0
RET
LEDSEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;'0,1,2,3,4,5,6,7'
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;'8,9,A,B,C,D,E,F'
DB 6DH,02H,08H,00H,59H,0FH,76H ;'U,-,_, ,I,O,P, '
END
评论