?? main.s
字號(hào):
.module main.c
.area data(ram, con, rel)
_data::
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.dbfile D:\NEW\AVR_PWM/main.h
.dbsym e data _data A[4:4]c
_CNT::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile D:\NEW\AVR_PWM/main.h
.dbsym e CNT _CNT c
_OcrReg::
.blkb 2
.area idata
.word 1024
.area data(ram, con, rel)
.dbfile D:\NEW\AVR_PWM/main.h
.dbfile D:\NEW\AVR_PWM\main.c
.dbsym e OcrReg _OcrReg I
_Icr1Reg::
.blkb 2
.area idata
.word 2047
.area data(ram, con, rel)
.dbfile D:\NEW\AVR_PWM\main.c
.dbsym e Icr1Reg _Icr1Reg I
.area text(rom, con, rel)
.dbfile D:\NEW\AVR_PWM\main.c
.dbfunc e init _init fV
.even
_init::
.dbline -1
.dbline 23
; #define MAIN_C
; #include "includes.h"
; /***************************/
; /*PWM*/
; /*晶振為4MHz*/
; /*利用Timer1的OC1A腳輸出占空比可調(diào)的信號(hào)*/
; /*通過(guò)按鍵控制OCR1A的值*/
; /***************************/
;
; #define PwmOut PD5 //A通道的PWM輸出
; #define OCR OCR1A
; #define KeyUp PA0 //增大PWM值的按鍵
; #define KeyDown PA1 //減小PWM值的按鍵
; #define Above PA2 //設(shè)置位值過(guò)高指示
; #define Below PA3 //設(shè)置位值過(guò)低指示
; #define STEP 64 //定義按鍵時(shí)的步進(jìn)值
; int OcrReg = 1024; //OCR1A初始值
; int Icr1Reg = 0x7ff; //PWM的計(jì)數(shù)頂部值 Icr1Reg = 2047
; //unsigned char *show = "0000";
; unsigned char temp;
;
; void init(void) //初始化函數(shù)
; {
.dbline 25
; //比較匹配時(shí)清零,計(jì)數(shù)到最大時(shí)置位OC1A
; TCCR1A |= (1<<COM1A1)|(1<<PWM11);/*PWM11=WGM11 name changed*/
in R24,0x2f
ori R24,130
out 0x2f,R24
.dbline 27
; //11位分辨率,快速PWM模式,使用系統(tǒng)時(shí)鐘作為計(jì)數(shù)時(shí)鐘
; TCCR1B |= (1<<WGM13)|(1<<WGM12)|(1<<CS10);
in R24,0x2e
ori R24,25
out 0x2e,R24
.dbline 28
; ICR1 = Icr1Reg;
lds R2,_Icr1Reg
lds R3,_Icr1Reg+1
out 0x27,R3
out 0x26,R2
.dbline 29
; OCR = 0 ;
clr R2
clr R3
out 0x2b,R3
out 0x2a,R2
.dbline 30
; DDRD |= (1<<PwmOut); //置PWM為輸出
sbi 0x11,5
.dbline 31
; DDRA |= (1<<Above)|(1<<Below); //指示燈定義為輸出
in R24,0x1a
ori R24,12
out 0x1a,R24
.dbline 32
; DDRA &= ~((1<<KeyUp)|(1<<KeyDown)); //按鍵定義為輸入
in R24,0x1a
andi R24,252
out 0x1a,R24
.dbline 33
; PORTA |= (1<<KeyUp)|(1<<KeyDown); //按鍵開(kāi)啟上拉
in R24,0x1b
ori R24,3
out 0x1b,R24
.dbline 34
; PORTA |= (1<<Above)|(1<<Below); //關(guān)閉兩個(gè)指示燈
in R24,0x1b
ori R24,12
out 0x1b,R24
.dbline -2
.dbline 37
; //TIMSK |= (1<<OCIE1A); //允許計(jì)數(shù)器比較匹配中斷
; //SREG |= (1<<7); //開(kāi)全局中斷
; }
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e ShowValue _ShowValue fV
; temp -> R20,R21
; value -> R22,R23
.even
_ShowValue::
xcall push_gset2
movw R22,R16
sbiw R28,2
.dbline -1
.dbline 40
;
; void ShowValue(int value)
; {
.dbline 41
; unsigned char *temp = "0000";
ldi R20,<L3
ldi R21,>L3
.dbline 42
; temp[0] = value/1000 + 0x30;
ldi R18,1000
ldi R19,3
movw R16,R22
xcall div16s
movw R24,R16
adiw R24,48
movw R30,R20
std z+0,R24
.dbline 43
; value = value%1000;
ldi R18,1000
ldi R19,3
movw R16,R22
xcall mod16s
movw R22,R16
.dbline 44
; temp[1] = value/100 +0x30;
ldi R18,100
ldi R19,0
xcall div16s
movw R24,R16
adiw R24,48
movw R30,R20
std z+1,R24
.dbline 45
; value = value%100;
ldi R18,100
ldi R19,0
movw R16,R22
xcall mod16s
movw R22,R16
.dbline 46
; temp[2] = value/10 + 0x30;
ldi R18,10
ldi R19,0
xcall div16s
movw R24,R16
adiw R24,48
movw R30,R20
std z+2,R24
.dbline 47
; value = value%10;
ldi R18,10
ldi R19,0
movw R16,R22
xcall mod16s
movw R22,R16
.dbline 48
; temp[3] = value + 0x30;
movw R24,R22
adiw R24,48
movw R30,R20
std z+3,R24
.dbline 49
; ClearLine(2);
ldi R16,2
xcall _ClearLine
.dbline 50
; LCD_DisplayString(2,1,"OCR1A = ");
ldi R24,<L4
ldi R25,>L4
std y+1,R25
std y+0,R24
ldi R18,1
ldi R16,2
xcall _LCD_DisplayString
.dbline 51
; LCD_DisplayString(2,9,temp);
std y+1,R21
std y+0,R20
ldi R18,9
ldi R16,2
xcall _LCD_DisplayString
.dbline -2
.dbline 52
; }
L2:
adiw R28,2
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r temp 20 pc
.dbsym r value 22 I
.dbend
.dbfunc e main _main fV
; i -> R20
.even
_main::
sbiw R28,2
.dbline -1
.dbline 55
;
; void main(void)
; {
.dbline 57
; unsigned char i;
; init();
xcall _init
.dbline 58
; Init_LCD();
xcall _Init_LCD
.dbline 59
; OCR = OcrReg;
lds R2,_OcrReg
lds R3,_OcrReg+1
out 0x2b,R3
out 0x2a,R2
.dbline 60
; LCD_DisplayString(1,1,"PWM test");
ldi R24,<L6
ldi R25,>L6
std y+1,R25
std y+0,R24
ldi R18,1
ldi R16,1
xcall _LCD_DisplayString
.dbline 61
; LCD_DisplayString(2,1,"OCR1A = ");
ldi R24,<L4
ldi R25,>L4
std y+1,R25
std y+0,R24
ldi R18,1
ldi R16,2
xcall _LCD_DisplayString
.dbline 62
; ShowValue(OcrReg);
lds R16,_OcrReg
lds R17,_OcrReg+1
xcall _ShowValue
xjmp L8
L7:
.dbline 64
; while(1)
; {
.dbline 65
; if(!(PINA&(1<<KeyUp)))
sbic 0x19,0
rjmp L10
.dbline 66
; {
.dbline 67
; delay_nms(10); //按鍵消抖
ldi R16,10
ldi R17,0
xcall _delay_nms
.dbline 68
; if(!(PINA&(1<<KeyUp)))
sbic 0x19,0
rjmp L12
.dbline 69
; {
L14:
.dbline 70
L15:
.dbline 70
; while(!(PINA&(1<<KeyUp))); //等待按鍵釋放
sbis 0x19,0
rjmp L14
.dbline 71
; if(OcrReg >= (Icr1Reg+1))
lds R24,_Icr1Reg
lds R25,_Icr1Reg+1
adiw R24,1
lds R2,_OcrReg
lds R3,_OcrReg+1
cp R2,R24
cpc R3,R25
brlt L17
.dbline 72
; {
.dbline 73
; for(i=0;i<5;i++)
clr R20
xjmp L22
L19:
.dbline 74
.dbline 75
ldi R24,4
in R2,0x1b
eor R2,R24
out 0x1b,R2
.dbline 76
ldi R16,200
ldi R17,0
xcall _delay_nms
.dbline 77
L20:
.dbline 73
inc R20
L22:
.dbline 73
cpi R20,5
brlo L19
.dbline 78
; {
; PORTA ^= (1<<Above);
; delay_nms(200);
; }
; ClearLine(2);
ldi R16,2
xcall _ClearLine
.dbline 79
; LCD_DisplayString(2,1,"Value MAX!");
ldi R24,<L23
ldi R25,>L23
std y+1,R25
std y+0,R24
ldi R18,1
ldi R16,2
xcall _LCD_DisplayString
.dbline 80
; }
xjmp L18
L17:
.dbline 82
; else
; {
.dbline 83
; PORTA |= (1<<Above);
sbi 0x1b,2
.dbline 84
; OcrReg += STEP;
lds R24,_OcrReg
lds R25,_OcrReg+1
subi R24,192 ; offset = 64
sbci R25,255
sts _OcrReg+1,R25
sts _OcrReg,R24
.dbline 85
; OCR = OcrReg;
out 0x2b,R25
out 0x2a,R24
.dbline 86
; ShowValue(OcrReg);
movw R16,R24
xcall _ShowValue
.dbline 87
; }
L18:
.dbline 88
; }
L12:
.dbline 89
; }
L10:
.dbline 90
; if(!(PINA&(1<<KeyDown)))
sbic 0x19,1
rjmp L24
.dbline 91
; {
.dbline 92
; delay_nms(10); //按鍵消抖
ldi R16,10
ldi R17,0
xcall _delay_nms
.dbline 93
; if(!(PINA&(1<<KeyDown)))
sbic 0x19,1
rjmp L26
.dbline 94
; {
L28:
.dbline 95
L29:
.dbline 95
; while(!(PINA&(1<<KeyDown))); //等待按鍵釋放
sbis 0x19,1
rjmp L28
.dbline 96
; if(OcrReg <= 0)
clr R2
clr R3
lds R4,_OcrReg
lds R5,_OcrReg+1
cp R2,R4
cpc R3,R5
brlt L31
.dbline 97
; {
.dbline 98
; for(i=0;i<5;i++)
clr R20
xjmp L36
L33:
.dbline 99
.dbline 100
ldi R24,8
in R2,0x1b
eor R2,R24
out 0x1b,R2
.dbline 101
ldi R16,200
ldi R17,0
xcall _delay_nms
.dbline 102
L34:
.dbline 98
inc R20
L36:
.dbline 98
cpi R20,5
brlo L33
.dbline 103
; {
; PORTA ^= (1<<Below);
; delay_nms(200);
; }
; ClearLine(2);
ldi R16,2
xcall _ClearLine
.dbline 104
; LCD_DisplayString(2,1,"Value MIN!");
ldi R24,<L37
ldi R25,>L37
std y+1,R25
std y+0,R24
ldi R18,1
ldi R16,2
xcall _LCD_DisplayString
.dbline 105
; }
xjmp L32
L31:
.dbline 107
; else
; {
.dbline 108
; PORTA |= (1<<Below);
sbi 0x1b,3
.dbline 109
; OcrReg -= STEP;
lds R24,_OcrReg
lds R25,_OcrReg+1
subi R24,64
sbci R25,0
sts _OcrReg+1,R25
sts _OcrReg,R24
.dbline 110
; OCR = OcrReg;
out 0x2b,R25
out 0x2a,R24
.dbline 111
; ShowValue(OcrReg);
movw R16,R24
xcall _ShowValue
.dbline 112
; }
L32:
.dbline 113
; }
L26:
.dbline 114
; }
L24:
.dbline 115
L8:
.dbline 63
xjmp L7
X0:
.dbline -2
.dbline 116
; }
; }
L5:
adiw R28,2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.area bss(ram, con, rel)
.dbfile D:\NEW\AVR_PWM\main.c
_temp::
.blkb 1
.dbsym e temp _temp c
_KeyDown::
.blkb 1
.dbfile D:\NEW\AVR_PWM/main.h
.dbsym e KeyDown _KeyDown c
_KeyUp::
.blkb 1
.dbsym e KeyUp _KeyUp c
.area data(ram, con, rel)
.dbfile D:\NEW\AVR_PWM/main.h
L37:
.blkb 11
.area idata
.byte 'V,'a,'l,'u,'e,32,'M,'I,'N,33,0
.area data(ram, con, rel)
.dbfile D:\NEW\AVR_PWM/main.h
L23:
.blkb 11
.area idata
.byte 'V,'a,'l,'u,'e,32,'M,'A,'X,33,0
.area data(ram, con, rel)
.dbfile D:\NEW\AVR_PWM/main.h
L6:
.blkb 9
.area idata
.byte 'P,'W,'M,32,'t,'e,'s,'t,0
.area data(ram, con, rel)
.dbfile D:\NEW\AVR_PWM/main.h
L4:
.blkb 9
.area idata
.byte 'O,'C,'R,49,'A,32,61,32,0
.area data(ram, con, rel)
.dbfile D:\NEW\AVR_PWM/main.h
L3:
.blkb 5
.area idata
.byte 48,48,48,48,0
.area data(ram, con, rel)
.dbfile D:\NEW\AVR_PWM/main.h
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -