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

📄 main.s

📁 avr icc 平台开发的pwm模拟功能
💻 S
字号:
	.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脚输出占空比可调的信号*/
; /*通过按键控制OCR1A的值*/
; /***************************/
; 
; #define PwmOut     PD5     //A通道的PWM输出
; #define OCR        OCR1A
; #define KeyUp      PA0     //增大PWM值的按键
; #define KeyDown    PA1     //减小PWM值的按键
; #define Above      PA2     //设置位值过高指示
; #define Below      PA3     //设置位值过低指示
; #define STEP       64      //定义按键时的步进值
; int OcrReg = 1024;         //OCR1A初始值
; int Icr1Reg = 0x7ff;       //PWM的计数顶部值  Icr1Reg = 2047
; //unsigned char *show = "0000"; 
; unsigned char temp;
; 
; void init(void)   //初始化函数
; {
	.dbline 25
;     //比较匹配时清零,计数到最大时置位OC1A
;  TCCR1A |= (1<<COM1A1)|(1<<PWM11);/*PWM11=WGM11 name changed*/  
	in R24,0x2f
	ori R24,130
	out 0x2f,R24
	.dbline 27
;     //11位分辨率,快速PWM模式,使用系统时钟作为计数时钟
;     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);    //按键开启上拉
	in R24,0x1b
	ori R24,3
	out 0x1b,R24
	.dbline 34
;     PORTA |= (1<<Above)|(1<<Below);      //关闭两个指示灯
	in R24,0x1b
	ori R24,12
	out 0x1b,R24
	.dbline -2
	.dbline 37
;     //TIMSK |= (1<<OCIE1A);   //允许计数器比较匹配中断
;     //SREG  |= (1<<7);   //开全局中断
; }
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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -