📄 interrupt_a.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 + -