📄 方波生成器.lst
字号:
014C F4A1 BNE 0x0161
(0040) {j = i;//保存本次采样结果
014D 934000BD STS j,R20
(0041) delay_nms(10);//去按键颤抖
014F E00A LDI R16,0xA
0150 E010 LDI R17,0
0151 DF43 RCALL _delay_nms
(0042) if((PIND&0x04)==0)i='A';
0152 9982 SBIC 0x10,2
0153 C002 RJMP 0x0156
0154 E441 LDI R20,0x41
0155 C005 RJMP 0x015B
(0043) else if((PIND&0x08)==0)i='B';
0156 9983 SBIC 0x10,3
0157 C002 RJMP 0x015A
0158 E442 LDI R20,0x42
0159 C001 RJMP 0x015B
(0044) else i=0x00;
015A 2744 CLR R20
(0045) if(i == j) {return i;}
015B 902000BD LDS R2,j
015D 1542 CP R20,R2
015E F411 BNE 0x0161
015F 2F04 MOV R16,R20
0160 C001 RJMP 0x0162
(0046) }
(0047) return 0x00;
0161 2700 CLR R16
0162 940E0289 CALL pop_gset1
0164 9508 RET
(0048) }
(0049)
(0050) void init_timer0(void)
(0051) {
(0052) DDRB|=0x08;//OC0匹配输出
_init_timer0:
0165 9ABB SBI 0x17,3
(0053) TCNT0=0x00;//清除定时器值
0166 2422 CLR R2
0167 BE22 OUT 0x32,R2
(0054) TCCR0=0x6d;//快速PWM模式,匹配时OC0清零,top时置数,系统时钟1024分频 频,输出比较匹配清除定时器值
0168 E68D LDI R24,0x6D
0169 BF83 OUT 0x33,R24
(0055)
(0056)
(0057) OCR0=0x80;//OCR0置初值,占空比50%
016A E880 LDI R24,0x80
016B BF8C OUT 0x3C,R24
016C 9508 RET
_F_set:
016D 940E0286 CALL push_gset1
016F 9722 SBIW R28,2
(0058)
(0059) }
(0060)
(0061)
(0062) void F_set(void)
(0063) {
(0064) static unsigned char i;
(0065) if(i!=5)i++;
0170 918000BE LDS R24,i
0172 3085 CPI R24,5
0173 F021 BEQ 0x0178
0174 5F8F SUBI R24,0xFF
0175 938000BE STS i,R24
0177 C003 RJMP 0x017B
(0066) else i=1;
0178 E081 LDI R24,1
0179 938000BE STS i,R24
(0067) switch(i)//频率选择
017B 914000BE LDS R20,i
017D 2755 CLR R21
017E 3041 CPI R20,1
017F E0E0 LDI R30,0
0180 075E CPC R21,R30
0181 F089 BEQ 0x0193
0182 3042 CPI R20,2
0183 E0E0 LDI R30,0
0184 075E CPC R21,R30
0185 F0B9 BEQ 0x019D
0186 3043 CPI R20,3
0187 E0E0 LDI R30,0
0188 075E CPC R21,R30
0189 F0E9 BEQ 0x01A7
018A 3044 CPI R20,4
018B E0E0 LDI R30,0
018C 075E CPC R21,R30
018D F119 BEQ 0x01B1
018E 3045 CPI R20,5
018F E0E0 LDI R30,0
0190 075E CPC R21,R30
0191 F149 BEQ 0x01BB
0192 C031 RJMP 0x01C4
(0068) {
(0069) case 1:
(0070) {
(0071) TCCR0=0x6d;
0193 E68D LDI R24,0x6D
0194 BF83 OUT 0x33,R24
(0072) LCD_write_string(6,0," 28HZ");
0195 EB85 LDI R24,0xB5
0196 E090 LDI R25,0
0197 8399 STD Y+1,R25
0198 8388 STD Y+0,R24
0199 2722 CLR R18
019A E006 LDI R16,6
019B DF73 RCALL _LCD_write_string
(0073) break;
019C C027 RJMP 0x01C4
(0074) } //1024分频,F=28HZ
(0075) case 2:
(0076) {
(0077) TCCR0=0x6c;
019D E68C LDI R24,0x6C
019E BF83 OUT 0x33,R24
(0078) LCD_write_string(6,0," 112HZ");
019F EA8D LDI R24,0xAD
01A0 E090 LDI R25,0
01A1 8399 STD Y+1,R25
01A2 8388 STD Y+0,R24
01A3 2722 CLR R18
01A4 E006 LDI R16,6
01A5 DF69 RCALL _LCD_write_string
(0079) break;
01A6 C01D RJMP 0x01C4
(0080) }// 256分频,F=112HZ
(0081) case 3:
(0082) {
(0083) TCCR0=0x6b;
01A7 E68B LDI R24,0x6B
01A8 BF83 OUT 0x33,R24
(0084) LCD_write_string(6,0," 450HZ");
01A9 EA85 LDI R24,0xA5
01AA E090 LDI R25,0
01AB 8399 STD Y+1,R25
01AC 8388 STD Y+0,R24
01AD 2722 CLR R18
01AE E006 LDI R16,6
01AF DF5F RCALL _LCD_write_string
(0085) break;
01B0 C013 RJMP 0x01C4
(0086) } // 64分频,F=450HZ
(0087) case 4:
(0088) {
(0089) TCCR0=0x6a;
01B1 E68A LDI R24,0x6A
01B2 BF83 OUT 0x33,R24
(0090) LCD_write_string(6,0," 7200HZ");
01B3 E98D LDI R24,0x9D
01B4 E090 LDI R25,0
01B5 8399 STD Y+1,R25
01B6 8388 STD Y+0,R24
01B7 2722 CLR R18
01B8 E006 LDI R16,6
01B9 DF55 RCALL _LCD_write_string
(0091) break;
01BA C009 RJMP 0x01C4
(0092) } // 8分频,F=7200HZ
(0093) case 5:
(0094) {
(0095) TCCR0=0x69;
01BB E689 LDI R24,0x69
01BC BF83 OUT 0x33,R24
(0096) LCD_write_string(6,0,"28800HZ");
01BD E985 LDI R24,0x95
01BE E090 LDI R25,0
01BF 8399 STD Y+1,R25
01C0 8388 STD Y+0,R24
01C1 2722 CLR R18
01C2 E006 LDI R16,6
01C3 DF4B RCALL _LCD_write_string
(0097) break;
(0098) } // 无分频,F=28800HZ
(0099) default:break;
01C4 9622 ADIW R28,2
01C5 940E0289 CALL pop_gset1
01C7 9508 RET
_R_set:
01C8 940E0286 CALL push_gset1
01CA 9722 SBIW R28,2
(0100) }
(0101)
(0102)
(0103)
(0104) }
(0105)
(0106) void R_set(void)
(0107) {
(0108) static unsigned char i;
(0109) if(i!=9)i++;
01CB 918000BF LDS R24,i+1
01CD 3089 CPI R24,0x9
01CE F021 BEQ 0x01D3
01CF 5F8F SUBI R24,0xFF
01D0 938000BF STS i+1,R24
01D2 C003 RJMP 0x01D6
(0110) else i=1;
01D3 E081 LDI R24,1
01D4 938000BF STS i+1,R24
(0111) switch(i)//频率选择
01D6 914000BF LDS R20,i+1
01D8 2755 CLR R21
01D9 3041 CPI R20,1
01DA E0E0 LDI R30,0
01DB 075E CPC R21,R30
01DC F141 BEQ 0x0205
01DD 3042 CPI R20,2
01DE E0E0 LDI R30,0
01DF 075E CPC R21,R30
01E0 F171 BEQ 0x020F
01E1 3043 CPI R20,3
01E2 E0E0 LDI R30,0
01E3 075E CPC R21,R30
01E4 F409 BNE 0x01E6
01E5 C033 RJMP 0x0219
01E6 3044 CPI R20,4
01E7 E0E0 LDI R30,0
01E8 075E CPC R21,R30
01E9 F409 BNE 0x01EB
01EA C038 RJMP 0x0223
01EB 3045 CPI R20,5
01EC E0E0 LDI R30,0
01ED 075E CPC R21,R30
01EE F409 BNE 0x01F0
01EF C03D RJMP 0x022D
01F0 3046 CPI R20,6
01F1 E0E0 LDI R30,0
01F2 075E CPC R21,R30
01F3 F409 BNE 0x01F5
01F4 C042 RJMP 0x0237
01F5 3047 CPI R20,7
01F6 E0E0 LDI R30,0
01F7 075E CPC R21,R30
01F8 F409 BNE 0x01FA
01F9 C047 RJMP 0x0241
01FA 3048 CPI R20,0x8
01FB E0E0 LDI R30,0
01FC 075E CPC R21,R30
01FD F409 BNE 0x01FF
01FE C04C RJMP 0x024B
01FF 3049 CPI R20,0x9
0200 E0E0 LDI R30,0
0201 075E CPC R21,R30
0202 F409 BNE 0x0204
0203 C051 RJMP 0x0255
0204 C059 RJMP 0x025E
(0112) {
(0113) case 1:
(0114) {
(0115) OCR0=0x0a;//占空比10%
0205 E08A LDI R24,0xA
0206 BF8C OUT 0x3C,R24
(0116) LCD_write_string(13,0,"10%");
0207 E981 LDI R24,0x91
0208 E090 LDI R25,0
0209 8399 STD Y+1,R25
020A 8388 STD Y+0,R24
020B 2722 CLR R18
020C E00D LDI R16,0xD
020D DF01 RCALL _LCD_write_string
(0117) break;
020E C04F RJMP 0x025E
(0118) }
(0119) case 2:
(0120) {
(0121) OCR0=0x14;//占空比20%
020F E184 LDI R24,0x14
0210 BF8C OUT 0x3C,R24
(0122) LCD_write_string(13,0,"20%");
0211 E88D LDI R24,0x8D
0212 E090 LDI R25,0
0213 8399 STD Y+1,R25
0214 8388 STD Y+0,R24
0215 2722 CLR R18
0216 E00D LDI R16,0xD
0217 DEF7 RCALL _LCD_write_string
(0123) break;
0218 C045 RJMP 0x025E
(0124) }
(0125) case 3:
(0126) {
(0127) OCR0=0x1e;//占空比30%
0219 E18E LDI R24,0x1E
021A BF8C OUT 0x3C,R24
(0128) LCD_write_string(13,0,"30%");
021B E889 LDI R24,0x89
021C E090 LDI R25,0
021D 8399 STD Y+1,R25
021E 8388 STD Y+0,R24
021F 2722 CLR R18
0220 E00D LDI R16,0xD
0221 DEED RCALL _LCD_write_string
(0129) break;
0222 C03B RJMP 0x025E
(0130) }
(0131) case 4:
(0132) {
(0133) OCR0=0x28;//占空比40%
0223 E288 LDI R24,0x28
0224 BF8C OUT 0x3C,R24
(0134) LCD_write_string(13,0,"40%");
0225 E885 LDI R24,0x85
0226 E090 LDI R25,0
0227 8399 STD Y+1,R25
0228 8388 STD Y+0,R24
0229 2722 CLR R18
022A E00D LDI R16,0xD
022B DEE3 RCALL _LCD_write_string
(0135) break;
022C C031 RJMP 0x025E
(0136) }
(0137) case 5:
(0138) {
(0139) OCR0=0x80;//占空比50%
022D E880 LDI R24,0x80
022E BF8C OUT 0x3C,R24
(0140) LCD_write_string(13,0,"50%");
022F E881 LDI R24,0x81
0230 E090 LDI R25,0
0231 8399 STD Y+1,R25
0232 8388 STD Y+0,R24
0233 2722 CLR R18
0234 E00D LDI R16,0xD
0235 DED9 RCALL _LCD_write_string
(0141) break;
0236 C027 RJMP 0x025E
(0142) }
(0143) case 6:
(0144) {
(0145) OCR0=0x3c;//占空比60%
0237 E38C LDI R24,0x3C
0238 BF8C OUT 0x3C,R24
(0146) LCD_write_string(13,0,"60%");
0239 E78D LDI R24,0x7D
023A E090 LDI R25,0
023B 8399 STD Y+1,R25
023C 8388 STD Y+0,R24
023D 2722 CLR R18
023E E00D LDI R16,0xD
023F DECF RCALL _LCD_write_string
(0147) break;
0240 C01D RJMP 0x025E
(0148) }
(0149) case 7:
(0150) {
(0151) OCR0=0x46;//占空比70%
0241 E486 LDI R24,0x46
0242 BF8C OUT 0x3C,R24
(0152) LCD_write_string(13,0,"70%");
0243 E789 LDI R24,0x79
0244 E090 LDI R25,0
0245 8399 STD Y+1,R25
0246 8388 STD Y+0,R24
0247 2722 CLR R18
0248 E00D LDI R16,0xD
0249 DEC5 RCALL _LCD_write_string
(0153) break;
024A C013 RJMP 0x025E
(0154) }
(0155) case 8:
(0156) {
(0157) OCR0=0x50;//占空比80%
024B E580 LDI R24,0x50
024C BF8C OUT 0x3C,R24
(0158) LCD_write_string(13,0,"80%");
024D E785 LDI R24,0x75
024E E090 LDI R25,0
024F 8399 STD Y+1,R25
0250 8388 STD Y+0,R24
0251 2722 CLR R18
0252 E00D LDI R16,0xD
0253 DEBB RCALL _LCD_write_string
(0159) break;
0254 C009 RJMP 0x025E
(0160) }
(0161) case 9:
(0162) {
(0163) OCR0=0x5a;//占空比90%
0255 E58A LDI R24,0x5A
0256 BF8C OUT 0x3C,R24
(0164) LCD_write_string(13,0,"90%");
0257 E781 LDI R24,0x71
0258 E090 LDI R25,0
0259 8399 STD Y+1,R25
025A 8388 STD Y+0,R24
025B 2722 CLR R18
025C E00D LDI R16,0xD
025D DEB1 RCALL _LCD_write_string
(0165) break;
(0166) }
(0167) default:break;
025E 9622 ADIW R28,2
025F 940E0289 CALL pop_gset1
0261 9508 RET
_main:
key --> R20
0262 9722 SBIW R28,2
(0168) }
(0169)
(0170) }
(0171)
(0172) void main(void)
(0173) {
(0174) uchar key;
(0175)
(0176) LCD_init();//液晶初始化
0263 DE40 RCALL _LCD_init
(0177) init_timer0();
0264 DF00 RCALL _init_timer0
(0178) LCD_write_string(0,0,"F_out: 28HZ50%");
0265 E680 LDI R24,0x60
0266 E090 LDI R25,0
0267 8399 STD Y+1,R25
0268 8388 STD Y+0,R24
0269 2722 CLR R18
026A 2700 CLR R16
026B DEA3 RCALL _LCD_write_string
026C C008 RJMP 0x0275
(0179) while(1)
(0180) {
(0181) key=get_key();
026D DEC3 RCALL _get_key
026E 2F40 MOV R20,R16
(0182) if(key=='A')F_set();
026F 3401 CPI R16,0x41
0270 F409 BNE 0x0272
0271 DEFB RCALL _F_set
(0183) if(key=='B')R_set();
FILE: <library>
0272 3442 CPI R20,0x42
0273 F409 BNE 0x0275
0274 DF53 RCALL _R_set
0275 CFF7 RJMP 0x026D
0276 9622 ADIW R28,2
0277 9508 RET
pop_gset2:
0278 E0E2 LDI R30,2
0279 940C028A JMP pop
pop_gset3:
027B E0E4 LDI R30,4
027C 940C028A JMP pop
push_gset5:
027E 92FA ST R15,-Y
027F 92EA ST R14,-Y
push_gset4:
0280 92DA ST R13,-Y
0281 92CA ST R12,-Y
push_gset3:
0282 92BA ST R11,-Y
0283 92AA ST R10,-Y
push_gset2:
0284 937A ST R23,-Y
0285 936A ST R22,-Y
push_gset1:
0286 935A ST R21,-Y
0287 934A ST R20,-Y
0288 9508 RET
pop_gset1:
0289 E0E1 LDI R30,1
pop:
028A 9149 LD R20,Y+
028B 9159 LD R21,Y+
028C FDE0 SBRC R30,0
028D 9508 RET
028E 9169 LD R22,Y+
028F 9179 LD R23,Y+
0290 FDE1 SBRC R30,1
0291 9508 RET
0292 90A9 LD R10,Y+
0293 90B9 LD R11,Y+
0294 FDE2 SBRC R30,2
0295 9508 RET
0296 90C9 LD R12,Y+
0297 90D9 LD R13,Y+
0298 FDE3 SBRC R30,3
0299 9508 RET
029A 90E9 LD R14,Y+
029B 90F9 LD R15,Y+
029C 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -