org 0000h
ljmp start
org 0100h
start:mov sp,#60h
mov dptr,#szlg ;8279的初始化
mov a,#0d1h ;1101,0001 ca位总清除,显示ram都置0
movx @dptr,a ;清显示器,清fifo
nop
nop
loop: movx a,@dptr ;读状态字
jb acc.7,loop ;当最高位为1时,表明还没有清完显示器ram
mov a,#34h ;当清完时,开始分频
movx @dptr,a ;五分频
mov a,#00h ;000,10,000 右端输入,8字符显示。
mov r1,#40h
movx @dptr,a
main: jb p3.3,main ;这里永乐int1作irq检测
lcall key
sjmp main
;键盘子程序,16键输入,6led显示人机接口
key: mov dptr,#szlg
mov a,#40h ;010,00000写‘读扫描键值命令’,按键顺序读取,fifo
movx @dptr,a
mov dptr,#dzlg ;数据口地址
movx a,@dptr ;读扫描键值,从fiforam送数据口,8字节,顺序读取
anl a,#3fh ;取低六位,高三位为扫描码,低三位为回送码,均为编码值
mov dptr,#ktab ;有序数编码转换表首址
movc a,@a+dptr ;查出实际数字0-----f
mov @r1,a
inc r1
mov r0,#30h ;r0作键值寄存器指针
mov r2,#8
data1:xch a,@r0 ;将键值暂存30单元---x8
inc r0
djnz r2,data1
lcall dir
ret
;显示子程序
dir:setb rs1
mov dptr,#szlg ;写显示命令
mov a,#90h ;1001,0000
movx @dptr,a ;ram 地址初值为0000,自加方式
mov p2,#7fh ;这两条指令给了显示地址
mov r1,#0feh
mov dptr,#dtab ;将实际数转成显示码,赋首址
mov r7,#8
mov r0,#30h
dir1:mov a,@r0 ;将键值送a
movc a,@a+dptr
movx @r1,a ;得到相应显示码
inc r0 ;指向下一码值
djnz r7,dir1
clr rs1
ret
;dtab:显示码表
dtab: db 3fh,06h,5bh,4fh ;1,2,3,4
db 66h,6dh,7dh,07h ;4,5,6,7
db 7fh,6fh,77h,80h ;8,9,a(*),b(.)
db 39h,5eh,79h,71h ;c,d,e,f(#)
db 00h
;ktab:键码转换表
ktab: db 01h,01h,01h,01h,01h,01h,01h,01h
db 02h,02h,02h,02h,02h,02h,02h,02h
db 03h,03h,03h,03h,00h,00h,00h,00h
db 04h,04h,04h,04h,00h,00h,00h,00h
end
---- musica