⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwm.lst

📁 采用AVR16单片机写的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 + -