题: 四位数码管对外部中断0响应计数(汇编)
; 作者: xilinxue
; 日期: 2007.2.28
; 软件: Keil A51 V8.00
; 芯片: AT89X51
; 说明: 实验板实测通过,数码管为8位共阳
; 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!
;**************************************************************************
org 0000h
ajmp start
org 0003h ;外部中断0入口
ljmp int_0 ;跳到外部中断0的中断服务程序处
org 0030h
start: mov 30h,#0 ;30单元存储个位值
mov 31h,#0 ;31单元存储十位值
mov 32h,#0 ;32单元存储百位值
mov 33h,#0 ;33单元存储千位值
mov p2,#0xff ;关所有数码管
mov dptr,#table ;数码管段码表首址送入dptr
setb it0 ;外部中断0下降沿触发
setb ea ;开总中断
setb ex0 ;开外部中断0
lop: lcall display ;调用显示子程序
ajmp lop ;循环等待中断发生
int_0: ;外部中断0的中断服务程序
inc 30h ;个位值加1
mov a,30h ;个位值送入a
cjne a,#10,over ;个位未到10则结束此次循环
mov 30h,#0 ;个位到10清零
inc 31h ;十位值加1(个位到10的进位)
mov a,31h ;十位值送入a
cjne a,#10,over ;十位未到10则结束此次循环
mov 31h,#0 ;十位到10清零
inc 32h ;百位值加1(十位到10的进位)
mov a,32h ;百位值送入a
cjne a,#10,over ;百位未到10则结束此次循环
mov 32h,#0 ;百位到10清零
inc 33h ;千位值加1(百位到10的进位)
mov a,33h ;千位值送入a
cjne a,#10,over ;千位未到10则结束此次循环
mov 33h,#0 ;千位到10清零
over: reti ;中断返回
display: ;显示子程序
mov r0,#50 ;用于延长四位数的显示时间
d_lop:
mov a,30h ;取个位值
movc a,@a+dptr ;个位数对应的段码送入a中
mov p0,a ;段码送入P0口
mov p2,#0x7f ;开个位显示(P2.7口控制个位数码管)
lcall d_1ms ;延时1ms使四位数码管动态显示时能看清
mov a,31h ;取十位值
movc a,@a+dptr ;十位数对应的段码送入a中
mov p0,a ;段码送入P0口
mov p2,#0xbf ;开十位显示(P2.6口控制十位数码管)
lcall d_1ms ;延时1ms作用同上
mov a,32h ;取百位值
movc a,@a+dptr ;百位数对应的段码送入a中
mov p0,a ;段码送入P0口
mov p2,#0xdf ;开百位显示(P2.5口控制十位数码管)
lcall d_1ms ;延时1ms作用同上
mov a,33h ;取千位值
movc a,@a+dptr ;千位数对应的段码送入a中
mov p0,a ;段码送入P0口
mov p2,#0xef ;开千位显示(P2.4口控制十位数码管)
lcall d_1ms ;延时1ms作用同上
djnz r0,d_lop ;延长每个四位数的显示时间
ret
d_1ms: ;延时1ms子程序@12M(1.001ms)
mov r7,#250 ;1+(1+1+2)*250=1001
temp: nop
nop
djnz r7,temp
ret
table: db 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 ;段码表
; 0 1 2 3 4 5 6 7 8 9 对应内容
end