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

📄 interrupt_a.asm

📁 把4*4键盘的输入码型在四位的七段数码管上显示出来
💻 ASM
字号:
;//****************************************************
;//实现功能:把键盘的输入码型在七段数码管上显示出来
;//目标板  :51开发板
;//****************************************************
p_key equ P1;宏定义键盘的接口是p1
led_date equ P0;定义数码管的数据输出是P0
choose_p equ P2;定义数码管的位选信号输出是P2
display_num_h equ 31h
display_num_l equ 30h
key_int equ 32h;中断键盘子程序扫描到的键值
extint_num equ 1;int1
extint_mode equ 0;低电平触发

;/////////////////////////////////////////////////////////
    org 00h
	ajmp main
    org 13h
    	ljmp interrupt_1

    org 30h
main:
	mov sp,#50h
	mov key_int,#0
	mov R7,#extint_num
	mov R6,#extint_mode
	call extint_init 
	setb EA
main_0:	
	mov r7,#0
	mov r6,key_int
        call display  
	ajmp main_0
;//****************外部中断初始化函数******************
;//描    述:外部的中断初始化
;//入口参数:R7(外部中断口,0=外部中断0,1=外部中断1)
;//         R6(中断触发方式,0=低电平触发,1=边沿触发)
;//返回参数:无
;//注意:    无
;//设计人:y
;//最后修改:时间(2006.5.1)修改人(y)
;//****************************************************
extint_init:
	cjne R7,#0,extinit_1
	mov a,#0FAh
	anl a,TCON;清int0的IE0,IT0
	orl  a,R6
	mov TCON,a
	setb EX0
extinit_1:
	cjne R7,#1,extinit_2
	mov a,#0F5h
	anl a,TCON;清int1的IE1,IT1
	orl  a,R6
	mov TCON,a
	setb EX1
extinit_2:
	ret

;//******************按键扫描函数**********************
;//描    述:对4*4键盘进行扫描,程序只适合4*4键盘使用,
;//	     键盘占用一组完整的i/o口,在使用这个程序前
;//	     要宏定义p_key为用户实际连接键盘的i/o口 
;//	     #define p_key Pn;//(n=0、1、2、3)
;//入口参数:无
;//返回参数:若有检测到按键就返回按键的编号,否则返回0xff
;//         由a返回
;//设计人:y
;//最后修改:时间(2006.5.1)修改人(y)
;//****************************************************
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)*机器周期
;//出口参数:无
;//设计人:y
;//最后修改:时间(2006.5.1)  修改人(y)
;//****************************************************
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).
;//返回参数:无
;//设计人:y
;//最后修改:时间(2006.5.1)修改人(y)
;//****************************************************
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返回
;//设计人:y
;//最后修改:时间(2006.5.1)修改人(y)
;//****************************************************
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
;//****************外部中断1处理函数*******************
;//描    述:外部中断1处理子程序
;//入口参数:无
;//返回参数:无
;//设计人:y
;//最后修改:时间(2006.5.1)修改人(y)
;//****************************************************
interrupt_1:
	push acc
	push psw
	call read_key
	mov key_int,a
	jnb p3.3,$
	pop psw
	pop acc
	reti
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -