⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 display.asm

📁 电子开发网培训用的51单片机内部培训代码
💻 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 + -