一个晚上坚持写代码和调试,一步一步前进,终于通过四个阶段完成了在有8255扩展接口的51开发板上调试成功我自己编的4*4矩阵键盘扫描并在led上显示键值的汇编程序(几乎100行代码)。。。好欣慰。。。今晚睡个好觉吧。。。
org 0000h
ljmp start
org 0030h
start:
mov dptr,#6fffh
mov a,#81h
movx @dptr,a ;8255设置
main:
mov dptr,#0fffh
mov a,#0ffh
movx @dptr,a ;关显示
mov dptr,#4fffh
mov a,#00h
movx @dptr,a ;所有行值拉低
mov dptr,#4fffh
movx a,@dptr ;读取列值
mov b,a
cjne a,#0fh,m ;判断是否有键按下 ,有就转消抖
ljmp main ;没有就继续扫描
m:
lcall delay ;延时消抖
h1: ;扫描第一行
mov dptr,#4fffh
mov a,#0efh
movx @dptr,a
mov dptr,#4fffh
movx a,@dptr ;读取列值
anl a,#0fh
cjne a,b,h2
ljmp x1
x1: mov b,#0e0h
orl a,b
mov dptr,#0fffh
movx @dptr,a
ljmp main
h2: ;扫描第二行
mov dptr,#4fffh
mov a,#0dfh
movx @dptr,a
mov dptr,#4fffh
movx a,@dptr ;读取列值
anl a,#0fh
cjne a,b,h3
ljmp x2
x2: mov b,#0d0h
orl a,b
mov dptr,#0fffh
movx @dptr,a
ljmp main
h3: ;扫描第三行
mov dptr,#4fffh
mov a,#0bfh
movx @dptr,a
mov dptr,#4fffh
movx a,@dptr
anl a,#0fh
cjne a,b,h4
ljmp x3
x3: mov b,#0b0h
orl a,b
mov dptr,#0fffh
movx @dptr,a
ljmp main
h4: ;扫描第四行
mov dptr,#4fffh
mov a,#7fh
movx @dptr,a
mov dptr,#4fffh
movx a,@dptr
anl a,#0fh
cjne a,b,default
ljmp x4
x4: mov b,#70h
orl a,b
mov dptr,#0fffh
movx @dptr,a
ljmp main
default: ;都不是
mov b,#0ffh
orl a,b
mov dptr,#4fffh
movx @dptr,a
ljmp main
delay:
mov r0,#3
d: mov r1,#225
djnz r1,$
djnz r0,d
ret
end