📄 数字钟.lst
字号:
__start:
__text_start:
1D E5CF LDI R28,0x5F
1E E0D4 LDI R29,4
1F BFCD OUT 0x3D,R28
20 BFDE OUT 0x3E,R29
21 51CE SUBI R28,0x1E
22 40D0 SBCI R29,0
23 EA0A LDI R16,0xAA
24 8308 STD Y+0,R16
25 2400 CLR R0
26 E6E3 LDI R30,0x63
27 E0F0 LDI R31,0
28 E010 LDI R17,0
29 36EB CPI R30,0x6B
2A 07F1 CPC R31,R17
2B F011 BEQ 0x002E
2C 9201 ST R0,Z+
2D CFFB RJMP 0x0029
2E 8300 STD Z+0,R16
2F E3E6 LDI R30,0x36
30 E0F0 LDI R31,0
31 E6A0 LDI R26,0x60
32 E0B0 LDI R27,0
33 E010 LDI R17,0
34 E000 LDI R16,0
35 BF0B OUT 0x3B,R16
36 33E9 CPI R30,0x39
37 07F1 CPC R31,R17
38 F021 BEQ 0x003D
39 95C8 LPM
3A 9631 ADIW R30,1
3B 920D ST R0,X+
3C CFF9 RJMP 0x0036
3D D0B9 RCALL _main
_exit:
3E CFFF RJMP _exit
FILE: E:\xiaozhiyong2009\设计资料\项目设计\ICCAVR_mega8_C\ICCAVR_mega8_数字钟\数字钟.c
(0001) //ICC-AVR application builder : 2009-3-11 12:47:48
(0002) // Target : M8
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom8v.h>
(0006) #include <macros.h>
(0007)
(0008) void port_init(void)
(0009) {
(0010) PORTB = 0x00;
_port_init:
3F 2422 CLR R2
40 BA28 OUT 0x18,R2
(0011) DDRB = 0x00;
41 BA27 OUT 0x17,R2
(0012) PORTC = 0x00; //m103 output only
42 BA25 OUT 0x15,R2
(0013) DDRC = 0x00;
43 BA24 OUT 0x14,R2
(0014) PORTD = 0x00;
44 BA22 OUT 0x12,R2
(0015) DDRD = 0x00;
45 BA21 OUT 0x11,R2
46 9508 RET
(0016) }
(0017)
(0018) //call this routine to initialize all peripherals
(0019) void init_devices(void)
(0020) {
(0021) //stop errant interrupts until set up
(0022) CLI(); //disable all interrupts
_init_devices:
47 94F8 BCLR 7
(0023) port_init();
48 DFF6 RCALL _port_init
(0024)
(0025) MCUCR = 0x00;
49 2422 CLR R2
4A BE25 OUT 0x35,R2
(0026) GICR = 0x00;
4B BE2B OUT 0x3B,R2
(0027) TIMSK = 0x00; //timer interrupt sources
4C BE29 OUT 0x39,R2
(0028) SEI(); //re-enable interrupts
4D 9478 BSET 7
4E 9508 RET
(0029) //all peripherals are now initialized
(0030) }
(0031)
(0032) /************************************
(0033) 用 途:微秒级延时程序
(0034) Taget :mega8
(0035) crystal :8M
(0036) 介 绍:在8M的晶振上进行us级的延时
(0037) 入口参数:
(0038) *************************************/
(0039) void delay_us(int time)
(0040) {
(0041) do
(0042) {
(0043) time--;
_delay_us:
time --> R16
4F 5001 SUBI R16,1
50 4010 SBCI R17,0
(0044) }
(0045) while (time > 1);
51 E081 LDI R24,1
52 E090 LDI R25,0
53 1780 CP R24,R16
54 0791 CPC R25,R17
55 F3CC BLT 0x004F
56 9508 RET
_show_6_digit:
j --> R20
i --> R10
p --> R22
57 D0C1 RCALL push_xgsetF00C
58 01B8 MOVW R22,R16
(0046) }
(0047)
(0048) /************************************
(0049) 用 途:六位数码管的显示程序
(0050) Taget :mega8
(0051) crystal :8M
(0052) 介 绍:数码管共阳
(0053) a-PB0
(0054) b-PB1
(0055) ...
(0056) h-PB6
(0057) DP-PB7
(0058) -------
(0059) 1-PC5
(0060) 2-PC4
(0061) 3-PC3
(0062) 4-PC2
(0063) 5-PC1
(0064) 6-PC0
(0065) 使用show_6_digit(p)
(0066) unsigned char数组
(0067) B用作数据口
(0068) C用作片选
(0069) 入口参数:显示数组
(0070) *************************************/
(0071) const unsigned char num[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
(0072) 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
(0073) void show_6_digit(unsigned char *p)
(0074) {
(0075) unsigned char i,j;
(0076) DDRB=0xff;
59 EF8F LDI R24,0xFF
5A BB87 OUT 0x17,R24
(0077) DDRC=0xff;
5B BB84 OUT 0x14,R24
(0078) for (j=0;j<200;j++)
5C 2744 CLR R20
5D C01F RJMP 0x007D
(0079) {
(0080) for (i=0;i<6;i++)
5E 24AA CLR R10
5F C019 RJMP 0x0079
(0081) {
(0082) PORTC=0;//先关显示
60 2422 CLR R2
61 BA25 OUT 0x15,R2
(0083) PORTB=~num[*(p+5-i)];//送数据
62 2C2A MOV R2,R10
63 2433 CLR R3
64 01FB MOVW R30,R22
65 9635 ADIW R30,5
66 19E2 SUB R30,R2
67 09F3 SBC R31,R3
68 81E0 LDD R30,Z+0
69 27FF CLR R31
6A E286 LDI R24,0x26
6B E090 LDI R25,0
6C 0FE8 ADD R30,R24
6D 1FF9 ADC R31,R25
6E 9024 LPM R2,0(Z)
6F 9420 COM R2
70 BA28 OUT 0x18,R2
(0084) PORTC=(0x1<<i);//开显示
71 E001 LDI R16,1
72 2D1A MOV R17,R10
73 D0B3 RCALL lsl8
74 BB05 OUT 0x15,R16
(0085) delay_us(200);//小延时
75 EC08 LDI R16,0xC8
76 E010 LDI R17,0
77 DFD7 RCALL _delay_us
78 94A3 INC R10
79 2D8A MOV R24,R10
7A 3086 CPI R24,6
7B F320 BCS 0x0060
7C 9543 INC R20
7D 3C48 CPI R20,0xC8
7E F2F8 BCS 0x005E
7F C0A0 RJMP pop_xgsetF00C
(0086) }
(0087) }
(0088) }
(0089)
(0090) /************************************
(0091) 用 途:用TC0做一个时钟
(0092) Taget :mega8
(0093) crystal :8M
(0094) 介 绍:8M晶振
(0095) 入口参数:
(0096) 出口参数:
(0097) *************************************/
(0098) unsigned char CountNum;//用来记录中断,第一次中断是1/500S
(0099) unsigned char Count;//用来做1/100S
(0100) unsigned char Time[3]={12,0,0};//表示时间,时分秒
(0101) //初始化TC0
(0102) void init_timer0()
(0103) {
(0104) TCCR0=0x00;//TCCR0工作于定时方式,先停止TC0
_init_timer0:
80 2422 CLR R2
81 BE23 OUT 0x33,R2
(0105) TCNT0=0x06;//计数器初始值
82 E086 LDI R24,6
83 BF82 OUT 0x32,R24
(0106) TIMSK|=(1<<TOIE0);//开放TOIE0中断
84 B789 IN R24,0x39
85 6081 ORI R24,1
86 BF89 OUT 0x39,R24
(0107) TCCR0=(1<<CS01)|(1<<CS00);//打开TC0用64分频
87 E083 LDI R24,3
88 BF83 OUT 0x33,R24
89 9508 RET
_timer0_fun:
8A 922A ST R2,-Y
8B 938A ST R24,-Y
8C 939A ST R25,-Y
8D B62F IN R2,0x3F
8E 922A ST R2,-Y
(0108) }
(0109) //TC0中断函数
(0110) #pragma interrupt_handler timer0_fun:iv_TIMER0_OVF
(0111) void timer0_fun()
(0112) {
(0113) TCNT0=0x06;//重装初值
8F E086 LDI R24,6
90 BF82 OUT 0x32,R24
(0114) if (++CountNum==5)
91 9180 006A LDS R24,CountNum
93 5F8F SUBI R24,0xFF
94 2E28 MOV R2,R24
95 9220 006A STS CountNum,R2
97 3085 CPI R24,5
98 F441 BNE 0x00A1
(0115) {
(0116) CountNum=0;
99 2422 CLR R2
9A 9220 006A STS CountNum,R2
(0117) Count++;
9C 9180 0069 LDS R24,Count
9E 5F8F SUBI R24,0xFF
9F 9380 0069 STS Count,R24
(0118) }
(0119) if (Count==100)//Count=100就是一秒到时了
A1 9180 0069 LDS R24,Count
A3 3684 CPI R24,0x64
A4 F441 BNE 0x00AD
(0120) {
(0121) Count=0;
A5 2422 CLR R2
A6 9220 0069 STS Count,R2
(0122) Time[2]++;
A8 9180 0062 LDS R24,Time+2
AA 5F8F SUBI R24,0xFF
AB 9380 0062 STS Time+2,R24
(0123) }
(0124) if (Time[2]==60)
AD 9180 0062 LDS R24,Time+2
AF 338C CPI R24,0x3C
B0 F441 BNE 0x00B9
(0125) {
(0126) Time[2]=0;
B1 2422 CLR R2
B2 9220 0062 STS Time+2,R2
(0127) Time[1]++;
B4 9180 0061 LDS R24,Time+1
B6 5F8F SUBI R24,0xFF
B7 9380 0061 STS Time+1,R24
(0128) }
(0129) if (Time[1]==60)
B9 9180 0061 LDS R24,Time+1
BB 338C CPI R24,0x3C
BC F441 BNE 0x00C5
(0130) {
(0131) Time[1]=0;
BD 2422 CLR R2
BE 9220 0061 STS Time+1,R2
(0132) Time[0]++;
C0 9180 0060 LDS R24,Time
C2 5F8F SUBI R24,0xFF
C3 9380 0060 STS Time,R24
(0133) }
(0134) if (Time[0]==24)
C5 9180 0060 LDS R24,Time
C7 3188 CPI R24,0x18
C8 F419 BNE 0x00CC
(0135) {
(0136) Time[0]=0;
C9 2422 CLR R2
CA 9220 0060 STS Time,R2
(0137) }
CC 9029 LD R2,Y+
CD BE2F OUT 0x3F,R2
CE 9199 LD R25,Y+
CF 9189 LD R24,Y+
D0 9029 LD R2,Y+
D1 9518 RETI
(0138) }
(0139) //************************************************
(0140)
(0141) unsigned char Time6[6];
(0142) /************************************
(0143) 用 途:时间的转换
(0144) Taget :mega8
(0145) crystal :8M
(0146) 介 绍:
(0147) 入口参数:
(0148) 出口参数:
(0149) *************************************/
(0150) void time_convert()
(0151) {
(0152) Time6[0]=Time[0]/10;
_time_convert:
D2 E01A LDI R17,0xA
D3 9100 0060 LDS R16,Time
D5 D02D RCALL div8u
D6 9300 0063 STS Time6,R16
(0153) Time6[1]=Time[0]%10;
D8 E01A LDI R17,0xA
D9 9100 0060 LDS R16,Time
DB D025 RCALL mod8u
DC 9300 0064 STS Time6+1,R16
(0154) Time6[2]=Time[1]/10;
DE E01A LDI R17,0xA
DF 9100 0061 LDS R16,Time+1
E1 D021 RCALL div8u
E2 9300 0065 STS Time6+2,R16
(0155) Time6[3]=Time[1]%10;
E4 E01A LDI R17,0xA
E5 9100 0061 LDS R16,Time+1
E7 D019 RCALL mod8u
E8 9300 0066 STS Time6+3,R16
(0156) Time6[4]=Time[2]/10;
EA E01A LDI R17,0xA
EB 9100 0062 LDS R16,Time+2
ED D015 RCALL div8u
EE 9300 0067 STS 0x0067,R16
(0157) Time6[5]=Time[2]%10;
F0 E01A LDI R17,0xA
F1 9100 0062 LDS R16,Time+2
F3 D00D RCALL mod8u
F4 9300 0068 STS 0x0068,R16
F6 9508 RET
(0158) }
(0159)
(0160) void main()
(0161) {
(0162)
(0163) port_init();
_main:
F7 DF47 RCALL _port_init
(0164) init_devices();
F8 DF4E RCALL _init_devices
(0165)
(0166) init_timer0();
F9 DF86 RCALL _init_timer0
FA C004 RJMP 0x00FF
(0167) while(1)
(0168) {
(0169) time_convert();
FB DFD6 RCALL _time_convert
(0170) show_6_digit(Time6);
FILE: <library>
FC E603 LDI R16,0x63
FD E010 LDI R17,0
FE DF58 RCALL _show_6_digit
FF CFFB RJMP 0x00FB
100 9508 RET
mod8u:
101 9468 BSET 6
102 C001 RJMP xdiv8u
div8u:
103 94E8 BCLR 6
xdiv8u:
104 932A ST R18,-Y
105 92FA ST R15,-Y
106 92EA ST R14,-Y
107 24FF CLR R15
108 24EE CLR R14
109 E120 LDI R18,0x10
10A 0F00 LSL R16
10B 1CFF ROL R15
10C 1CEE ROL R14
10D 16E1 CP R14,R17
10E F010 BCS 0x0111
10F 1AE1 SUB R14,R17
110 9503 INC R16
111 952A DEC R18
112 F7B9 BNE 0x010A
113 F40E BRTC 0x0115
114 2D0E MOV R16,R14
115 90E9 LD R14,Y+
116 90F9 LD R15,Y+
117 9129 LD R18,Y+
118 9508 RET
push_xgsetF00C:
119 937A ST R23,-Y
11A 936A ST R22,-Y
11B 935A ST R21,-Y
11C 934A ST R20,-Y
11D 92BA ST R11,-Y
11E 92AA ST R10,-Y
11F 9508 RET
pop_xgsetF00C:
120 90A9 LD R10,Y+
121 90B9 LD R11,Y+
122 9149 LD R20,Y+
123 9159 LD R21,Y+
124 9169 LD R22,Y+
125 9179 LD R23,Y+
126 9508 RET
lsl8:
127 2311 TST R17
128 F019 BEQ 0x012C
129 0F00 LSL R16
12A 951A DEC R17
12B CFFB RJMP lsl8
12C 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -