📄 main.lst
字号:
00F7 2433 CLR R3
00F8 2628 EOR R2,R24
00F9 2639 EOR R3,R25
00FA BA22 OUT 0x12,R2
00FB 9508 RET
(0169) }
(0170)
(0171) void flash_led_type4(void) //PD口的跑马灯显示 流水
(0172) {
(0173) unsigned char tmp_PD;
(0174) tmp_PD=PIND;
_flash_led_type4:
tmp_PD --> R16
00FC B300 IN R16,0x10
(0175) tmp_PD|=0XFC;
00FD 6F0C ORI R16,0xFC
(0176) led_ch++;
00FE 91800060 LDS R24,led_ch
0100 5F8F SUBI R24,0xFF
0101 93800060 STS led_ch,R24
(0177) if (led_ch==0X87) led_ch=0X80;
0103 3887 CPI R24,0x87
0104 F419 BNE 0x0108
0105 E880 LDI R24,0x80
0106 93800060 STS led_ch,R24
(0178) switch (led_ch)
0108 91000060 LDS R16,led_ch
010A 2711 CLR R17
010B 3801 CPI R16,0x81
010C E0E0 LDI R30,0
010D 071E CPC R17,R30
010E F0A9 BEQ 0x0124
010F 3802 CPI R16,0x82
0110 E0E0 LDI R30,0
0111 071E CPC R17,R30
0112 F0A1 BEQ 0x0127
0113 3803 CPI R16,0x83
0114 E0E0 LDI R30,0
0115 071E CPC R17,R30
0116 F0A1 BEQ 0x012B
0117 3804 CPI R16,0x84
0118 E0E0 LDI R30,0
0119 071E CPC R17,R30
011A F0A1 BEQ 0x012F
011B 3805 CPI R16,0x85
011C E0E0 LDI R30,0
011D 071E CPC R17,R30
011E F0A1 BEQ 0x0133
011F 3806 CPI R16,0x86
0120 E0E0 LDI R30,0
0121 071E CPC R17,R30
0122 F0A1 BEQ 0x0137
0123 C015 RJMP 0x0139
(0179) {
(0180)
(0181) case 0X81: PORTD=~(0X78); break; //0111 10 00 代码
0124 E887 LDI R24,0x87
0125 BB82 OUT 0x12,R24
0126 C012 RJMP 0x0139
(0182) case 0X82: PORTD=~(0XD4); break; //1011 01 00 代码
0127 E28B LDI R24,0x2B
0128 EF9F LDI R25,0xFF
0129 BB82 OUT 0x12,R24
012A C00E RJMP 0x0139
(0183) case 0X83: PORTD=~(0XCC); break; //1100 11 00 代码
012B E383 LDI R24,0x33
012C EF9F LDI R25,0xFF
012D BB82 OUT 0x12,R24
012E C00A RJMP 0x0139
(0184) case 0X84: PORTD=~(0XCC); break; //1100 11 00 代码
012F E383 LDI R24,0x33
0130 EF9F LDI R25,0xFF
0131 BB82 OUT 0x12,R24
0132 C006 RJMP 0x0139
(0185) case 0X85: PORTD=~(0XD4); break; //1011 01 00 代码
0133 E28B LDI R24,0x2B
0134 EF9F LDI R25,0xFF
0135 BB82 OUT 0x12,R24
0136 C002 RJMP 0x0139
(0186) case 0X86: PORTD=~(0X78); break; //0111 10 00 代码
0137 E887 LDI R24,0x87
0138 BB82 OUT 0x12,R24
0139 9508 RET
(0187) }
(0188) }
(0189)
(0190)
(0191) void delay30ms(void) //延时30毫秒的子程序
(0192) {
(0193) unsigned int tmp_delay_cn;
(0194) for (tmp_delay_cn=0;tmp_delay_cn<300;tmp_delay_cn++)
_delay30ms:
tmp_delay_cn --> R16
013A 2700 CLR R16
013B 2711 CLR R17
013C C002 RJMP 0x013F
013D 5F0F SUBI R16,0xFF
013E 4F1F SBCI R17,0xFF
013F 320C CPI R16,0x2C
0140 E0E1 LDI R30,1
0141 071E CPC R17,R30
0142 F3D0 BCS 0x013D
0143 9508 RET
(0195) ;
(0196) }
(0197)
(0198)
(0199) unsigned char check_key_pressed(void) //检查是否有键盘按下
(0200) {
(0201) unsigned char key_tem;
(0202) key_tem=PINA &= ~(0XC3);
_check_key_pressed:
key_tem --> R16
0144 B389 IN R24,0x19
0145 738C ANDI R24,0x3C
0146 BB89 OUT 0x19,R24
0147 2F08 MOV R16,R24
(0203) if(key_tem!=0X3C)
0148 338C CPI R24,0x3C
0149 F011 BEQ 0x014C
(0204) return 1;
014A E001 LDI R16,1
014B C001 RJMP 0x014D
(0205) else
(0206) return 0;
014C 2700 CLR R16
014D 9508 RET
_find_key_code:
uuu --> R20
014E 940E01C6 CALL push_gset1
(0207) }
(0208)
(0209)
(0210) unsigned char find_key_code(void)
(0211) {
(0212) unsigned char uuu;
(0213) if(check_key_pressed()==1)
0150 DFF3 RCALL _check_key_pressed
0151 3001 CPI R16,1
0152 F441 BNE 0x015B
(0214) {
(0215) delay30ms(); //延时去抖动
0153 DFE6 RCALL _delay30ms
(0216) if(check_key_pressed()==1)
0154 DFEF RCALL _check_key_pressed
0155 3001 CPI R16,1
0156 F421 BNE 0x015B
(0217) {
(0218) uuu=(PINA & 0X3C);
0157 B349 IN R20,0x19
0158 734C ANDI R20,0x3C
(0219) return uuu; //屏蔽最高和最低两位
0159 2F04 MOV R16,R20
015A C001 RJMP 0x015C
(0220) }
(0221) }
(0222) return 0XC3;
015B EC03 LDI R16,0xC3
015C 940E01C9 CALL pop_gset1
015E 9508 RET
_timer0_ovf_isr:
015F 940E01DD CALL push_lset
0161 940E01C6 CALL push_gset1
(0223) }
(0224)
(0225) #pragma interrupt_handler timer0_ovf_isr:10 //
(0226) void timer0_ovf_isr(void)
(0227) {
(0228) TCNT0 = 0xB2; //计数器初始值重载
0163 EB82 LDI R24,0xB2
0164 BF82 OUT 0x32,R24
(0229) if (tmp_cn_0==100) //固定时间产生变化
0165 91800064 LDS R24,tmp_cn_0
0167 3684 CPI R24,0x64
0168 F009 BEQ 0x016A
0169 C03E RJMP 0x01A8
(0230) {
(0231) switch (key_code) //根据按下的键盘产生一定的闪灯花样
016A 91400062 LDS R20,key_code
016C 2755 CLR R21
016D 324C CPI R20,0x2C
016E E0E0 LDI R30,0
016F 075E CPC R21,R30
0170 F0C9 BEQ 0x018A
0171 E28C LDI R24,0x2C
0172 E090 LDI R25,0
0173 1784 CP R24,R20
0174 0795 CPC R25,R21
0175 F02C BLT 0x017B
0176 314C CPI R20,0x1C
0177 E0E0 LDI R30,0
0178 075E CPC R21,R30
0179 F071 BEQ 0x0188
017A C015 RJMP 0x0190
017B 3344 CPI R20,0x34
017C E0E0 LDI R30,0
017D 075E CPC R21,R30
017E F069 BEQ 0x018C
017F 3344 CPI R20,0x34
0180 E0E0 LDI R30,0
0181 075E CPC R21,R30
0182 F06C BLT 0x0190
0183 3348 CPI R20,0x38
0184 E0E0 LDI R30,0
0185 075E CPC R21,R30
0186 F039 BEQ 0x018E
0187 C008 RJMP 0x0190
(0232) {
(0233) case 0X1C: flash_led_type4(); break;
0188 DF73 RCALL _flash_led_type4
0189 C007 RJMP 0x0191
(0234) case 0X2c: flash_led_type3(); break;
018A DF69 RCALL _flash_led_type3
018B C005 RJMP 0x0191
(0235) case 0X34: flash_led_type2(); break;
018C DF56 RCALL _flash_led_type2
018D C003 RJMP 0x0191
(0236) case 0X38: flash_led_type1(); break;
018E DF43 RCALL _flash_led_type1
018F C001 RJMP 0x0191
(0237) default: flash_led_type4(); break;
0190 DF6B RCALL _flash_led_type4
(0238) }
(0239)
(0240) disp_led(LED_INDEX[tmp_led_index]); //循环显示8段数字LED
0191 E584 LDI R24,0x54
0192 E090 LDI R25,0
0193 91E00061 LDS R30,tmp_led_index
0195 27FF CLR R31
0196 0FE8 ADD R30,R24
0197 1FF9 ADC R31,R25
0198 9104 LPM R16,0(Z)
0199 DF04 RCALL _disp_led
(0241) tmp_led_index++;
019A 91800061 LDS R24,tmp_led_index
019C 5F8F SUBI R24,0xFF
019D 93800061 STS tmp_led_index,R24
(0242) if (tmp_led_index==10) tmp_led_index=0; //LED计数器归零
019F 308A CPI R24,0xA
01A0 F419 BNE 0x01A4
01A1 2422 CLR R2
01A2 92200061 STS tmp_led_index,R2
(0243)
(0244) tmp_cn_0=0; //临时计数器0归零
01A4 2422 CLR R2
01A5 92200064 STS tmp_cn_0,R2
(0245) }
01A7 C005 RJMP 0x01AD
(0246) else
(0247) {
(0248) tmp_cn_0=tmp_cn_0+1; //临时计数器递增
01A8 91800064 LDS R24,tmp_cn_0
01AA 5F8F SUBI R24,0xFF
01AB 93800064 STS tmp_cn_0,R24
(0249) }
01AD 940E01C9 CALL pop_gset1
01AF 940E01F4 CALL pop_lset
01B1 9518 RETI
(0250) }
(0251)
(0252)
(0253) //****************** MAIN 程序的入口*************************//
(0254)
(0255) void main()
(0256) {
(0257) unsigned char tmp_key_code;
(0258) init_devices();
_main:
tmp_key_code --> R20
01B2 DF0F RCALL _init_devices
01B3 C008 RJMP 0x01BC
(0259) while(1)
(0260) {
(0261) start_adc_0(); //循环进行ADC转换
01B4 DEDC RCALL _start_adc_0
(0262)
(0263) tmp_key_code=find_key_code() & 0X3C; //判断是否按下键盘
01B5 DF98 RCALL _find_key_code
01B6 2F40 MOV R20,R16
01B7 734C ANDI R20,0x3C
(0264)
(0265) if (tmp_key_code!=0x3c) key_code=tmp_key_code;
FILE: <library>
01B8 334C CPI R20,0x3C
01B9 F011 BEQ 0x01BC
01BA 93400062 STS key_code,R20
01BC CFF7 RJMP 0x01B4
01BD 9508 RET
push_gset5:
01BE 92FA ST R15,-Y
01BF 92EA ST R14,-Y
push_gset4:
01C0 92DA ST R13,-Y
01C1 92CA ST R12,-Y
push_gset3:
01C2 92BA ST R11,-Y
01C3 92AA ST R10,-Y
push_gset2:
01C4 937A ST R23,-Y
01C5 936A ST R22,-Y
push_gset1:
01C6 935A ST R21,-Y
01C7 934A ST R20,-Y
01C8 9508 RET
pop_gset1:
01C9 E0E1 LDI R30,1
pop:
01CA 9149 LD R20,Y+
01CB 9159 LD R21,Y+
01CC FDE0 SBRC R30,0
01CD 9508 RET
01CE 9169 LD R22,Y+
01CF 9179 LD R23,Y+
01D0 FDE1 SBRC R30,1
01D1 9508 RET
01D2 90A9 LD R10,Y+
01D3 90B9 LD R11,Y+
01D4 FDE2 SBRC R30,2
01D5 9508 RET
01D6 90C9 LD R12,Y+
01D7 90D9 LD R13,Y+
01D8 FDE3 SBRC R30,3
01D9 9508 RET
01DA 90E9 LD R14,Y+
01DB 90F9 LD R15,Y+
01DC 9508 RET
push_lset:
01DD 93FA ST R31,-Y
01DE 93EA ST R30,-Y
01DF 93BA ST R27,-Y
01E0 93AA ST R26,-Y
01E1 939A ST R25,-Y
01E2 938A ST R24,-Y
01E3 933A ST R19,-Y
01E4 932A ST R18,-Y
01E5 931A ST R17,-Y
01E6 930A ST R16,-Y
01E7 929A ST R9,-Y
01E8 928A ST R8,-Y
01E9 927A ST R7,-Y
01EA 926A ST R6,-Y
01EB 925A ST R5,-Y
01EC 924A ST R4,-Y
01ED 923A ST R3,-Y
01EE 922A ST R2,-Y
01EF 921A ST R1,-Y
01F0 920A ST R0,-Y
01F1 B60F IN R0,0x3F
01F2 920A ST R0,-Y
01F3 9508 RET
pop_lset:
01F4 9009 LD R0,Y+
01F5 BE0F OUT 0x3F,R0
01F6 9009 LD R0,Y+
01F7 9019 LD R1,Y+
01F8 9029 LD R2,Y+
01F9 9039 LD R3,Y+
01FA 9049 LD R4,Y+
01FB 9059 LD R5,Y+
01FC 9069 LD R6,Y+
01FD 9079 LD R7,Y+
01FE 9089 LD R8,Y+
01FF 9099 LD R9,Y+
0200 9109 LD R16,Y+
0201 9119 LD R17,Y+
0202 9129 LD R18,Y+
0203 9139 LD R19,Y+
0204 9189 LD R24,Y+
0205 9199 LD R25,Y+
0206 91A9 LD R26,Y+
0207 91B9 LD R27,Y+
0208 91E9 LD R30,Y+
0209 91F9 LD R31,Y+
020A 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -