📄 display.asm
字号:
;//****************************************************
;//实现功能:把键盘输入的键盘码,用led显示出来
;//目标板:至强51开发板
;//开发商 :电子开发网www.dzkf.com (专业提供开发方案,
;// 电子元器件网上订购,单片机培训服务)
;//对开发板有什么疑问,请上我们的论坛bbs.dzkf.com探讨
;//****************************************************
p_key equ P1
led_date equ P0
choose_p equ P2
display_num_h equ 31h
display_num_l equ 30h
org 00h
ajmp main
org 30h
main:
mov sp,#50h
mov display_num_h,#0;//初始化display_num_h为0
mov display_num_l,#0;//初始化display_num_l为0
main_1:
call read_key;//调用键盘扫描子程序
mov r7,#0;
mov r6,a
call display;调用扫描显示子程序
ajmp main_1;循环
;//******************按键扫描函数**********************
;//描 述:对4*4键盘进行扫描,程序只适合4*4键盘使用,
;// 键盘占用一组完整的i/o口,在使用这个程序前
;// 要宏定义p_key为用户实际连接键盘的i/o口
;// #define p_key Pn;//(n=0、1、2、3)
;//入口参数:无
;//返回参数:若有检测到按键就返回按键的编号,否则返回0xff
;// 由a返回
;//设计人:ycj
;//最后修改:时间(2006.4.26)修改人(ycj)
;//****************************************************
read_key:
push b
push psw
mov p_key,#0ffh
mov p_key,#0f0h
mov a,p_key
;判断是否有键按下
cjne a,#0f0h,rk1
;没有则返回0xff
ajmp no_key
;有按键按下,延时去抖
rk1:
mov r1,#20
call delay_time
mov p_key,#0f0h
mov a,p_key
;确认是否有键按下
cjne a,#0f0h,rk2
;没有则返回0xff
ajmp no_key
;确认是有按键按下, 判断哪行按键按下
rk2:
jnb ACC.4,rk4
jnb ACC.5,rk5
jnb ACC.6,rk6
jnb ACC.7,rk7
;没有检测到按键
ajmp no_key
rk4:
mov b,#0
mov p_key,#0efh
ajmp rk_next
rk5:
mov b,#4
mov p_key,#0dfh
ajmp rk_next
rk6:
mov b,#8
mov p_key,#0bfh
ajmp rk_next
rk7:
mov b,#12
mov p_key,#07fh
rk_next:
mov a,p_key
jnb ACC.0,rk_next_0
jnb ACC.1,rk_next_1
jnb ACC.2,rk_next_2
jnb ACC.3,rk_next_3
;没有检测到按键
ajmp no_key
rk_next_0:
mov a,#0
ajmp get_key
rk_next_1:
mov a,#1
ajmp get_key
rk_next_2:
mov a,#2
ajmp get_key
rk_next_3:
mov a,#3
;返回检测到的按键编号
get_key:
add a,b
pop psw
pop b
ret
;没检测到按键,返回0xff
no_key:
mov a,#0ffh
pop psw
pop b
ret
;//******************时间延迟函数**********************
;//描 述:用指令实现延时一段时间
;//入口参数:r1,为时间延迟参数,延时(r1*500+r1*2)*机器周期
;//出口参数:无
;//设计人:ycj
;//最后修改:时间(2006.4.26) 修改人(ycj)
;//****************************************************
delay_time:
push acc
push psw
mov a,#250
loop1:
djnz acc,loop1
mov a,#250
djnz r1,loop1
pop psw
pop acc
ret
;//***************七段数码管显示函数*******************
;//描 述:对四位的扫描型七段数码管进行扫描显示,在使
;// 用前要定义两个个全局变量display_num_h(显示
;// 值的高位(0~99))和display_num_l(显示值的低
;// 位(0~99));
;// display_num_h equ 31h
;// display_num_l equ 30h
;//入口参数: r7,r6,要显示的数字(0-9999),r7为高位(0~99),
;// r6为低位(0~99).
;//返回参数:无
;//设计人:ycj
;//最后修改:时间(2006.4.26)修改人(ycj)
;//****************************************************
display:
push acc
push b
push psw
mov a,r7
subb a,#100
jnc dp1;//判断高位有没有超过99
mov a,r6
subb a,#100
jnc dp1;//判断低位有没有超过99
mov display_num_h,r7;//条件符合刷新display_num_h
mov display_num_l,r6;//条件符合刷新display_num_l
dp1:
setb choose_p.0
setb choose_p.1
setb choose_p.2
setb choose_p.3
mov a,display_num_h
mov b,#10
div ab
call change ;//显示千位
mov led_date,a
clr choose_p.0
mov r1,#5
call delay_time
setb choose_p.0
mov a,b ;//显示百位
call change
mov led_date,a
clr choose_p.1
mov r1,#5
call delay_time
setb choose_p.1
mov a,display_num_l
mov b,#10
div ab ;//显示十位
call change
mov led_date,a
clr choose_p.2
mov r1,#5
call delay_time
setb choose_p.2
mov a,b ;//显示个位
call change
mov led_date,a
clr choose_p.3
mov r1,#5
call delay_time
setb choose_p.3
pop psw
pop b
pop acc
ret
;//****************数字-码型转换函数*******************
;//描 述:把数字转换成七段码型,此程序仅配合共阳的七
;// 段数码管使用
;//入口参数:unsigned char i,要转换的数字(0-9),
;//返回参数:转换后的七段码型,0xff表示转换失败,由a返回
;//设计人:ycj
;//最后修改:时间(2006.4.26)修改人(ycj)
;//****************************************************
change:
push psw
cjne a,#0,ch1
;0码型
mov a,#0c0h
ajmp ch_ok
ch1:
cjne a,#1,ch2
;1码型
mov a,#0f9h
ajmp ch_ok
ch2:
cjne a,#2,ch3
;2码型
mov a,#0a4h
ajmp ch_ok
ch3:
cjne a,#3,ch4
;3码型
mov a,#0b0h
ajmp ch_ok
ch4:
cjne a,#4,ch5
;4码型
mov a,#099h
ajmp ch_ok
ch5:
cjne a,#5,ch6
;5码型
mov a,#092h
ajmp ch_ok
ch6:
cjne a,#6,ch7
;6码型
mov a,#082h
ajmp ch_ok
ch7:
cjne a,#7,ch8
;7码型
mov a,#0f8h
ajmp ch_ok
ch8:
cjne a,#8,ch9
;8码型
mov a,#080h
ajmp ch_ok
ch9:
cjne a,#9,ch_err
;9码型
mov a,#090h
ajmp ch_ok
;转换错误
ch_err:
mov a,#0ffh
ch_ok:
pop psw
ret
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -