📄 08pwm.lst
字号:
__text_start:
__start:
0046 EFCF LDI R28,0xFF
0047 E1D0 LDI R29,0x10
0048 BFCD OUT 0x3D,R28
0049 BFDE OUT 0x3E,R29
004A 51C0 SUBI R28,0x10
004B 40D0 SBCI R29,0
004C EA0A LDI R16,0xAA
004D 8308 STD Y+0,R16
004E 2400 CLR R0
004F E0E0 LDI R30,0
0050 E0F1 LDI R31,1
0051 E011 LDI R17,1
0052 30E0 CPI R30,0
0053 07F1 CPC R31,R17
0054 F011 BEQ 0x0057
0055 9201 ST R0,Z+
0056 CFFB RJMP 0x0052
0057 8300 STD Z+0,R16
0058 E8EC LDI R30,0x8C
0059 E0F0 LDI R31,0
005A E0A0 LDI R26,0
005B E0B1 LDI R27,1
005C E010 LDI R17,0
005D 38EC CPI R30,0x8C
005E 07F1 CPC R31,R17
005F F021 BEQ 0x0064
0060 95C8 LPM
0061 9631 ADIW R30,1
0062 920D ST R0,X+
0063 CFF9 RJMP 0x005D
0064 940E008B CALL _main
_exit:
0066 CFFF RJMP _exit
_delay_ms:
a --> R20
b --> R22
i --> R16
0067 940E00CE CALL push_gset2
FILE: E:\ICCAVR\project\AVRMEG~3\icc\008-PWM-LED\main.c
(0001) /*
(0002) 实验八:
(0003)
(0004) PWM实险。
(0005) 1、利用PWM占空比调节功能,进行定时器T1输出三路动态PWM信号,
(0006) 并将结果以亮度的型式显示在对应的LED发光二极管上。
(0007) 2、内部1 M晶振,程序采用单任务方式,软件延时。
(0008) 3、进行此实验请插上LED短路块。
(0009) 4、通过此实验,可以对PWM有个初步认识,知道它的工作原理。
(0010) 用一个定时器输出三路PWM信号,充分发辉硬件资源。
(0011)
(0012) AVR mega128学习板
(0013) www.iccavr.com 阿发
(0014) 16:36 2007-10-12
(0015) */
(0016) #include "iom128v.h"
(0017)
(0018) /*延时函数*/
(0019) void delay_ms(unsigned char i) {
(0020)
(0021) unsigned char a, b;
(0022) for (a = 0; a < i; a++) {
0069 2744 CLR R20
006A C006 RJMP 0x0071
(0023) for (b = 1; b; b++);
006B E061 LDI R22,1
006C C001 RJMP 0x006E
006D 9563 INC R22
006E 2366 TST R22
006F F7E9 BNE 0x006D
0070 9543 INC R20
0071 1740 CP R20,R16
0072 F3C0 BCS 0x006B
0073 940E00C5 CALL pop_gset2
0075 9508 RET
(0024) }
(0025) }
(0026)
(0027) /*IO口初始化函数*/
(0028) void io_init(void) {
(0029)
(0030) DDRA = 0x00; /*方向输入*/
_io_init:
0076 2422 CLR R2
0077 BA2A OUT 0x1A,R2
(0031) PORTA = 0xFF; /*打开上拉*/
0078 EF8F LDI R24,0xFF
0079 BB8B OUT 0x1B,R24
(0032) DDRB = 0xFF; /*方向输出*/
007A BB87 OUT 0x17,R24
(0033) PORTB = 0xFF; /*输出高电平*/
007B BB88 OUT 0x18,R24
(0034) DDRC = 0x00; /*不用的IO口建议设置为输入带上拉*/
007C BA24 OUT 0x14,R2
(0035) PORTC = 0xFF;
007D BB85 OUT 0x15,R24
(0036) DDRD = 0x00;
007E BA21 OUT 0x11,R2
(0037) PORTD = 0xFF;
007F BB82 OUT 0x12,R24
(0038) DDRE = 0x00;
0080 B822 OUT 0x02,R2
(0039) PORTE = 0xFF;
0081 B983 OUT 0x03,R24
(0040) DDRF = 0x00;
0082 92200061 STS 0x61,R2
(0041) PORTF = 0xFF;
0084 93800062 STS 0x62,R24
(0042) DDRG = 0x00;
0086 92200064 STS 0x64,R2
(0043) PORTG = 0xFF;
0088 93800065 STS 0x65,R24
008A 9508 RET
(0044) }
(0045)
(0046) void main(void) {
(0047)
(0048) unsigned char i = 0;
_main:
i --> R20
008B 2744 CLR R20
(0049)
(0050) io_init();
008C DFE9 RCALL _io_init
(0051) OCR1A = i; /*先预设值,防止启动瞬间值为空*/
008D 2E24 MOV R2,R20
008E 2433 CLR R3
008F BC3B OUT 0x2B,R3
0090 BC2A OUT 0x2A,R2
(0052) OCR1B = i + 80;
0091 2D82 MOV R24,R2
0092 2799 CLR R25
0093 5B80 SUBI R24,0xB0
0094 4F9F SBCI R25,0xFF
0095 BD99 OUT 0x29,R25
0096 BD88 OUT 0x28,R24
(0053) OCR1C = i + 160;
0097 2D82 MOV R24,R2
0098 2799 CLR R25
0099 5680 SUBI R24,0x60
009A 4F9F SBCI R25,0xFF
009B 93900079 STS 0x79,R25
009D 93800078 STS 0x78,R24
(0054)
(0055) TCCR1A = (1 << WGM10); /*8位相位修正PWM模式*/
009F E081 LDI R24,1
00A0 BD8F OUT 0x2F,R24
(0056) TCCR1A |= (1 << COM1A1) | (1 << COM1B1) | (1 << COM1C1);
00A1 B58F IN R24,0x2F
00A2 6A88 ORI R24,0xA8
00A3 BD8F OUT 0x2F,R24
(0057) TCCR1B = (1 << CS10); /*256分频*/
00A4 E081 LDI R24,1
00A5 BD8E OUT 0x2E,R24
00A6 C01C RJMP 0x00C3
(0058)
(0059) while (1) {
(0060) delay_ms(150); /*变化周期*/
00A7 E906 LDI R16,0x96
00A8 DFBE RCALL _delay_ms
(0061) i ++; /*调节角度*/
00A9 9543 INC R20
(0062) OCR1A = i | 0xC0;
00AA 2F84 MOV R24,R20
00AB 2799 CLR R25
00AC 6C80 ORI R24,0xC0
00AD BD9B OUT 0x2B,R25
00AE BD8A OUT 0x2A,R24
(0063) OCR1B = (i + 80) | 0xC0; /*人为加入一个修改值,读整占空比*/
00AF 2F84 MOV R24,R20
00B0 2799 CLR R25
00B1 5B80 SUBI R24,0xB0
00B2 4F9F SBCI R25,0xFF
00B3 6C80 ORI R24,0xC0
00B4 BD99 OUT 0x29,R25
00B5 BD88 OUT 0x28,R24
(0064) OCR1C = (i + 160) | 0xC0; /*主要是因为LED不是线性亮度*/
00B6 2F84 MOV R24,R20
00B7 2799 CLR R25
00B8 5680 SUBI R24,0x60
00B9 4F9F SBCI R25,0xFF
00BA 6C80 ORI R24,0xC0
00BB 93900079 STS 0x79,R25
00BD 93800078 STS 0x78,R24
(0065) PORTB ^= 0x01;
FILE: <library>
00BF E081 LDI R24,1
00C0 B228 IN R2,0x18
00C1 2628 EOR R2,R24
00C2 BA28 OUT 0x18,R2
00C3 CFE3 RJMP 0x00A7
00C4 9508 RET
pop_gset2:
00C5 E0E2 LDI R30,2
00C6 940C00D4 JMP pop
push_gset5:
00C8 92FA ST R15,-Y
00C9 92EA ST R14,-Y
push_gset4:
00CA 92DA ST R13,-Y
00CB 92CA ST R12,-Y
push_gset3:
00CC 92BA ST R11,-Y
00CD 92AA ST R10,-Y
push_gset2:
00CE 937A ST R23,-Y
00CF 936A ST R22,-Y
push_gset1:
00D0 935A ST R21,-Y
00D1 934A ST R20,-Y
00D2 9508 RET
pop_gset1:
00D3 E0E1 LDI R30,1
pop:
00D4 9149 LD R20,Y+
00D5 9159 LD R21,Y+
00D6 FDE0 SBRC R30,0
00D7 9508 RET
00D8 9169 LD R22,Y+
00D9 9179 LD R23,Y+
00DA FDE1 SBRC R30,1
00DB 9508 RET
00DC 90A9 LD R10,Y+
00DD 90B9 LD R11,Y+
00DE FDE2 SBRC R30,2
00DF 9508 RET
00E0 90C9 LD R12,Y+
00E1 90D9 LD R13,Y+
00E2 FDE3 SBRC R30,3
00E3 9508 RET
00E4 90E9 LD R14,Y+
00E5 90F9 LD R15,Y+
00E6 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -