📄 m16wdt.lst
字号:
009C 9508 RET
_SPI595Out:
i --> R20
009D 940E0188 CALL push_gset1
009F 2F40 MOV R20,R16
(0080) }
(0081) /*-----------------------------------------------------------------
(0082) 函数名称: void SPI595Out(unsigned char i)
(0083) 函数功能: 通过74HC595输出数据
(0084) 参 数:
(0085) 返 回 值: 无
(0086) -----------------------------------------------------------------*/
(0087) void SPI595Out(unsigned char i)
(0088) {
(0089) PORTB &= ~(1 << 4); //准备锁存
00A0 98C4 CBI 0x18,4
(0090) SPIMasterTransmit(i);
00A1 2F04 MOV R16,R20
00A2 DFF6 RCALL _SPIMasterTransmit
(0091) PORTB |= (1 << 4); //锁存数据
00A3 9AC4 SBI 0x18,4
00A4 940E018B CALL pop_gset1
00A6 9508 RET
(0092) }
(0093) /*-----------------------------------------------------------------
(0094) 函数名称: void Timer1Init(void)
(0095) 函数功能: 定时器1初始化 256预分频 定时一秒
(0096) 参 数:
(0097) 返 回 值: 无
(0098) -----------------------------------------------------------------*/
(0099) void Timer1Init(void)
(0100) {
(0101) TCCR1B = 0x00; //关定时器
_Timer1Init:
00A7 2422 CLR R2
00A8 BC2E OUT 0x2E,R2
(0102) TCNT1H = 0xF0; //设置定时初值
00A9 EF80 LDI R24,0xF0
00AA BD8D OUT 0x2D,R24
(0103) TCNT1L = 0xBE;
00AB EB8E LDI R24,0xBE
00AC BD8C OUT 0x2C,R24
(0104) OCR1AH = 0x0F;
00AD E08F LDI R24,0xF
00AE BD8B OUT 0x2B,R24
(0105) OCR1AL = 0x42;
00AF E482 LDI R24,0x42
00B0 BD8A OUT 0x2A,R24
(0106) OCR1BH = 0x0F;
00B1 E08F LDI R24,0xF
00B2 BD89 OUT 0x29,R24
(0107) OCR1BL = 0x42;
00B3 E482 LDI R24,0x42
00B4 BD88 OUT 0x28,R24
(0108) ICR1H = 0x0F;
00B5 E08F LDI R24,0xF
00B6 BD87 OUT 0x27,R24
(0109) ICR1L = 0x42;
00B7 E482 LDI R24,0x42
00B8 BD86 OUT 0x26,R24
(0110) TCCR1A = 0x00;
00B9 BC2F OUT 0x2F,R2
(0111) TCCR1B = 0x04; //开始计数
00BA E084 LDI R24,4
00BB BD8E OUT 0x2E,R24
00BC 9508 RET
_timer1_ovf_isr:
00BD 938A ST R24,-Y
00BE 939A ST R25,-Y
00BF B78F IN R24,0x3F
00C0 938A ST R24,-Y
(0112) }
(0113)
(0114) #pragma interrupt_handler timer1_ovf_isr:9
(0115) void timer1_ovf_isr(void)
(0116) {
(0117) TCNT1H = 0xF0; //重新装载计数值
00C1 EF80 LDI R24,0xF0
00C2 BD8D OUT 0x2D,R24
(0118) TCNT1L = 0xBE;
00C3 EB8E LDI R24,0xBE
00C4 BD8C OUT 0x2C,R24
(0119) TimerCnt++;
00C5 91800060 LDS R24,TimerCnt
00C7 5F8F SUBI R24,0xFF
00C8 93800060 STS TimerCnt,R24
00CA 9189 LD R24,Y+
00CB BF8F OUT 0x3F,R24
00CC 9199 LD R25,Y+
00CD 9189 LD R24,Y+
00CE 9518 RETI
(0120) }
(0121) /*-----------------------------------------------------------------
(0122) 函数名称: void InitDevices(void)
(0123) 函数功能: 初始化各种信息
(0124) 参 数:
(0125) 返 回 值: 无
(0126) -----------------------------------------------------------------*/
(0127) void InitDevices(void)
(0128) {
(0129) CLI();
_InitDevices:
00CF 94F8 BCLR 7
(0130) WdtInit(); //关全部中断
00D0 DFBE RCALL _WdtInit
(0131) SPIMasterInit(); //SPI初始化为主机
00D1 DFC1 RCALL _SPIMasterInit
(0132) Timer1Init();
00D2 DFD4 RCALL _Timer1Init
(0133) WdtInit();
00D3 DFBB RCALL _WdtInit
(0134)
(0135) TIMSK = 0x04; //timer interrupt sources
00D4 E084 LDI R24,4
00D5 BF89 OUT 0x39,R24
(0136) SEI(); //开中断
00D6 9478 BSET 7
00D7 9508 RET
(0137) }
(0138)
(0139) void main(void)
(0140) {
(0141) uchar temp;
(0142) DDRA = 0x00; //方向输入
_main:
temp --> R20
00D8 2422 CLR R2
00D9 BA2A OUT 0x1A,R2
(0143) PORTA = 0xFF; //打开上拉
00DA EF8F LDI R24,0xFF
00DB BB8B OUT 0x1B,R24
(0144) DDRB = 0xFF; //方向输出
00DC BB87 OUT 0x17,R24
(0145) PORTB = 0xF0; //电平设置
00DD EF80 LDI R24,0xF0
00DE BB88 OUT 0x18,R24
(0146) DDRC = 0x00;
00DF BA24 OUT 0x14,R2
(0147) PORTC = 0xFF;
00E0 EF8F LDI R24,0xFF
00E1 BB85 OUT 0x15,R24
(0148) DDRD = 0xFF;
00E2 BB81 OUT 0x11,R24
(0149) PORTD = 0xFF;
00E3 BB82 OUT 0x12,R24
(0150) InitDevices();
00E4 DFEA RCALL _InitDevices
00E5 C080 RJMP 0x0166
(0151)
(0152) while (1)
(0153) {
(0154) if( TimerCnt > 9)
00E6 E089 LDI R24,0x9
00E7 90200060 LDS R2,TimerCnt
00E9 1582 CP R24,R2
00EA F008 BCS 0x00EC
00EB C06A RJMP 0x0156
(0155) {
(0156) if( TimerCnt > 99)
00EC E683 LDI R24,0x63
00ED 1582 CP R24,R2
00EE F008 BCS 0x00F0
00EF C03E RJMP 0x012E
(0157) {
(0158) DDRB = 0xff;
00F0 EF8F LDI R24,0xFF
00F1 BB87 OUT 0x17,R24
(0159) PORTB = 0xff;
00F2 BB88 OUT 0x18,R24
(0160) temp = TimerCnt / 100;
00F3 E614 LDI R17,0x64
00F4 2D02 MOV R16,R2
00F5 940E016A CALL div8u
00F7 2F40 MOV R20,R16
(0161) SPI595Out(disp[temp]);
00F8 E681 LDI R24,0x61
00F9 E090 LDI R25,0
00FA 2FE4 MOV R30,R20
00FB 27FF CLR R31
00FC 0FE8 ADD R30,R24
00FD 1FF9 ADC R31,R25
00FE 8100 LDD R16,Z+0
00FF DF9D RCALL _SPI595Out
(0162) PORTB = 0xfb;
0100 EF8B LDI R24,0xFB
0101 BB88 OUT 0x18,R24
(0163) DelayMs(1);
0102 E001 LDI R16,1
0103 DF7A RCALL _DelayMs
(0164) PORTB = 0xff;
0104 EF8F LDI R24,0xFF
0105 BB88 OUT 0x18,R24
(0165) temp = TimerCnt%100/10;
0106 E614 LDI R17,0x64
0107 91000060 LDS R16,TimerCnt
0109 940E0168 CALL mod8u
010B E01A LDI R17,0xA
010C 940E016A CALL div8u
010E 2F40 MOV R20,R16
(0166) SPI595Out(disp[temp]);
010F E681 LDI R24,0x61
0110 E090 LDI R25,0
0111 2FE4 MOV R30,R20
0112 27FF CLR R31
0113 0FE8 ADD R30,R24
0114 1FF9 ADC R31,R25
0115 8100 LDD R16,Z+0
0116 DF86 RCALL _SPI595Out
(0167) PORTB = 0xfd;
0117 EF8D LDI R24,0xFD
0118 BB88 OUT 0x18,R24
(0168) DelayMs(1);
0119 E001 LDI R16,1
011A DF63 RCALL _DelayMs
(0169) PORTB = 0xff;
011B EF8F LDI R24,0xFF
011C BB88 OUT 0x18,R24
(0170) temp = TimerCnt%10;
011D E01A LDI R17,0xA
011E 91000060 LDS R16,TimerCnt
0120 940E0168 CALL mod8u
0122 2F40 MOV R20,R16
(0171) SPI595Out(disp[temp]);
0123 E681 LDI R24,0x61
0124 E090 LDI R25,0
0125 2FE4 MOV R30,R20
0126 27FF CLR R31
0127 0FE8 ADD R30,R24
0128 1FF9 ADC R31,R25
0129 8100 LDD R16,Z+0
012A DF72 RCALL _SPI595Out
(0172) PORTB = 0xfe;
012B EF8E LDI R24,0xFE
012C BB88 OUT 0x18,R24
(0173) }
012D C035 RJMP 0x0163
(0174)
(0175) else
(0176) {
(0177) DDRB = 0xff;
012E EF8F LDI R24,0xFF
012F BB87 OUT 0x17,R24
(0178) PORTB = 0xff;
0130 BB88 OUT 0x18,R24
(0179) temp = TimerCnt/10;
0131 E01A LDI R17,0xA
0132 91000060 LDS R16,TimerCnt
0134 940E016A CALL div8u
0136 2F40 MOV R20,R16
(0180) SPI595Out(disp[temp]);
0137 E681 LDI R24,0x61
0138 E090 LDI R25,0
0139 2FE4 MOV R30,R20
013A 27FF CLR R31
013B 0FE8 ADD R30,R24
013C 1FF9 ADC R31,R25
013D 8100 LDD R16,Z+0
013E DF5E RCALL _SPI595Out
(0181) PORTB = 0xfd;
013F EF8D LDI R24,0xFD
0140 BB88 OUT 0x18,R24
(0182) DelayMs(1);
0141 E001 LDI R16,1
0142 DF3B RCALL _DelayMs
(0183) PORTB = 0xff;
0143 EF8F LDI R24,0xFF
0144 BB88 OUT 0x18,R24
(0184) temp = TimerCnt%10;
0145 E01A LDI R17,0xA
0146 91000060 LDS R16,TimerCnt
0148 940E0168 CALL mod8u
014A 2F40 MOV R20,R16
(0185) SPI595Out(disp[temp]);
014B E681 LDI R24,0x61
014C E090 LDI R25,0
014D 2FE4 MOV R30,R20
014E 27FF CLR R31
014F 0FE8 ADD R30,R24
0150 1FF9 ADC R31,R25
0151 8100 LDD R16,Z+0
0152 DF4A RCALL _SPI595Out
(0186) PORTB = 0xfe;
0153 EF8E LDI R24,0xFE
0154 BB88 OUT 0x18,R24
(0187) }
(0188) }
0155 C00D RJMP 0x0163
(0189)
(0190) else
(0191) {
(0192) DDRB = 0xff;
0156 EF8F LDI R24,0xFF
0157 BB87 OUT 0x17,R24
(0193) PORTB = 0xfe;
0158 EF8E LDI R24,0xFE
0159 BB88 OUT 0x18,R24
(0194) SPI595Out(disp[TimerCnt]);
015A E681 LDI R24,0x61
015B E090 LDI R25,0
015C 91E00060 LDS R30,TimerCnt
015E 27FF CLR R31
015F 0FE8 ADD R30,R24
0160 1FF9 ADC R31,R25
0161 8100 LDD R16,Z+0
0162 DF3A RCALL _SPI595Out
(0195) }
(0196) DelayMs(1);
0163 E001 LDI R16,1
0164 DF19 RCALL _DelayMs
(0197) asm("wdr"); //喂狗,去除此句将导致MCU复位,从而数据不会向上加
FILE: <library>
0165 95A8 WDR
0166 CF7F RJMP 0x00E6
0167 9508 RET
mod8u:
0168 9468 BSET 6
0169 C001 RJMP xdiv8u
div8u:
016A 94E8 BCLR 6
xdiv8u:
016B 932A ST R18,-Y
016C 92FA ST R15,-Y
016D 92EA ST R14,-Y
016E 24FF CLR R15
016F 24EE CLR R14
0170 E120 LDI R18,0x10
0171 0F00 LSL R16
0172 1CFF ROL R15
0173 1CEE ROL R14
0174 16E1 CP R14,R17
0175 F010 BCS 0x0178
0176 1AE1 SUB R14,R17
0177 9503 INC R16
0178 952A DEC R18
0179 F7B9 BNE 0x0171
017A F40E BRTC 0x017C
017B 2D0E MOV R16,R14
017C 90E9 LD R14,Y+
017D 90F9 LD R15,Y+
017E 9129 LD R18,Y+
017F 9508 RET
push_gset5:
0180 92FA ST R15,-Y
0181 92EA ST R14,-Y
push_gset4:
0182 92DA ST R13,-Y
0183 92CA ST R12,-Y
push_gset3:
0184 92BA ST R11,-Y
0185 92AA ST R10,-Y
push_gset2:
0186 937A ST R23,-Y
0187 936A ST R22,-Y
push_gset1:
0188 935A ST R21,-Y
0189 934A ST R20,-Y
018A 9508 RET
pop_gset1:
018B E0E1 LDI R30,1
pop:
018C 9149 LD R20,Y+
018D 9159 LD R21,Y+
018E FDE0 SBRC R30,0
018F 9508 RET
0190 9169 LD R22,Y+
0191 9179 LD R23,Y+
0192 FDE1 SBRC R30,1
0193 9508 RET
0194 90A9 LD R10,Y+
0195 90B9 LD R11,Y+
0196 FDE2 SBRC R30,2
0197 9508 RET
0198 90C9 LD R12,Y+
0199 90D9 LD R13,Y+
019A FDE3 SBRC R30,3
019B 9508 RET
019C 90E9 LD R14,Y+
019D 90F9 LD R15,Y+
019E 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -