📄 ds1203.lst
字号:
(0019) #define CLK_1 PORTD|=(1<<1)
(0020) #define CLK_0 PORTD&=~(1<<1)
(0021) /******************************************************************************
(0022) 定义数码管的选择端口
(0023) ********************************************************************************/
(0024) #define LED1 PORTD=0X07//LED2
(0025) #define LED2 PORTD=0X0B//LED1
(0026) #define LED3 PORTD=0X13//LED3
(0027) #define LED4 PORTD=0X23//LED4
(0028) #define LED0 PORTD=0X03//灭
(0029)
(0030) /*******************************************************************************
(0031) 单片机初始化程序
(0032)
(0033) ******************************************************************************/
(0034) void port_init(void)
(0035) {
(0036) PORTB = 0x00;
_port_init:
012B 2422 CLR R2
012C BA28 OUT 0x18,R2
(0037) DDRB = 0x00;
012D BA27 OUT 0x17,R2
(0038) PORTC = 0x00; //m103 output only
012E BA25 OUT 0x15,R2
(0039) DDRC = 0xff;
012F EF8F LDI R24,0xFF
0130 BB84 OUT 0x14,R24
(0040) PORTD = 0x00;
0131 BA22 OUT 0x12,R2
(0041) DDRD = 0xFF;
0132 BB81 OUT 0x11,R24
0133 9508 RET
(0042) }
(0043)
(0044) //TIMER1 initialize - prescale:1
(0045) // WGM: 0) Normal, TOP=0xFFFF
(0046) // desired value: 1mSec
(0047) // actual value: 1.000mSec (0.0%)
(0048) void timer1_init(void)
(0049) {
(0050) TCCR1B = 0x00; //stop
_timer1_init:
0134 2422 CLR R2
0135 BC2E OUT 0x2E,R2
(0051) TCNT1H = 0xFC; //setup
0136 EF8C LDI R24,0xFC
0137 BD8D OUT 0x2D,R24
(0052) TCNT1L = 0x18;
0138 E188 LDI R24,0x18
0139 BD8C OUT 0x2C,R24
(0053) OCR1AH = 0x03;
013A E083 LDI R24,3
013B BD8B OUT 0x2B,R24
(0054) OCR1AL = 0xE8;
013C EE88 LDI R24,0xE8
013D BD8A OUT 0x2A,R24
(0055) OCR1BH = 0x03;
013E E083 LDI R24,3
013F BD89 OUT 0x29,R24
(0056) OCR1BL = 0xE8;
0140 EE88 LDI R24,0xE8
0141 BD88 OUT 0x28,R24
(0057) ICR1H = 0x03;
0142 E083 LDI R24,3
0143 BD87 OUT 0x27,R24
(0058) ICR1L = 0xE8;
0144 EE88 LDI R24,0xE8
0145 BD86 OUT 0x26,R24
(0059) TCCR1A = 0x00;
0146 BC2F OUT 0x2F,R2
(0060) TCCR1B = 0x01; //start Timer
0147 E081 LDI R24,1
0148 BD8E OUT 0x2E,R24
0149 9508 RET
(0061) }
(0062)
(0063)
(0064) void init_devices(void)
(0065) {
(0066) CLI(); //disable all interrupts
_init_devices:
014A 94F8 BCLR 7
(0067) port_init();
014B DFDF RCALL _port_init
(0068) timer1_init();
014C DFE7 RCALL _timer1_init
(0069) MCUCR = 0x00;
014D 2422 CLR R2
014E BE25 OUT 0x35,R2
(0070) GICR = 0x00;
014F BE2B OUT 0x3B,R2
(0071) TIMSK = 0x04;
0150 E084 LDI R24,4
0151 BF89 OUT 0x39,R24
(0072) SEI(); //re-enable interrupts
0152 9478 BSET 7
0153 9508 RET
_sendbeyt:
i --> R20
x --> R22
0154 D0BE RCALL push_gset2
0155 2F60 MOV R22,R16
(0073)
(0074) }
(0075) /*******************************************************************************
(0076) 显示程序
(0077)
(0078) ******************************************************************************/
(0079) /*发送显示一个字节*/
(0080) void sendbeyt(char x)
(0081) {
(0082) int i;
(0083) for(i=0;i<8;i++)
0156 2744 CLR R20
0157 2755 CLR R21
(0084) {
(0085) CLK_1;
0158 9A91 SBI 0x12,1
(0086) if(x&(1<<i))
0159 E001 LDI R16,1
015A E010 LDI R17,0
015B 019A MOVW R18,R20
015C D0FD RCALL lsl16
015D 2E26 MOV R2,R22
015E 2433 CLR R3
015F 2220 AND R2,R16
0160 2231 AND R3,R17
0161 2022 TST R2
0162 F411 BNE 0x0165
0163 2033 TST R3
0164 F011 BEQ 0x0167
(0087) DATA_1;
0165 9A90 SBI 0x12,0
0166 C001 RJMP 0x0168
(0088) else
(0089) DATA_0;
0167 9890 CBI 0x12,0
(0090) CLK_0;
0168 9891 CBI 0x12,1
0169 5F4F SUBI R20,0xFF
016A 4F5F SBCI R21,0xFF
016B 3048 CPI R20,0x8
016C E0E0 LDI R30,0
016D 075E CPC R21,R30
016E F34C BLT 0x0158
(0091) }
(0092) CLK_1;
016F 9A91 SBI 0x12,1
0170 D096 RCALL pop_gset2
0171 9508 RET
(0093) }
(0094)
(0095) /* 发送显示4字节*/
(0096) void sendFOURbeyt()
(0097) { LED3;
_sendFOURbeyt:
0172 E183 LDI R24,0x13
0173 BB82 OUT 0x12,R24
(0098) sendbeyt(SEG_table[Sec_buffer[0]]);
0174 E286 LDI R24,0x26
0175 E090 LDI R25,0
0176 91E0006E LDS R30,Sec_buffer
0178 27FF CLR R31
0179 0FE8 ADD R30,R24
017A 1FF9 ADC R31,R25
017B 9104 LPM R16,0(Z)
017C DFD7 RCALL _sendbeyt
(0099) delay_nus(200);
017D EC08 LDI R16,0xC8
017E E010 LDI R17,0
017F DF87 RCALL _delay_nus
(0100) LED4;
0180 E283 LDI R24,0x23
0181 BB82 OUT 0x12,R24
(0101) sendbeyt(SEG_table[Sec_buffer[1]]);
0182 E286 LDI R24,0x26
0183 E090 LDI R25,0
0184 91E0006F LDS R30,Sec_buffer+1
0186 27FF CLR R31
0187 0FE8 ADD R30,R24
0188 1FF9 ADC R31,R25
0189 9104 LPM R16,0(Z)
018A DFC9 RCALL _sendbeyt
(0102) delay_nus(200);
018B EC08 LDI R16,0xC8
018C E010 LDI R17,0
018D DF79 RCALL _delay_nus
(0103) LED1;
018E E087 LDI R24,7
018F BB82 OUT 0x12,R24
(0104) sendbeyt(SEG_table[Min_buffer[0]]);
0190 E286 LDI R24,0x26
0191 E090 LDI R25,0
0192 91E00072 LDS R30,Min_buffer
0194 27FF CLR R31
0195 0FE8 ADD R30,R24
0196 1FF9 ADC R31,R25
0197 9104 LPM R16,0(Z)
0198 DFBB RCALL _sendbeyt
(0105) delay_nus(200);
0199 EC08 LDI R16,0xC8
019A E010 LDI R17,0
019B DF6B RCALL _delay_nus
(0106) LED2;
019C E08B LDI R24,0xB
019D BB82 OUT 0x12,R24
(0107) sendbeyt(SEG_table[Min_buffer[1]]);
019E E286 LDI R24,0x26
019F E090 LDI R25,0
01A0 91E00073 LDS R30,Min_buffer+1
01A2 27FF CLR R31
01A3 0FE8 ADD R30,R24
01A4 1FF9 ADC R31,R25
01A5 9104 LPM R16,0(Z)
01A6 DFAD RCALL _sendbeyt
(0108) delay_nus(200);
01A7 EC08 LDI R16,0xC8
01A8 E010 LDI R17,0
01A9 DF5D RCALL _delay_nus
(0109) LED0;
01AA E083 LDI R24,3
01AB BB82 OUT 0x12,R24
(0110) delay_nus(200);
01AC EC08 LDI R16,0xC8
01AD E010 LDI R17,0
01AE DF58 RCALL _delay_nus
01AF 9508 RET
_timer1_ovf_isr:
01B0 D07B RCALL push_lset
(0111) }
(0112) /*******************************************************************************
(0113) 中断送显程序
(0114)
(0115) ******************************************************************************/
(0116) #pragma interrupt_handler timer1_ovf_isr:9
(0117) void timer1_ovf_isr(void)
(0118) {
(0119) sendFOURbeyt();
01B1 DFC0 RCALL _sendFOURbeyt
(0120) //TIMER1 has overflowed
(0121) TCNT1H = 0xFC; //reload counter high value
01B2 EF8C LDI R24,0xFC
01B3 BD8D OUT 0x2D,R24
(0122) TCNT1L = 0x18; //reload counter low value
01B4 E188 LDI R24,0x18
01B5 BD8C OUT 0x2C,R24
01B6 D08C RCALL pop_lset
01B7 9518 RETI
_BINtoArray:
temp --> R20
i --> R22
count --> R10
p --> R12
01B8 D056 RCALL push_gset4
01B9 0159 MOVW R10,R18
01BA 0168 MOVW R12,R16
(0123) }
(0124) /******************************************************************************
(0125) BCD分解为数组元素
(0126) ***************************************************************************/
(0127) void BINtoArray(char *p,unsigned int count)
(0128) { unsigned char i,temp;
(0129) CLI();
01BB 94F8 BCLR 7
(0130) for(i=0;i<4;i++)
01BC 2766 CLR R22
01BD C010 RJMP 0x01CE
(0131) {
(0132) temp=count%10;
01BE E02A LDI R18,0xA
01BF E030 LDI R19,0
01C0 0185 MOVW R16,R10
01C1 D029 RCALL mod16u
01C2 2F40 MOV R20,R16
(0133) *p=temp;
01C3 01F6 MOVW R30,R12
01C4 8340 STD Z+0,R20
(0134) count=count/10;
01C5 E02A LDI R18,0xA
01C6 E030 LDI R19,0
01C7 0185 MOVW R16,R10
01C8 D024 RCALL div16u
01C9 0158 MOVW R10,R16
(0135) p++;
01CA 01C6 MOVW R24,R12
01CB 9601 ADIW R24,1
01CC 016C MOVW R12,R24
01CD 9563 INC R22
01CE 3064 CPI R22,4
01CF F370 BCS 0x01BE
(0136) }
(0137) SEI();
01D0 9478 BSET 7
01D1 D037 RCALL pop_gset4
01D2 9508 RET
(0138) }
(0139)
(0140) void main()
(0141) {char CO=0;
_main:
CO --> R20
01D3 2744 CLR R20
(0142) init_devices();
01D4 DF75 RCALL _init_devices
(0143) DS1302_WriteTime(); //时间校准
01D5 DF1A RCALL _DS1302_WriteTime
01D6 C012 RJMP 0x01E9
(0144) while(1)
(0145) {
(0146) DS1302_ReadTime();
01D7 DEE7 RCALL _DS1302_ReadTime
(0147) BINtoArray(Sec_buffer,second);
01D8 91200082 LDS R18,second
01DA 91300083 LDS R19,second+1
01DC E60E LDI R16,0x6E
01DD E010 LDI R17,0
01DE DFD9 RCALL _BINtoArray
(0148) BINtoArray(Min_buffer,date);
01DF 9120007C LDS R18,date
01E1 9130007D LDS R19,date+1
01E3 E702 LDI R16,0x72
01E4 E010 LDI R17,0
01E5 DFD2 RCALL _BINtoArray
(0149) delay_nus(1);
FILE: <library>
01E6 E001 LDI R16,1
01E7 E010 LDI R17,0
01E8 DF1E RCALL _delay_nus
01E9 CFED RJMP 0x01D7
01EA 9508 RET
mod16u:
01EB 9468 BSET 6
01EC C001 RJMP xdiv16u
div16u:
01ED 94E8 BCLR 6
xdiv16u:
01EE 92EA ST R14,-Y
01EF 92FA ST R15,-Y
01F0 938A ST R24,-Y
01F1 24EE CLR R14
01F2 24FF CLR R15
01F3 E180 LDI R24,0x10
01F4 0F00 LSL R16
01F5 1F11 ROL R17
01F6 1CEE ROL R14
01F7 1CFF ROL R15
01F8 16E2 CP R14,R18
01F9 06F3 CPC R15,R19
01FA F018 BCS 0x01FE
01FB 1AE2 SUB R14,R18
01FC 0AF3 SBC R15,R19
01FD 9503 INC R16
01FE 958A DEC R24
01FF F7A1 BNE 0x01F4
0200 F416 BRTC 0x0203
0201 2D0E MOV R16,R14
0202 2D1F MOV R17,R15
0203 9189 LD R24,Y+
0204 90F9 LD R15,Y+
0205 90E9 LD R14,Y+
0206 9508 RET
pop_gset2:
0207 E0E2 LDI R30,2
0208 C010 RJMP pop
pop_gset4:
0209 E0E8 LDI R30,0x8
020A C00E RJMP pop
pop_gset5:
020B 27EE CLR R30
020C C00C RJMP pop
push_gset5:
020D 92FA ST R15,-Y
020E 92EA ST R14,-Y
push_gset4:
020F 92DA ST R13,-Y
0210 92CA ST R12,-Y
push_gset3:
0211 92BA ST R11,-Y
0212 92AA ST R10,-Y
push_gset2:
0213 937A ST R23,-Y
0214 936A ST R22,-Y
push_gset1:
0215 935A ST R21,-Y
0216 934A ST R20,-Y
0217 9508 RET
pop_gset1:
0218 E0E1 LDI R30,1
pop:
0219 9149 LD R20,Y+
021A 9159 LD R21,Y+
021B FDE0 SBRC R30,0
021C 9508 RET
021D 9169 LD R22,Y+
021E 9179 LD R23,Y+
021F FDE1 SBRC R30,1
0220 9508 RET
0221 90A9 LD R10,Y+
0222 90B9 LD R11,Y+
0223 FDE2 SBRC R30,2
0224 9508 RET
0225 90C9 LD R12,Y+
0226 90D9 LD R13,Y+
0227 FDE3 SBRC R30,3
0228 9508 RET
0229 90E9 LD R14,Y+
022A 90F9 LD R15,Y+
022B 9508 RET
push_lset:
022C 93FA ST R31,-Y
022D 93EA ST R30,-Y
022E 93BA ST R27,-Y
022F 93AA ST R26,-Y
0230 939A ST R25,-Y
0231 938A ST R24,-Y
0232 933A ST R19,-Y
0233 932A ST R18,-Y
0234 931A ST R17,-Y
0235 930A ST R16,-Y
0236 929A ST R9,-Y
0237 928A ST R8,-Y
0238 927A ST R7,-Y
0239 926A ST R6,-Y
023A 925A ST R5,-Y
023B 924A ST R4,-Y
023C 923A ST R3,-Y
023D 922A ST R2,-Y
023E 921A ST R1,-Y
023F 920A ST R0,-Y
0240 B60F IN R0,0x3F
0241 920A ST R0,-Y
0242 9508 RET
pop_lset:
0243 9009 LD R0,Y+
0244 BE0F OUT 0x3F,R0
0245 9009 LD R0,Y+
0246 9019 LD R1,Y+
0247 9029 LD R2,Y+
0248 9039 LD R3,Y+
0249 9049 LD R4,Y+
024A 9059 LD R5,Y+
024B 9069 LD R6,Y+
024C 9079 LD R7,Y+
024D 9089 LD R8,Y+
024E 9099 LD R9,Y+
024F 9109 LD R16,Y+
0250 9119 LD R17,Y+
0251 9129 LD R18,Y+
0252 9139 LD R19,Y+
0253 9189 LD R24,Y+
0254 9199 LD R25,Y+
0255 91A9 LD R26,Y+
0256 91B9 LD R27,Y+
0257 91E9 LD R30,Y+
0258 91F9 LD R31,Y+
0259 9508 RET
lsl16:
025A 2322 TST R18
025B F021 BEQ 0x0260
025C 0F00 LSL R16
025D 1F11 ROL R17
025E 952A DEC R18
025F CFFA RJMP lsl16
0260 9508 RET
lsl8:
0261 2311 TST R17
0262 F019 BEQ 0x0266
0263 0F00 LSL R16
0264 951A DEC R17
0265 CFFB RJMP lsl8
0266 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -