📄 pwm.lst
字号:
__text_start:
__start:
0034 E5CF LDI R28,0x5F
0035 E0D4 LDI R29,4
0036 BFCD OUT 0x3D,R28
0037 BFDE OUT 0x3E,R29
0038 51C0 SUBI R28,0x10
0039 40D0 SBCI R29,0
003A EA0A LDI R16,0xAA
003B 8308 STD Y+0,R16
003C 2400 CLR R0
003D E7E4 LDI R30,0x74
003E E0F0 LDI R31,0
003F E010 LDI R17,0
0040 37E6 CPI R30,0x76
0041 07F1 CPC R31,R17
0042 F011 BEQ 0x0045
0043 9201 ST R0,Z+
0044 CFFB RJMP 0x0040
0045 8300 STD Z+0,R16
0046 E5E4 LDI R30,0x54
0047 E0F0 LDI R31,0
0048 E6A0 LDI R26,0x60
0049 E0B0 LDI R27,0
004A E010 LDI R17,0
004B 36E8 CPI R30,0x68
004C 07F1 CPC R31,R17
004D F021 BEQ 0x0052
004E 95C8 LPM
004F 9631 ADIW R30,1
0050 920D ST R0,X+
0051 CFF9 RJMP 0x004B
0052 940E0112 CALL _main
_exit:
0054 CFFF RJMP _exit
FILE: F:\练习\pwm脉宽调制器\pwm.c
(0001) //***************FileName:PWM.C***************//
(0002) //***************ICCAVR V6.30编译*****************//
(0003)
(0004) #include <iom16v.h>
(0005) #define uchar unsigned char
(0006) #define uint unsigned int
(0007)
(0008) //数码管字型表,对应0,1,2,3,4,5,6,7,8,9,E//
(0009) uchar Table[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x79};
(0010) uchar Data1[4]={10,0,5,0}; //定义初始方波占空比:50%
(0011) uchar Data2[4]={3,9,1,0}; //设定PWM频率:8M/2046=3910Hz
(0012) uchar Key1_Flag,Key2_Flag;
(0013)
(0014) /////////////////////////////延时///////////////////////////////////////////
(0015) void delay_us( int t) //us
(0016) {
(0017) do
(0018) t--;
_delay_us:
t --> R16
0055 5001 SUBI R16,1
0056 4010 SBCI R17,0
(0019) while(t>1);
0057 E081 LDI R24,1
0058 E090 LDI R25,0
0059 1780 CP R24,R16
005A 0791 CPC R25,R17
005B F3CC BLT 0x0055
(0020) }
005C 9508 RET
_delay_ms:
t --> R20
005D 940E017F CALL push_gset1
005F 01A8 MOVW R20,R16
(0021) void delay_ms(unsigned int t) //ms
(0022) {
0060 C005 RJMP 0x0066
(0023) while(t!=0)
(0024) {
(0025) delay_us(1142);
0061 E706 LDI R16,0x76
0062 E014 LDI R17,4
0063 DFF1 RCALL _delay_us
(0026) t--;
0064 5041 SUBI R20,1
0065 4050 SBCI R21,0
0066 3040 CPI R20,0
0067 0745 CPC R20,R21
0068 F7C1 BNE 0x0061
(0027) }
(0028) }
0069 940E0182 CALL pop_gset1
006B 9508 RET
_Display:
sel --> R20
i --> R22
p --> R10
006C 940E019A CALL push_gset3
006E 0158 MOVW R10,R16
(0029) /*void DelayMs(uint i) //Ms级延时,参数i为延时时间
(0030) {uint j;
(0031) {for(j=8000;j!=0;j--) for(;i!=0;i--)
(0032) {;}}
(0033) }*/
(0034)
(0035) void Display(uchar *p) //动态显示函数,参数p为待显示的数组名
(0036) {uchar i,sel=0x01;
006F E041 LDI R20,1
(0037) for(i=0;i<4;i++)
0070 2766 CLR R22
0071 C012 RJMP 0x0084
(0038) {PORTA=sel; //选通最右边的数码管
0072 BB4B OUT 0x1B,R20
(0039) //PORTC=~(0xff-Table[p[i]]); //送字型码
(0040) PORTC=Table[p[i]]; //送字型码
0073 2FE6 MOV R30,R22
0074 27FF CLR R31
0075 0DEA ADD R30,R10
0076 1DFB ADC R31,R11
0077 81E0 LDD R30,Z+0
0078 27FF CLR R31
0079 E680 LDI R24,0x60
007A E090 LDI R25,0
007B 0FE8 ADD R30,R24
007C 1FF9 ADC R31,R25
007D 8020 LDD R2,Z+0
007E BA25 OUT 0x15,R2
(0041) delay_us(1000); //显示延时
007F EE08 LDI R16,0xE8
0080 E013 LDI R17,3
0081 DFD3 RCALL _delay_us
(0042) sel=sel<<1; //移位以显示前一位
0082 0F44 LSL R20
0083 9563 INC R22
0084 3064 CPI R22,4
0085 F360 BCS 0x0072
(0043) }
(0044) }
0086 940E017C CALL pop_gset3
0088 9508 RET
(0045)
(0046) void Add_Process(uchar *p)
(0047) {if(p[1]!=1)
_Add_Process:
p --> R16
0089 01F8 MOVW R30,R16
008A 8181 LDD R24,Z+1
008B 3081 CPI R24,1
008C F099 BEQ 0x00A0
(0048) {p[2]=p[2]+1;
008D 01C8 MOVW R24,R16
008E 9602 ADIW R24,2
008F 01FC MOVW R30,R24
0090 8180 LDD R24,Z+0
0091 5F8F SUBI R24,0xFF
0092 8380 STD Z+0,R24
(0049) if(p[2]==10) {p[2]=0;p[1]++;}
0093 01F8 MOVW R30,R16
0094 8182 LDD R24,Z+2
0095 308A CPI R24,0xA
0096 F449 BNE 0x00A0
0097 2422 CLR R2
0098 01F8 MOVW R30,R16
0099 8222 STD Z+2,R2
009A 01C8 MOVW R24,R16
009B 9601 ADIW R24,1
009C 01FC MOVW R30,R24
009D 8180 LDD R24,Z+0
009E 5F8F SUBI R24,0xFF
009F 8380 STD Z+0,R24
(0050) }
(0051) }
00A0 9508 RET
_Sub_Process:
temp --> R22
p --> R20
00A1 940E0196 CALL push_gset2
00A3 01A8 MOVW R20,R16
(0052)
(0053) void Sub_Process(uchar *p)
(0054) {uchar temp;
(0055) temp=p[1]*10+p[2];
(0056) if(temp!=0)
00A4 01FA MOVW R30,R20
00A5 8021 LDD R2,Z+1
00A6 E08A LDI R24,0xA
00A7 9D82 MUL R24,R2
00A8 2D60 MOV R22,R0
00A9 01FA MOVW R30,R20
00AA 8022 LDD R2,Z+2
00AB 0D62 ADD R22,R2
00AC F079 BEQ 0x00BC
(0057) {temp=temp-1;
(0058) p[1]=temp/10;
00AD 956A DEC R22
00AE E01A LDI R17,0xA
00AF 2F06 MOV R16,R22
00B0 940E0153 CALL div8u
00B2 01FA MOVW R30,R20
00B3 8301 STD Z+1,R16
(0059) p[2]=temp-p[1]*10;
00B4 01FA MOVW R30,R20
00B5 8021 LDD R2,Z+1
00B6 E08A LDI R24,0xA
00B7 9D82 MUL R24,R2
00B8 2E26 MOV R2,R22
00B9 1820 SUB R2,R0
00BA 01FA MOVW R30,R20
00BB 8222 STD Z+2,R2
(0060) }
(0061) }
00BC 940E0179 CALL pop_gset2
00BE 9508 RET
(0062)
(0063) void Key_Process()
(0064) {while((PINB&0x01)==0) {Display(Data1);Key1_Flag=1;}
_Key_Process:
00BF C006 RJMP 0x00C6
00C0 E60C LDI R16,0x6C
00C1 E010 LDI R17,0
00C2 DFA9 RCALL _Display
00C3 E081 LDI R24,1
00C4 93800075 STS _Key1_Flag,R24
00C6 9BB0 SBIS 0x16,0
00C7 CFF8 RJMP 0x00C0
00C8 C006 RJMP 0x00CF
(0065) while((PINB&0x02)==0) {Display(Data1);Key2_Flag=1;}
00C9 E60C LDI R16,0x6C
00CA E010 LDI R17,0
00CB DFA0 RCALL _Display
00CC E081 LDI R24,1
00CD 93800074 STS _Key2_Flag,R24
00CF 9BB1 SBIS 0x16,1
00D0 CFF8 RJMP 0x00C9
(0066) if(Key1_Flag==1)
00D1 91800075 LDS R24,_Key1_Flag
00D3 3081 CPI R24,1
00D4 F431 BNE 0x00DB
(0067) {Add_Process(Data1);
00D5 E60C LDI R16,0x6C
00D6 E010 LDI R17,0
00D7 DFB1 RCALL _Add_Process
(0068) Key1_Flag=0;}
00D8 2422 CLR R2
00D9 92200075 STS _Key1_Flag,R2
(0069) if(Key2_Flag==1)
00DB 91800074 LDS R24,_Key2_Flag
00DD 3081 CPI R24,1
00DE F431 BNE 0x00E5
(0070) {Sub_Process(Data1);
00DF E60C LDI R16,0x6C
00E0 E010 LDI R17,0
00E1 DFBF RCALL _Sub_Process
(0071) Key2_Flag=0;}
00E2 2422 CLR R2
00E3 92200074 STS _Key2_Flag,R2
(0072) }
00E5 9508 RET
_Set_Process:
i --> R20
p --> R20
00E6 940E017F CALL push_gset1
00E8 01A8 MOVW R20,R16
(0073) //??????????????????????????//
(0074) void Set_Process(uchar *p)
(0075) {uint i;
(0076) i=p[1]*10+p[2];
(0077) i=1023*i/10;
(0078) OCR1AH=i>>8;
00E9 01FA MOVW R30,R20
00EA 8021 LDD R2,Z+1
00EB E08A LDI R24,0xA
00EC 9D82 MUL R24,R2
00ED 0110 MOVW R2,R0
00EE 01FA MOVW R30,R20
00EF 8042 LDD R4,Z+2
00F0 2455 CLR R5
00F1 0C24 ADD R2,R4
00F2 1C35 ADC R3,R5
00F3 EF0F LDI R16,0xFF
00F4 E013 LDI R17,3
00F5 0191 MOVW R18,R2
00F6 940E0169 CALL empy16s
00F8 E02A LDI R18,0xA
00F9 E030 LDI R19,0
00FA 940E0137 CALL div16u
00FC 01A8 MOVW R20,R16
00FD 011A MOVW R2,R20
00FE 2C23 MOV R2,R3
00FF 2433 CLR R3
0100 BC2B OUT 0x2B,R2
(0079) OCR1AL=i&0x00ff;
0101 01CA MOVW R24,R20
0102 7090 ANDI R25,0
0103 BD8A OUT 0x2A,R24
(0080) }
0104 940E0182 CALL pop_gset1
0106 9508 RET
(0081)
(0082) void Init_IO(void) //初始化I/O口
(0083) {DDRA=0xff; //设置A口为推挽1输出
_Init_IO:
0107 EF8F LDI R24,0xFF
0108 BB8A OUT 0x1A,R24
(0084) PORTA=0xff;
0109 BB8B OUT 0x1B,R24
(0085) DDRC=0xff; //设置C口为推挽1输出
010A BB84 OUT 0x14,R24
(0086) PORTC=0xff;
010B BB85 OUT 0x15,R24
(0087) DDRB=0x00; //设置B口为三态输入
010C 2422 CLR R2
010D BA27 OUT 0x17,R2
(0088) PORTB=0x00;
010E BA28 OUT 0x18,R2
(0089) DDRD=0xff; //设置D口为推挽1输出
010F BB81 OUT 0x11,R24
(0090) PORTD=0xff;
0110 BB82 OUT 0x12,R24
(0091) }
0111 9508 RET
(0092)
(0093) void main(void)
(0094) {uchar i;
(0095) Init_IO(); //初始化I/O口
_main:
i --> R20
0112 DFF4 RCALL _Init_IO
(0096) PORTA=0xff; //点亮以测试所有的数码管
0113 EF8F LDI R24,0xFF
0114 BB8B OUT 0x1B,R24
(0097) PORTC=0xff;
0115 BB85 OUT 0x15,R24
(0098) //delay_ms(100); //延时
(0099) PORTC=0x00; //熄灭所有的数码管
0116 2422 CLR R2
0117 BA25 OUT 0x15,R2
(0100) TCCR1A=0xc3; //10位PWM,向上计数清除OC1A,向下计数置位OC1A
0118 EC83 LDI R24,0xC3
0119 BD8F OUT 0x2F,R24
(0101) TCCR1B=0x02; //时钟8分频,最小频率1M/2046=0.5KHz
011A E082 LDI R24,2
011B BD8E OUT 0x2E,R24
011C C016 RJMP 0x0133
(0102) while(1)
(0103) {Key_Process();
011D DFA1 RCALL _Key_Process
(0104) Set_Process(Data1); //设置PWM占空比
011E E60C LDI R16,0x6C
011F E010 LDI R17,0
0120 DFC5 RCALL _Set_Process
(0105) for(i=500;i!=0;i--)
0121 EF44 LDI R20,0xF4
0122 C005 RJMP 0x0128
(0106) { Key_Process();
0123 DF9B RCALL _Key_Process
(0107) Display(Data1);}
0124 E60C LDI R16,0x6C
0125 E010 LDI R17,0
0126 DF45 RCALL _Display
0127 954A DEC R20
0128 2344 TST R20
0129 F7C9 BNE 0x0123
(0108) for(i=500;i!=0;i--)
012A EF44 LDI R20,0xF4
012B C005 RJMP 0x0131
(0109) { Key_Process();
012C DF92 RCALL _Key_Process
(0110) Display(Data2);}
012D E700 LDI R16,0x70
012E E010 LDI R17,0
012F DF3C RCALL _Display
0130 954A DEC R20
0131 2344 TST R20
0132 F7C9 BNE 0x012C
0133 CFE9 RJMP 0x011D
(0111) }
(0112) }
FILE: <library>
0134 9508 RET
mod16u:
0135 9468 BSET 6
0136 C001 RJMP xdiv16u
div16u:
0137 94E8 BCLR 6
xdiv16u:
0138 92EA ST R14,-Y
0139 92FA ST R15,-Y
013A 938A ST R24,-Y
013B 24EE CLR R14
013C 24FF CLR R15
013D E180 LDI R24,0x10
013E 0F00 LSL R16
013F 1F11 ROL R17
0140 1CEE ROL R14
0141 1CFF ROL R15
0142 16E2 CP R14,R18
0143 06F3 CPC R15,R19
0144 F018 BCS 0x0148
0145 1AE2 SUB R14,R18
0146 0AF3 SBC R15,R19
0147 9503 INC R16
0148 958A DEC R24
0149 F7A1 BNE 0x013E
014A F416 BRTC 0x014D
014B 2D0E MOV R16,R14
014C 2D1F MOV R17,R15
014D 9189 LD R24,Y+
014E 90F9 LD R15,Y+
014F 90E9 LD R14,Y+
0150 9508 RET
mod8u:
0151 9468 BSET 6
0152 C001 RJMP xdiv8u
div8u:
0153 94E8 BCLR 6
xdiv8u:
0154 932A ST R18,-Y
0155 92FA ST R15,-Y
0156 92EA ST R14,-Y
0157 24FF CLR R15
0158 24EE CLR R14
0159 E120 LDI R18,0x10
015A 0F00 LSL R16
015B 1CFF ROL R15
015C 1CEE ROL R14
015D 16E1 CP R14,R17
015E F010 BCS 0x0161
015F 1AE1 SUB R14,R17
0160 9503 INC R16
0161 952A DEC R18
0162 F7B9 BNE 0x015A
0163 F40E BRTC 0x0165
0164 2D0E MOV R16,R14
0165 90E9 LD R14,Y+
0166 90F9 LD R15,Y+
0167 9129 LD R18,Y+
0168 9508 RET
empy16s:
0169 920A ST R0,-Y
016A 921A ST R1,-Y
016B 938A ST R24,-Y
016C 939A ST R25,-Y
016D 9F02 MUL R16,R18
016E 01C0 MOVW R24,R0
016F 9F12 MUL R17,R18
0170 0D90 ADD R25,R0
0171 9F03 MUL R16,R19
0172 0D90 ADD R25,R0
0173 018C MOVW R16,R24
0174 9199 LD R25,Y+
0175 9189 LD R24,Y+
0176 9019 LD R1,Y+
0177 9009 LD R0,Y+
0178 9508 RET
pop_gset2:
0179 E0E2 LDI R30,2
017A 940C0183 JMP pop
pop_gset3:
017C E0E4 LDI R30,4
017D 940C0183 JMP pop
push_gset1:
017F 935A ST R21,-Y
0180 934A ST R20,-Y
0181 9508 RET
pop_gset1:
0182 E0E1 LDI R30,1
pop:
0183 9149 LD R20,Y+
0184 9159 LD R21,Y+
0185 FDE0 SBRC R30,0
0186 9508 RET
0187 9169 LD R22,Y+
0188 9179 LD R23,Y+
0189 FDE1 SBRC R30,1
018A 9508 RET
018B 90A9 LD R10,Y+
018C 90B9 LD R11,Y+
018D FDE2 SBRC R30,2
018E 9508 RET
018F 90C9 LD R12,Y+
0190 90D9 LD R13,Y+
0191 FDE3 SBRC R30,3
0192 9508 RET
0193 90E9 LD R14,Y+
0194 90F9 LD R15,Y+
0195 9508 RET
push_gset2:
0196 937A ST R23,-Y
0197 936A ST R22,-Y
0198 940C017F JMP push_gset1
push_gset3:
019A 92BA ST R11,-Y
019B 92AA ST R10,-Y
019C 940C0196 JMP push_gset2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -