;8279初始化程序
ORG 0060H
INI79: MOV DPTR,#7FFFH ;清除8279命令
MOV A,#0DDH
MOVX @DPTR,A
WNDU: MOVX A,@DPTR ;等待8279清除结束
JB ACC.7,WNDU
MOV A,#10H ;设置键盘扫描方式为双键互锁
MOVX @DPTR,A
MOV A,#34H ;时钟100KHz
MOVX @DPTR,A
MOV IE,#81H ;允许8279中断
RET
;;键输入中断服务程序
PKEYI: CLR EA
PUSH PSW
PUSH DPL
PUSH DPH
PUSH ACC
PUSH B
SETB PSW.3 ;选工作寄存器区1
MOV DPTR,#7FFFH ;读FIFO状态字
MOVX A,@DPTR
ANL A,#0FH
JZ PKYR ;判FIFO中是否有数据
MOV A,#40H ;读FIFO命令—〉8279
MOVX @DPTR,A
MOV DPTR,#7EFFH
MOVX A,@DPTR ;读数据
MOV 50H,#0
MOV R2,A
DATA0: CJNE R2,#38H,DATA1;判断键代码,确定键值
MOV R0,#0
AJMP RDIR
AJMP PKYR
DATA1: CJNE R2,#30H,DATA2
MOV R0,#1
AJMP RDIR
AJMP PKYR
DATA2: CJNE R2,#28H,DATA3
MOV R0,#2
AJMP RDIR
AJMP PKYR
DATA3: CJNE R2,#20H,DATA4
MOV R0,#3
AJMP RDIR
AJMP PKYR
DATA4: CJNE R2,#18H,DATA5
MOV R0,#4
AJMP RDIR
AJMP PKYR
DATA5: CJNE R2,#10H,DATA6
MOV R0,#5
AJMP RDIR
AJMP PKYR
DATA6: CJNE R2,#08H,DATA7
MOV R0,#6
AJMP RDIR
AJMP PKYR
DATA7: CJNE R2,#00H,DATA8
MOV R0,#7
AJMP RDIR
AJMP PKYR
DATA8: CJNE R2,#39H,DATA9
MOV R0,#8
AJMP RDIR
AJMP PKYR
DATA9: CJNE R2,#31H,RDIR1
MOV R0,#9
AJMP RDIR
PKYR: POP B
POP ACC
POP DPH
POP DPL
POP PSW
RETI
RDIR1: MOV DPTR,#7FFFH
MOV A,#90H ;写显示RAM命令
MOVX @DPTR,A
MOV DPTR,#7EFFH
MOV A,#79H ;显示E,表示出错
MOVX @DPTR,A
SETB EA
LJMP PKYR
;;显示器更新程序
RDIR: MOV DPTR,#7FFFH ;写显示RAM命令—〉8279
MOV A,#90H
MOVX @DPTR,A
MOV A,#16H ;设显示工作方式为右入8位显示
MOVX @DPTR,A
MOV A,#0DFH ;清除命令,使IRQ复位
MOVX @DPTR,A
MOV DPTR,#7EFFH
MOV 50H,R0
MOV R0,#50H
RDLO: MOV A,@R0 ;取显示数据
ADD A,#6
MOVC A,@A+PC ;查表转换为段码数据—〉8279
MOVX @DPTR,A
SETB EA
LJMP PKYR
SEG: DB 04H,9FH,42H,03H,91H,21H,20H,8FH,00H,01H;;根据硬件线路设计的字形数据
以下是引用石月在2003-9-1 9:27:11的发言: 谢谢,我已经按单步调了,发现以下问题,求教谢谢,其实我就是用单步调的,调后我发现键的确定和键值输入都正确的,而且显示的值也查表读取正确了,但显示的时候却出问题了。他有时候不显示,显示出来时显示位却是不定的,是不是8279芯片有问题?而且无论我定义左入显示还是右入显示他都是从左边开始的,为什么?还有中断跳入也有问题,有时有,有时没…… |
以下是引用石月在2003-9-1 11:27:35的发言: 可是设置后还是不起作用阿 |
以下是引用石月在2003-9-1 11:27:35的发言: 可是设置后还是不起作用阿 |