4键六位数显示程序
org 00h
start: MOV r4,#06h
MOV r0,#30h
clear: MOV @r0,#00h
inc r0
djnz r4,clear
l1: MOV r3,#0f7h ;扫描初值(P13=0)
MOV r1,#00h ;取码指针
l2: MOV a,r3 ;开始扫描
MOV p1,a ;将扫描值输入至P1
MOV a,p1 ;读入P1值,判断是否有键按下?
MOV r4,a ;存入R4,以判断是否开放
setb c ;C=1
rrc a ;扫描下一行(P13~P10)
MOV r3,a ;存回扫描寄存器
jc l2 ;C=1?是则P10尚未扫描到
jmp l1 ;C=0则4行已扫描完毕
keyin: MOV r7,#60 ;消除抖动
d2: MOV r6,#248
djnz r6,$
djnz r7,d2
d3: MOV a,p1 ;读入P1值
xrl a,r4 ;与上次读入值作比较
jz d3 ;ACC=0则相等,表示按钮未放
MOV a,r1 ;按钮已放开,取码指针载入累加器
MOV dptr,#table ;数据指针指到TABLE
MOV c a,@a+dptr ;至TABLE取码
xch a,30h ;旧(30H)值存入(31H)
xch a,31h ;旧(31H)值存入(32H)
xch a,32h ;旧(32H)值存入(33H)
xch a,33h ;旧(33H)值存入(34H)
xch a,34h ;旧(34H)值存入(35H)
call disp ;调用显示子程序
jmp l1
disp: MOV a,35h
add a,#50h ;D6数据值加上74138扫描值
MOV p0,a ;显示D6
call delay ;扫描延时
MOV a,34h
add a,#40h ;显示数据值加上74138扫描值
MOV p0,a ;显示D5
call delay ;扫描延时
MOV a,33h
add a,#30h ;D4数据值加上74138扫描值
MOV p0,a ;显示D4
call delay ;扫描延时
MOV a,32h
add a,#20h ;D3数据值上加上74138
MOV p0,a ;显示D3
call delay ;扫描延时
MOV a,30h
add a,#00h ;D1数据值加上74138扫描值
MOV p0,a ;显示D1
call delay ;扫描延时
delay: MOV r7,#06 ;显示器扫描时间
d1: MOV r6,#248 ;
djnz r6,$ ;
djnz r7,d1 ;
ret
org 300h
table: db 0ch,08h,04h,00h ;
db 0dh,09h,05h,01h ;
db 0eh,0ah,06h,02h ;
db 0fh,0bh,07h,03h ;
end