连接原理图
以下为汇编程序:
;工作过程:当INT0有中断脉冲输入时,开始对T0计数输入口的信号计数,
; 当INT1有中断信号时,停止对T0口的计数,并把此次计数值送显到五位LED管
LEDX EQU 30H ;指定轮流显示5位LED的轮流数表志寄存器
LED EQU P1 ;LED显示的输出口
LED01 BIT P1.7 ;个位共阴极数码管的公共端
LED02 BIT P3.7 ;十位
LED03 BIT P3.0 ;百位
LED04 BIT P3.1 ;千位
LED05 BIT P3.5 ;万位
LED1 EQU 31H ;待显示的个位计数数码值
LED2 EQU 32H ;...十位
LED3 EQU 33H ;...百位
LED4 EQU 34H ;...千位
LED5 EQU 35H ;...万位
X1 EQU 36H ;16进制计数值高位
X2 EQU 37H ;16进制计数值低位
;======================================================================================================
ORG 0000H
LJMP START
ORG 003H
LJMP RUNINT0
ORG 000BH
LJMP RUNT0
ORG 0013H
LJMP RUNINT1
ORG 001BH
LJMP RUNT1
ORG 50H
START: CLR A
MOV LEDX, A ;指定轮流显示5位LED的轮流数表志寄存器
MOV X1, A ;计数值初始清零
MOV X2, A
MOV LED1, A ;置初始显示计数值为00000
MOV LED2, A
MOV LED3, A
MOV LED4, A
MOV LED5, A
MOV TMOD, #15H ;设置T0为计数方式1,T1为定时方式1.
MOV IP, #00000100B ;INT1中断为高优先级
MOV IE, #10001001B ;开总中断及T1,INT0允许
MOV TH0, #00H ;置计数器0值
MOV TL0, #00H
MOV TH1, #0F8H ;重置T1初值4mS=0F830H(主频为6MHZ时,五位显示完毕共需20MS,即50HZ的显示频率
MOV TL1, #030H ;
SETB TR1
;#############################################################################################################################
;===================================================================================================================
; 主循环程序(也是按键查询程序)
MAIN: MOV R0, X1
MOV R1, X2
LCALL RUN5BCD
CLR TR1 ;暂时停止轮流数码显示的计时,以免误读正在转换中的不正确的显示值
MOV LED1, R2 ;存转换好的个位数码管值
MOV LED2, R3 ;..........十位
MOV LED3, R4
MOV LED4, R5
MOV LED5, R6
SETB TR1 ;恢复轮流数码显示的计时
;这里放用户的其它程序,比如按键查询等
;...............................
;................................
LJMP MAIN
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
; T0中断程序
;(假如计数值溢出)
RUNT0: CLR TR0
MOV TH0, #0FFH ;
MOV TL0, #0FFH ; ;
MOV X1, #0FFH ;计数器溢出,置最大值
MOV X2, #0FFH
RETI
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$444
; T1中断程序
;(4mS到了显示一位LED)(5位数码管轮流显示的定时器每隔4mS轮流点亮1个数码管,)
RUNT1: MOV TL1, #0F8H ;重置T1初值4mS=0F830H(主频为6MHZ时,五位显示完毕共需20MS,即50HZ的显示频率
MOV TH1, #30H ;
PUSH ACC ;
PUSH PSW ;
MOV A, #05H
DEC LEDX ;变换轮流标志
CJNE A, LEDX, OB1 ;
OB1: JC OB3 ;
OB2: MOV A, LEDX ;
MOV DPTR, #TBJ ;
CLR C
RLC A ;
ADDC A, 2CH ;
JMP @A+DPTR ;
TBJ: LJMP OUTLED1 ;
LJMP OUTLED2 ;
LJMP OUTLED3 ;
LJMP OUTLED4 ;
LJMP OUTLED5 ;
OB3: MOV LEDX, #05H
AJMP OB2
OUTLED1:CLR LED01 ;接通个位LED共阴极公共端
SETB LED02
SETB LED03
SETB LED04
SETB LED05
MOV LED, LED1 ;输出个位字码
LJMP LED6
OUTLED2:SETB LED01 ;十位LED阴极选通
CLR LED02
SETB LED03
SETB LED04
SETB LED05
MOV LED, LED2 ;输出十位字码
LJMP LED6
OUTLED3:SETB LED01 ;百位LED阴极选通
SETB LED02
CLR LED03
SETB LED04
SETB LED05 ;
MOV LED, LED3 ;输出百位字码
LJMP LED6
OUTLED4:SETB LED01 ;千位LED阴极选通
SETB LED02
SETB LED03
CLR LED04
SETB LED05
MOV LED, LED4 ;输出千位字码
LJMP LED6
OUTLED5:SETB LED01 ;万位LED阴极选通
SETB LED02
SETB LED03
SETB LED04
CLR LED05
MOV LED, LED5 ;输出万个位字码
AJMP LED6 ;退出本显示程序
LED6: POP PSW ;
POP ACC ;
RETI ;
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$444
; INT0中断
;(启动计数指令到达)
RUNINT0: CLR EX0 ;暂时屏蔽INT0中断
MOV TL0, #00H
MOV TH0, #00H
SETB TR0 ;启动计数
SETB EX1 ;允许停止计数指令的输入
SETB EX0 ;允许重新计数指令的输入
RETI
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$444
; INT1中断
;(停止计数指令到达,并计算计数值)
RUNINT1: CLR EX0 ;暂时屏蔽INT0中断
CLR EX1
CLR TR0 ;停止T0计数
MOV X1, TL0 ;读计数值
MOV X2, TH0 ;
RUNIN0OUT: MOV TH0, #00H ;
MOV TL0, #00H ;
SETB EX0 ;这里暂时不启动T0,及INT1了
RETI
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$44
; (RUNBCD)处理子程序
;以下为两字节转5位BCD的正式程序,入口条件:R1,R0位待转换16进制的两字节数据,转换后的5位BCD码放到R6,R5,R4,R2,R中
RUN5BCD: CLR C ;实际上此时R4>1,86,9FH
MOV R7, #00H ;
MOV A, R0 ;
SUBB A, #10H ;除数10000=2710H
MOV R0, A ;
MOV A, R1 ;
SUBB A, #27H ;
MOV R1, A ;
INC R7 ;
JNC RUN5BCD ;减的够转RUN5BCD
DEC R7 ;减不够则把R7回减1,并把刚才R1,R0值回加
MOV A, R0 ;
ADD A, #10H ;
MOV R0, A ;
MOV A, R1 ;
ADDC A, #27H ;
MOV R1, A ;此例R1,R0不会进位就不存进位值了
MOV A, R7
MOV R6, A ;得万位BCD码
MOV R7, #00H ;
RUN5BCD1:MOV A, R0 ;
SUBB A, #0E8H ;除数1000=03E8H
MOV R0, A ;
MOV A, R1 ;
SUBB A, #03H ;
MOV R1, A ;
INC R7
JNC RUN5BCD1 ;
DEC R7 ;减不够,回减R7,并回加刚才所减值
MOV A, R0 ;
ADD A, #0E8H ;
MOV R0, A ;
MOV A, R1 ;
ADDC A, #03H ;
MOV R1, A ;
MOV A, R7
MOV R5, A ;得千位BCD码
MOV R7, #00H ;
RUN5BCD2:MOV A, R0 ;
SUBB A, #100 ;除数100=
MOV R0, A ;
MOV A, R1 ;
SUBB A, #00H ;
MOV R1, A ;
INC R7
JNC RUN5BCD2 ;
DEC R7 ;实际上此时R1,R0>99
MOV A, R0 ;
ADD A, #100 ;
MOV R0, A ;
MOV A, R7
MOV R4, A ;得百位BCD码
RUN5BCD3:MOV A, R0 ;
MOV B, #10
DIV AB ;除数10=
MOV R3, A ;得十位BCD码
MOV R2, B ;得个位BCD码
; 以下为BCD码转共阴极LED显示码子程序
MOV R0, #4BH ;置指商的首址(万位)3b,9a,c9,ff
MOV R1, #05H ;转换LED的个数
MOV DPTR, #TAB
MOV A, R6 ;
MOVC A, @A+DPTR ;
MOV R6, A ;
MOV A, R5 ;
MOVC A, @A+DPTR ;
MOV R5, A ;
MOV A, R4 ;
MOVC A, @A+DPTR ;
MOV R4, A ;
MOV A, R3 ;
MOVC A, @A+DPTR ;
MOV R3, A ;
MOV A, R2 ;
MOVC A, @A+DPTR ;
MOV R2, A ;
RET
;--------------------------------------------------------------------------
;采用五位共阴的数码管
;P1.0接数码管段码的(a) P1.1(b).P1.2(c).P1.2(d).p1.4(e).p1.5(f).p1.6(g)
TAB: DB 10111111B ;11000000B ;0
DB 10000110B ;11111001B ;1
DB 11011011B ;10100100B ;2
DB 11001111B ;10110000B ;3
DB 11100110B ;10011001B ;4
DB 11101101B ;10010010B ;5
DB 11111101B ;10000010B ;6
DB 10000111B ;11111000B ;7
DB 11111111B ;10000000B ;8
DB 11101111B ;10010000B ;9
;--------------------------------------------------------------------------------
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
END
[此贴子已经被作者于2008-8-5 14:24:50编辑过]