|
**************************************************************************
;- INT0中断计数 3位数码管显示 P3.2接按键,计数 *
;*******************************************************************************
; 日期: 2007-3-25 硬件: 数码管P0,数码管控制P2 *
; 版本: 3.0 *
; 作者: 深圳学林电子有限公司 专业8051单片机教学站 *
; 邮箱: sxj1974@163.com *
; 网站: http://www.51c51.com http://www.8951.com 更多例程请登陆网站 *
;*******************************************************************************
; 硬件:此程序在本公司xlisp系列单片机实验仪运行通过 *
;*******************************************************************************
; 【版权】 Copyright(C)深圳学林电子有限公司 www.51c51.com All Rights Reserved *
; 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! *
;*******************************************************************************
IR BIT P3.2 ;红外接收口
DISSTART EQU 40H ;显示单元首地址
LED_DATA EQU P0 ;数码管数据口定义
COUNT EQU 30H
;*******************************************************************
ORG 0000H
JMP MAIN
ORG 0003H
JMP INT0_EX0
ORG 0080H
;*******************************************************************
MAIN:
MOV SP,#60H
MOV P0,#0FFH
MOV P2,#0FFH
MOV 30H,#00H
SETB IT0 ;INT1为下降沿触发
SETB EA
SETB EX0
MAIN1:
CALL CONVT
CALL PLAY
JMP MAIN1
;*******************************************************************
INT0_EX0:
PUSH ACC
PUSH PSW
SETB RS0
CLR RS1
CLR EX0
INC COUNT
MOV R4,#14H ;显示20次
EX0_DEL:
MOV A,COUNT
CALL CONVT
CALL PLAY
DJNZ R4,EX0_DEL
CJNE A,#0FFH,EX0_END
MOV COUNT,#00H
EX0_END:
SETB EX0
POP PSW
POP ACC
RETI
;---------------------------------------------------------
;代码变换 (HEX TO BCD)
;---------------------------------------------------------
CONVT:
MOV A,COUNT
MOV B,#100
DIV AB
MOV DISSTART+2,A ;百位存放在DISSTART+2
MOV A,#10
XCH A,B
DIV AB
MOV DISSTART+1,A ;十位存放在DISSTART+1
MOV DISSTART,B ;个位存放在DISSTART
MOV A,DISSTART+2
CJNE A,#00H,CONVT_END
MOV DISSTART+2,#0AH ;高位为0,不显示
MOV A,DISSTART+1
CJNE A,#00H,CONVT_END
MOV DISSTART+1,#0AH
CONVT_END:
RET
;---------------------------------------------------------
PLAY:
MOV R0,#DISSTART ;获得显示单元首地址
MOV R1,#07FH ;从第一个数码管开始
MOV R2,#03H ;共显示3位数码管
DISP1:
MOV A,@R0 ;获得当前位地址
MOV DPTR,#TAB_NU ;获得表头
MOVC A,@A+DPTR ;查表获得显示数据
MOV LED_DATA,A ;显示数据
MOV P2,R1 ;开始显示当前位
MOV A,R1 ;准备显示下一位
RR A
MOV R1,A ;下一位
INC R0 ;取下一个单元地址
LCALL DELAY2MS ;延时 2 MS
DJNZ R2,DISP1 ;重复显示下一个
MOV P2,#0FFH ;关闭显示
RET ;显示完成,返回
;---------------------------------------------------------
;延时子程序
;---------------------------------------------------------
DELAY2MS:
MOV R6,#10
DEL1:
MOV R7,#100
DJNZ R7,$
DJNZ R6,DEL1
RET
;---------------------------------------------------------
TAB_NU:
DB 28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h,0FFH
;---------------------------------------------------------
END
[em01] |
|