📄 倒计时.asm
字号:
; .\timer.SRC generated from: timer.c
; COMPILER INVOKED BY:
; C:\Keil\C51\BIN\C51.EXE timer.c BROWSE DEBUG OBJECTEXTEND SRC(.\timer.SRC)
$NOMOD51
NAME TIMER
P0 DATA 080H
P1 DATA 090H
P2 DATA 0A0H
P3 DATA 0B0H
T0 BIT 0B0H.4
AC BIT 0D0H.6
T1 BIT 0B0H.5
T2 BIT 090H.0
EA BIT 0A8H.7
IE DATA 0A8H
EXF2 BIT 0C8H.6
RD BIT 0B0H.7
ES BIT 0A8H.4
IP DATA 0B8H
RI BIT 098H.0
INT0 BIT 0B0H.2
CY BIT 0D0H.7
TI BIT 098H.1
INT1 BIT 0B0H.3
RCAP2H DATA 0CBH
PS BIT 0B8H.4
SP DATA 081H
T2EX BIT 090H.1
OV BIT 0D0H.2
RCAP2L DATA 0CAH
C_T2 BIT 0C8H.1
WR BIT 0B0H.6
RCLK BIT 0C8H.5
TCLK BIT 0C8H.4
SBUF DATA 099H
PCON DATA 087H
SCON DATA 098H
TMOD DATA 089H
TCON DATA 088H
IE0 BIT 088H.1
IE1 BIT 088H.3
B DATA 0F0H
CP_RL2 BIT 0C8H.0
ACC DATA 0E0H
ET0 BIT 0A8H.1
ET1 BIT 0A8H.3
TF0 BIT 088H.5
ET2 BIT 0A8H.5
TF1 BIT 088H.7
TF2 BIT 0C8H.7
RB8 BIT 098H.2
TH0 DATA 08CH
EX0 BIT 0A8H.0
IT0 BIT 088H.0
TH1 DATA 08DH
TB8 BIT 098H.3
EX1 BIT 0A8H.2
IT1 BIT 088H.2
TH2 DATA 0CDH
P BIT 0D0H.0
SM0 BIT 098H.7
TL0 DATA 08AH
SM1 BIT 098H.6
TL1 DATA 08BH
SM2 BIT 098H.5
TL2 DATA 0CCH
PT0 BIT 0B8H.1
PT1 BIT 0B8H.3
RS0 BIT 0D0H.3
PT2 BIT 0B8H.5
TR0 BIT 088H.4
RS1 BIT 0D0H.4
TR1 BIT 088H.6
TR2 BIT 0C8H.2
PX0 BIT 0B8H.0
PX1 BIT 0B8H.2
DPH DATA 083H
DPL DATA 082H
EXEN2 BIT 0C8H.3
REN BIT 098H.4
T2CON DATA 0C8H
RXD BIT 0B0H.0
TXD BIT 0B0H.1
F0 BIT 0D0H.5
PSW DATA 0D0H
?PR?Init_T0?TIMER SEGMENT CODE
?PR?timer0?TIMER SEGMENT CODE
?PR?_delay?TIMER SEGMENT CODE
?PR?_display?TIMER SEGMENT CODE
?DT?_display?TIMER SEGMENT DATA OVERLAYABLE
?PR?keyscanf?TIMER SEGMENT CODE
?DT?keyscanf?TIMER SEGMENT DATA OVERLAYABLE
?PR?dis_switch?TIMER SEGMENT CODE
?PR?main?TIMER SEGMENT CODE
?C_INITSEG SEGMENT CODE
?CO?TIMER SEGMENT CODE
?DT?TIMER SEGMENT DATA
EXTRN CODE (?C?CLDOPTR)
EXTRN CODE (?C_STARTUP)
PUBLIC T0_counter
PUBLIC outflage
PUBLIC milsecond
PUBLIC hour
PUBLIC dis_data
PUBLIC minute
PUBLIC second
PUBLIC led_code
PUBLIC main
PUBLIC dis_switch
PUBLIC keyscanf
PUBLIC _display
PUBLIC _delay
PUBLIC timer0
PUBLIC Init_T0
RSEG ?DT?keyscanf?TIMER
?keyscanf?BYTE:
temp?444: DS 1
i?445: DS 1
RSEG ?DT?_display?TIMER
?_display?BYTE:
p?341: DS 3
n?342: DS 1
RSEG ?DT?TIMER
second: DS 1
minute: DS 1
dis_data: DS 6
hour: DS 1
milsecond: DS 1
outflage: DS 2
T0_counter: DS 1
RSEG ?CO?TIMER
led_code:
DB 0C0H
DB 0F9H
DB 0A4H
DB 0B0H
DB 099H
DB 092H
DB 082H
DB 0F8H
DB 080H
DB 090H
DB 088H
DB 083H
DB 0C6H
DB 0A1H
DB 086H
DB 08EH
DB 07FH
DB 0FFH
RSEG ?PR?main?TIMER
RSEG ?C_INITSEG
DB 001H
DB hour
DB 000H
DB 001H
DB minute
DB 000H
DB 001H
DB second
DB 000H
DB 001H
DB milsecond
DB 000H
DB 001H
DB T0_counter
DB 000H
DB 002H
DB outflage
DW 00000H
DB 006H
DB dis_data
DB 000H
DB 000H
DB 000H
DB 000H
DB 000H
DB 000H
;
; /********************************************
; 程序说明: 电子时针以89S52为核心,
; 内部定时器T0每50豪秒中断一次,每0.1秒针更新一次数据
; 通过数据转换程序,将更新的数据通过动态数码管显示
; 该程序的最大定时可以达到17个小时;
; S6确定键,S5设定小时,S4设定分钟。误按了确定键,请复位键S7,重新设置。
; 编写时间:2005-12-01
; 作者: XiaoYu
; *********************************************/
;
; #include"reg52.h"
; #include <absacc.h>
; #include <intrins.h>
; #define uchar unsigned char
; #define uint unsigned int
; uchar data hour=0,minute=0,second=0,milsecond=0;
; uchar data T0_counter=0;
; outflage =0x00;
; uchar code led_code[18]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80, //段码
; 0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xff};
; uchar data dis_data[6]={0,0,0,0,0,0};
; void Init_T0( void )
RSEG ?PR?Init_T0?TIMER
Init_T0:
; SOURCE LINE # 23
; {
; SOURCE LINE # 24
; T0_counter =0x01;
; SOURCE LINE # 25
MOV T0_counter,#01H
; TMOD =0X01;
; SOURCE LINE # 26
MOV TMOD,#01H
; TH0 =0X3c;
; SOURCE LINE # 27
MOV TH0,#03CH
; TL0 =0Xb0;
; SOURCE LINE # 28
MOV TL0,#0B0H
; TR0 =1;
; SOURCE LINE # 29
SETB TR0
; ET0 =1;
; SOURCE LINE # 30
SETB ET0
; EA =1;
; SOURCE LINE # 31
SETB EA
; }
; SOURCE LINE # 32
RET
; END OF Init_T0
CSEG AT 0000BH
LJMP timer0
; void timer0(void) interrupt 1 using 3
RSEG ?PR?timer0?TIMER
USING 3
timer0:
PUSH ACC
PUSH PSW
USING 3
MOV PSW,#018H
; SOURCE LINE # 33
; {
; // TR0 =0;
; if(T0_counter-- ==0) //0.1秒中到否?
; SOURCE LINE # 36
MOV R7,T0_counter
DEC T0_counter
MOV A,R7
JNZ ?C0002
; {
; SOURCE LINE # 37
; T0_counter =0x01;
; SOURCE LINE # 38
MOV T0_counter,#01H
; if(milsecond-- ==0)
; SOURCE LINE # 39
MOV R7,milsecond
DEC milsecond
MOV A,R7
JNZ ?C0002
; {
; SOURCE LINE # 40
; milsecond=0x09;
; SOURCE LINE # 41
MOV milsecond,#09H
; if(second --==0)
; SOURCE LINE # 42
MOV R7,second
DEC second
MOV A,R7
JNZ ?C0002
; {
; SOURCE LINE # 43
; if(minute !=0 || hour!=0)
; SOURCE LINE # 44
MOV A,minute
JNZ ?C0006
MOV A,hour
JZ ?C0005
?C0006:
; second =59;
; SOURCE LINE # 45
MOV second,#03BH
?C0005:
; if(minute -- ==0x00)
; SOURCE LINE # 46
MOV R7,minute
DEC minute
MOV A,R7
JNZ ?C0002
; {
; SOURCE LINE # 47
; if(hour !=0)
; SOURCE LINE # 48
MOV A,hour
JZ ?C0008
; minute =59;
; SOURCE LINE # 49
MOV minute,#03BH
?C0008:
; if(hour !=0x00)
; SOURCE LINE # 50
MOV A,hour
JZ ?C0009
; hour --;
; SOURCE LINE # 51
DEC hour
SJMP ?C0002
?C0009:
; else {hour=0x00;minute=0x00;second=0x00;milsecond=0x00;TR0=0;}
; SOURCE LINE # 52
MOV hour,#00H
MOV minute,#00H
MOV second,#00H
MOV milsecond,#00H
CLR TR0
; }
; SOURCE LINE # 53
; }
; SOURCE LINE # 54
; }
; SOURCE LINE # 55
; }
; SOURCE LINE # 56
?C0002:
; TH0 =0X3c; //重置初值
; SOURCE LINE # 57
MOV TH0,#03CH
; TL0 =0Xc0;
; SOURCE LINE # 58
MOV TL0,#0C0H
; // TR0 =1;
; }
; SOURCE LINE # 60
POP PSW
POP ACC
RETI
; END OF timer0
; void delay(uint n)
RSEG ?PR?_delay?TIMER
_delay:
USING 0
; SOURCE LINE # 61
;---- Variable 'n?240' assigned to Register 'R6/R7' ----
; {
; SOURCE LINE # 62
?C0012:
; while(n--);
; SOURCE LINE # 63
MOV A,R7
DEC R7
MOV R4,AR6
JNZ ?C0039
DEC R6
?C0039:
ORL A,R4
JNZ ?C0012
; }
; SOURCE LINE # 64
?C0014:
RET
; END OF _delay
;
; void display(uchar *p,uchar n)
RSEG ?PR?_display?TIMER
L?0040:
USING 0
L?0041:
MOV R3,#00H
L?0042:
MOV R2,#HIGH (dis_data)
MOV R1,#LOW (dis_data)
MOV R5,#06H
_display:
USING 0
; SOURCE LINE # 66
MOV p?341,R3
MOV p?341+01H,R2
MOV p?341+02H,R1
MOV n?342,R5
; {
; SOURCE LINE # 67
; uchar i;
; for(i=0;i<n;i++)
; SOURCE LINE # 69
;---- Variable 'i?343' assigned to Register 'R5' ----
CLR A
MOV R5,A
?C0015:
MOV A,R5
CLR C
SUBB A,n?342
JNC ?C0018
; {
; SOURCE LINE # 70
; P2=i;
; SOURCE LINE # 71
MOV P2,R5
; P0 = led_code[p[i]];
; SOURCE LINE # 72
MOV R3,p?341
MOV R2,p?341+01H
MOV R1,p?341+02H
MOV DPL,R5
MOV DPH,#00H
LCALL ?C?CLDOPTR
MOV DPTR,#led_code
MOVC A,@A+DPTR
MOV P0,A
; delay(30);
; SOURCE LINE # 73
MOV R7,#01EH
MOV R6,#00H
LCALL _delay
; P0=0xff;
; SOURCE LINE # 74
MOV P0,#0FFH
; }
; SOURCE LINE # 75
INC R5
SJMP ?C0015
; }
; SOURCE LINE # 76
?C0018:
RET
; END OF _display
; void keyscanf(void)
RSEG ?PR?keyscanf?TIMER
keyscanf:
USING 0
; SOURCE LINE # 77
; {
; SOURCE LINE # 78
; uchar temp=0x00;
; SOURCE LINE # 79
CLR A
MOV temp?444,A
; uchar i;
; P1 =0X0F;
; SOURCE LINE # 81
MOV P1,#0FH
; for(i=0;i<30;i++) //用动态显示来延时
; SOURCE LINE # 82
MOV i?445,A
?C0019:
; display(dis_data,6);
; SOURCE LINE # 83
LCALL L?0040
INC i?445
MOV A,i?445
CLR C
SUBB A,#01EH
JC ?C0019
?C0020:
; temp =P1;
; SOURCE LINE # 84
MOV temp?444,P1
; if((temp&0x0f)!=0x0f)
; SOURCE LINE # 85
MOV A,temp?444
ANL A,#0FH
XRL A,#0FH
JZ ?C0032
; {
; SOURCE LINE # 86
; P1 =0X0F;
; SOURCE LINE # 87
MOV P1,#0FH
; for(i=0;i<30;i++) //用动态显示来延时
; SOURCE LINE # 88
CLR A
MOV i?445,A
?C0023:
; display(dis_data,6);
; SOURCE LINE # 89
LCALL L?0040
INC i?445
MOV A,i?445
CLR C
SUBB A,#01EH
JC ?C0023
?C0024:
; temp =P1;
; SOURCE LINE # 90
MOV temp?444,P1
; if((temp &0x0f)!=0x0f)
; SOURCE LINE # 91
MOV A,temp?444
ANL A,#0FH
XRL A,#0FH
JZ ?C0032
; {
; SOURCE LINE # 92
; if(temp ==0x0d)
; SOURCE LINE # 93
MOV A,temp?444
CJNE A,#0DH,?C0027
; {
; SOURCE LINE # 94
; if((++minute)>59)
; SOURCE LINE # 95
INC minute
MOV A,minute
SETB C
SUBB A,#03BH
JC ?C0027
; minute =0;
; SOURCE LINE # 96
CLR A
MOV minute,A
; }
; SOURCE LINE # 97
?C0027:
; if(temp ==0x0b)
; SOURCE LINE # 98
MOV A,temp?444
CJNE A,#0BH,?C0029
; {
; SOURCE LINE # 99
; if((++hour) >15)
; SOURCE LINE # 100
INC hour
MOV A,hour
SETB C
SUBB A,#0FH
JC ?C0029
; hour =0;
; SOURCE LINE # 101
CLR A
MOV hour,A
; }
; SOURCE LINE # 102
?C0029:
; if(temp ==0x07)
; SOURCE LINE # 103
MOV A,temp?444
CJNE A,#07H,?C0032
; outflage =1;
; SOURCE LINE # 104
MOV outflage,#00H
MOV outflage+01H,#01H
; }
; SOURCE LINE # 105
; }
; SOURCE LINE # 106
; }
; SOURCE LINE # 107
?C0032:
RET
; END OF keyscanf
;
;
; void dis_switch(void) //一个字节十六进制数转换成2个字节BCD码子程序
RSEG ?PR?dis_switch?TIMER
dis_switch:
; SOURCE LINE # 110
; {
; SOURCE LINE # 111
; dis_data[0]=milsecond %10;
; SOURCE LINE # 112
MOV A,milsecond
MOV B,#0AH
DIV AB
MOV dis_data,B
; dis_data[1]=second %10;
; SOURCE LINE # 113
MOV A,second
MOV B,#0AH
DIV AB
MOV dis_data+01H,B
; dis_data[2]=second /10;
; SOURCE LINE # 114
MOV A,second
MOV B,#0AH
DIV AB
MOV dis_data+02H,A
; dis_data[3]=minute %10;
; SOURCE LINE # 115
MOV A,minute
MOV B,#0AH
DIV AB
MOV dis_data+03H,B
; dis_data[4]=minute /10;
; SOURCE LINE # 116
MOV A,minute
MOV B,#0AH
DIV AB
MOV dis_data+04H,A
; dis_data[5]=hour;
; SOURCE LINE # 117
MOV dis_data+05H,hour
;
;
; }
; SOURCE LINE # 120
RET
; END OF dis_switch
; void main()
RSEG ?PR?main?TIMER
main:
USING 0
; SOURCE LINE # 121
; {
; SOURCE LINE # 122
; delay(50000);
; SOURCE LINE # 123
MOV R7,#050H
MOV R6,#0C3H
LCALL _delay
?C0034:
; while(!outflage)
; SOURCE LINE # 124
MOV A,outflage+01H
ORL A,outflage
JNZ ?C0035
; {
; SOURCE LINE # 125
;
; display(dis_data,6);
; SOURCE LINE # 127
MOV R3,A
LCALL L?0042
; dis_switch();
; SOURCE LINE # 128
LCALL dis_switch
; keyscanf();
; SOURCE LINE # 129
LCALL keyscanf
; }
; SOURCE LINE # 130
SJMP ?C0034
?C0035:
; Init_T0();
; SOURCE LINE # 131
LCALL Init_T0
?C0036:
; while(1)
; SOURCE LINE # 132
; {
; SOURCE LINE # 133
; dis_switch();
; SOURCE LINE # 134
LCALL dis_switch
; display(dis_data,6);
; SOURCE LINE # 135
LCALL L?0041
; }
; SOURCE LINE # 136
SJMP ?C0036
; END OF main
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -