?? main.lis
字號:
.module main.c
.area data(ram, con, rel)
0000 _data::
0000 .blkb 2
.area idata
0000 0000 .byte 0,0
.area data(ram, con, rel)
0002 .blkb 2
.area idata
0002 0000 .byte 0,0
.area data(ram, con, rel)
0004 .dbfile D:\NEW\AVR_PWM/main.h
0004 .dbsym e data _data A[4:4]c
0004 _CNT::
0004 .blkb 1
.area idata
0004 00 .byte 0
.area data(ram, con, rel)
0005 .dbfile D:\NEW\AVR_PWM/main.h
0005 .dbsym e CNT _CNT c
0005 _OcrReg::
0005 .blkb 2
.area idata
0005 0004 .word 1024
.area data(ram, con, rel)
0007 .dbfile D:\NEW\AVR_PWM/main.h
0007 .dbfile D:\NEW\AVR_PWM\main.c
0007 .dbsym e OcrReg _OcrReg I
0007 _Icr1Reg::
0007 .blkb 2
.area idata
0007 FF07 .word 2047
.area data(ram, con, rel)
0009 .dbfile D:\NEW\AVR_PWM\main.c
0009 .dbsym e Icr1Reg _Icr1Reg I
.area text(rom, con, rel)
0000 .dbfile D:\NEW\AVR_PWM\main.c
0000 .dbfunc e init _init fV
.even
0000 _init::
0000 .dbline -1
0000 .dbline 23
0000 ; #define MAIN_C
0000 ; #include "includes.h"
0000 ; /***************************/
0000 ; /*PWM*/
0000 ; /*晶振為4MHz*/
0000 ; /*利用Timer1的OC1A腳輸出占空比可調(diào)的信號*/
0000 ; /*通過按鍵控制OCR1A的值*/
0000 ; /***************************/
0000 ;
0000 ; #define PwmOut PD5 //A通道的PWM輸出
0000 ; #define OCR OCR1A
0000 ; #define KeyUp PA0 //增大PWM值的按鍵
0000 ; #define KeyDown PA1 //減小PWM值的按鍵
0000 ; #define Above PA2 //設(shè)置位值過高指示
0000 ; #define Below PA3 //設(shè)置位值過低指示
0000 ; #define STEP 64 //定義按鍵時的步進值
0000 ; int OcrReg = 1024; //OCR1A初始值
0000 ; int Icr1Reg = 0x7ff; //PWM的計數(shù)頂部值 Icr1Reg = 2047
0000 ; //unsigned char *show = "0000";
0000 ; unsigned char temp;
0000 ;
0000 ; void init(void) //初始化函數(shù)
0000 ; {
0000 .dbline 25
0000 ; //比較匹配時清零,計數(shù)到最大時置位OC1A
0000 ; TCCR1A |= (1<<COM1A1)|(1<<PWM11);/*PWM11=WGM11 name changed*/
0000 8FB5 in R24,0x2f
0002 8268 ori R24,130
0004 8FBD out 0x2f,R24
0006 .dbline 27
0006 ; //11位分辨率,快速PWM模式,使用系統(tǒng)時鐘作為計數(shù)時鐘
0006 ; TCCR1B |= (1<<WGM13)|(1<<WGM12)|(1<<CS10);
0006 8EB5 in R24,0x2e
0008 8961 ori R24,25
000A 8EBD out 0x2e,R24
000C .dbline 28
000C ; ICR1 = Icr1Reg;
000C 20900700 lds R2,_Icr1Reg
0010 30900800 lds R3,_Icr1Reg+1
0014 37BC out 0x27,R3
0016 26BC out 0x26,R2
0018 .dbline 29
0018 ; OCR = 0 ;
0018 2224 clr R2
001A 3324 clr R3
001C 3BBC out 0x2b,R3
001E 2ABC out 0x2a,R2
0020 .dbline 30
0020 ; DDRD |= (1<<PwmOut); //置PWM為輸出
0020 8D9A sbi 0x11,5
0022 .dbline 31
0022 ; DDRA |= (1<<Above)|(1<<Below); //指示燈定義為輸出
0022 8AB3 in R24,0x1a
0024 8C60 ori R24,12
0026 8ABB out 0x1a,R24
0028 .dbline 32
0028 ; DDRA &= ~((1<<KeyUp)|(1<<KeyDown)); //按鍵定義為輸入
0028 8AB3 in R24,0x1a
002A 8C7F andi R24,252
002C 8ABB out 0x1a,R24
002E .dbline 33
002E ; PORTA |= (1<<KeyUp)|(1<<KeyDown); //按鍵開啟上拉
002E 8BB3 in R24,0x1b
0030 8360 ori R24,3
0032 8BBB out 0x1b,R24
0034 .dbline 34
0034 ; PORTA |= (1<<Above)|(1<<Below); //關(guān)閉兩個指示燈
0034 8BB3 in R24,0x1b
0036 8C60 ori R24,12
0038 8BBB out 0x1b,R24
003A .dbline -2
003A .dbline 37
003A ; //TIMSK |= (1<<OCIE1A); //允許計數(shù)器比較匹配中斷
003A ; //SREG |= (1<<7); //開全局中斷
003A ; }
003A L1:
003A .dbline 0 ; func end
003A 0895 ret
003C .dbend
003C .dbfunc e ShowValue _ShowValue fV
003C ; temp -> R20,R21
003C ; value -> R22,R23
.even
003C _ShowValue::
003C 0E940000 xcall push_gset2
0040 B801 movw R22,R16
0042 2297 sbiw R28,2
0044 .dbline -1
0044 .dbline 40
0044 ;
0044 ; void ShowValue(int value)
0044 ; {
0044 .dbline 41
0044 ; unsigned char *temp = "0000";
0044 40E0 ldi R20,<L3
0046 50E0 ldi R21,>L3
0048 .dbline 42
0048 ; temp[0] = value/1000 + 0x30;
0048 28EE ldi R18,1000
004A 33E0 ldi R19,3
004C 8B01 movw R16,R22
004E 0E940000 xcall div16s
0052 C801 movw R24,R16
0054 C096 adiw R24,48
0056 FA01 movw R30,R20
0058 8083 std z+0,R24
005A .dbline 43
005A ; value = value%1000;
005A 28EE ldi R18,1000
005C 33E0 ldi R19,3
005E 8B01 movw R16,R22
0060 0E940000 xcall mod16s
0064 B801 movw R22,R16
0066 .dbline 44
0066 ; temp[1] = value/100 +0x30;
0066 24E6 ldi R18,100
0068 30E0 ldi R19,0
006A 0E940000 xcall div16s
006E C801 movw R24,R16
0070 C096 adiw R24,48
0072 FA01 movw R30,R20
0074 8183 std z+1,R24
0076 .dbline 45
0076 ; value = value%100;
0076 24E6 ldi R18,100
0078 30E0 ldi R19,0
007A 8B01 movw R16,R22
007C 0E940000 xcall mod16s
0080 B801 movw R22,R16
0082 .dbline 46
0082 ; temp[2] = value/10 + 0x30;
0082 2AE0 ldi R18,10
0084 30E0 ldi R19,0
0086 0E940000 xcall div16s
008A C801 movw R24,R16
008C C096 adiw R24,48
008E FA01 movw R30,R20
0090 8283 std z+2,R24
0092 .dbline 47
0092 ; value = value%10;
0092 2AE0 ldi R18,10
0094 30E0 ldi R19,0
0096 8B01 movw R16,R22
0098 0E940000 xcall mod16s
009C B801 movw R22,R16
009E .dbline 48
009E ; temp[3] = value + 0x30;
009E CB01 movw R24,R22
00A0 C096 adiw R24,48
00A2 FA01 movw R30,R20
00A4 8383 std z+3,R24
00A6 .dbline 49
00A6 ; ClearLine(2);
00A6 02E0 ldi R16,2
00A8 0E940000 xcall _ClearLine
00AC .dbline 50
00AC ; LCD_DisplayString(2,1,"OCR1A = ");
00AC 80E0 ldi R24,<L4
00AE 90E0 ldi R25,>L4
00B0 9983 std y+1,R25
00B2 8883 std y+0,R24
00B4 21E0 ldi R18,1
00B6 02E0 ldi R16,2
00B8 0E940000 xcall _LCD_DisplayString
00BC .dbline 51
00BC ; LCD_DisplayString(2,9,temp);
00BC 5983 std y+1,R21
00BE 4883 std y+0,R20
00C0 29E0 ldi R18,9
00C2 02E0 ldi R16,2
00C4 0E940000 xcall _LCD_DisplayString
00C8 .dbline -2
00C8 .dbline 52
00C8 ; }
00C8 L2:
00C8 2296 adiw R28,2
00CA 0E940000 xcall pop_gset2
00CE .dbline 0 ; func end
00CE 0895 ret
00D0 .dbsym r temp 20 pc
00D0 .dbsym r value 22 I
00D0 .dbend
00D0 .dbfunc e main _main fV
00D0 ; i -> R20
.even
00D0 _main::
00D0 2297 sbiw R28,2
00D2 .dbline -1
00D2 .dbline 55
00D2 ;
00D2 ; void main(void)
00D2 ; {
00D2 .dbline 57
00D2 ; unsigned char i;
00D2 ; init();
00D2 96DF xcall _init
00D4 .dbline 58
00D4 ; Init_LCD();
00D4 0E940000 xcall _Init_LCD
00D8 .dbline 59
00D8 ; OCR = OcrReg;
00D8 20900500 lds R2,_OcrReg
00DC 30900600 lds R3,_OcrReg+1
00E0 3BBC out 0x2b,R3
00E2 2ABC out 0x2a,R2
00E4 .dbline 60
00E4 ; LCD_DisplayString(1,1,"PWM test");
00E4 80E0 ldi R24,<L6
00E6 90E0 ldi R25,>L6
00E8 9983 std y+1,R25
00EA 8883 std y+0,R24
00EC 21E0 ldi R18,1
00EE 01E0 ldi R16,1
00F0 0E940000 xcall _LCD_DisplayString
00F4 .dbline 61
00F4 ; LCD_DisplayString(2,1,"OCR1A = ");
00F4 80E0 ldi R24,<L4
00F6 90E0 ldi R25,>L4
00F8 9983 std y+1,R25
00FA 8883 std y+0,R24
00FC 21E0 ldi R18,1
00FE 02E0 ldi R16,2
0100 0E940000 xcall _LCD_DisplayString
0104 .dbline 62
0104 ; ShowValue(OcrReg);
0104 00910500 lds R16,_OcrReg
0108 10910600 lds R17,_OcrReg+1
010C 97DF xcall _ShowValue
010E 79C0 xjmp L8
0110 L7:
0110 .dbline 64
0110 ; while(1)
0110 ; {
0110 .dbline 65
0110 ; if(!(PINA&(1<<KeyUp)))
0110 C899 sbic 0x19,0
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -