📄 main.lis
字号:
.module main.c
.area text
; Period -> 0,X
; Duty -> 2,X
0000 _main::
0000 A7FC ais #-4
0002 95 tsx
0003 ; /*-----------------------------------------------------*
0003 ; *工 程 名:PWM.prj *
0003 ; *硬件接线:PTD.4,即定时器1通道0(21脚)接指示灯或蜂鸣器 *
0003 ; *程序描述:通过对PWM占空比的调节实现现指示灯的渐亮的功能*
0003 ; * 当占空比为100%时再从0%逐渐增加 *
0003 ; *目 的:学习HC08系列定时器脉宽调制功能 *
0003 ; *---------《嵌入式应用技术基础教程》教学实例----------*/
0003 ; /*[头文件]*/
0003 ; #include "GP32C.H" //包含头文件
0003 ; /*函数声明*/
0003 ; void PWMInit(unsigned int ); //PWM初始化
0003 ; void PWMconf(unsigned int); //PWM设置
0003 ; extern void Delay_ms(unsigned char ); //延时
0003 ; /*主程序*/
0003 ; void main()
0003 ; {
0003 ; unsigned int Period; //PWM周期
0003 ; unsigned int Duty; //PWM占空比
0003 ; //[变量初始化]
0003 ; Period =0x0180; //PWM周期默认为10ms
0003 A601 lda #1
0005 F7 sta ,X
0006 A680 lda #-128
0008 E701 sta 1,X
000A ; //[PWM初始化]
000A ; PWMInit(Period);
000A 87 psha
000B F6 lda ,X
000C 87 psha
000D CD005B jsr _PWMInit
0010 A702 ais #2
0012 95 tsx
0013 ; Duty = 0; //PWM占空比为0
0013 6F03 clr 3,X
0015 6F02 clr 2,X
0017 203D bra L3
0019 L2:
0019 ; //[主循环]
0019 ; while(1)
0019 ; {
0019 ; //[判断脉宽是否达到周期的长度(占空比为100%)]
0019 ; if(Duty<Period)
0019 E601 lda 1,X
001B B700 sta *__r1
001D F6 lda ,X
001E B700 sta *__r0
0020 E603 lda 3,X
0022 B700 sta *__r3
0024 E602 lda 2,X
0026 B700 sta *__r2
0028 5500 ldhx *__r2
002A 7500 cphx *__r0
002C 95 tsx
002D 240E bhs L5
002F ; Duty=Duty+1; //PWM占空比加1
002F E603 lda 3,X
0031 AB01 add #1
0033 E703 sta 3,X
0035 E602 lda 2,X
0037 A900 adc #0
0039 E702 sta 2,X
003B 2004 bra L6
003D L5:
003D ; else //占空比达到100%,设置占空比为0%
003D ; Duty=0;
003D 6F03 clr 3,X
003F 6F02 clr 2,X
0041 L6:
0041 1A20 bset #5,0x20
0043 E602 lda 2,X
0045 B726 sta 0x26
0047 E603 lda 3,X
0049 B727 sta 0x27
004B 1B20 bclr #5,0x20
004D A60A lda #10
004F 87 psha
0050 CD0000 jsr _Delay_ms
0053 A701 ais #1
0055 95 tsx
0056 L3:
0056 20C1 bra L2
0058 X0:
0058 L1:
0058 A704 ais #4
005A .dbline 0 ; func end
005A 81 rts
005B ; Temp -> 0,X
005B ; Period -> 4,X
005B _PWMInit::
005B A7FE ais #-2
005D 95 tsx
005E ; T1SC|=(1<<5); //停止定时器1计数器计数
005E ; //[设置PWM脉宽]
005E ; T1CH0H = (Duty>>8); //设置高字节
005E ; T1CH0L = Duty; //设置低字节
005E ; T1SC&=~(1<<5); //允许定时器1计数器计数
005E ; Delay_ms(10); //延时10ms
005E ; }
005E ; }
005E ; /*PWMconf:PWM初始化设置--------------------------------*
005E ; * 功 能:PWM脉冲周期、占空比的设置 *
005E ; * 参 数:rate=脉宽时钟数,cyc=脉冲周期时钟数 *
005E ; * 返 回:无 *
005E ; *-----------------------------------------------------*/
005E ; void PWMInit(unsigned int Period)
005E ; {
005E ; unsigned int Temp=Period;
005E E604 lda 4,X
0060 F7 sta ,X
0061 E605 lda 5,X
0063 E701 sta 1,X
0065 ; //不允许溢出中断,不启动计数,分频因子=64,置位TSTOP,TRST
0065 ; T1SC = 0x36;
0065 A636 lda #54
0067 B720 sta 0x20
0069 ; //[设置PWM周期]
0069 ; T1MODH = (Temp>>8);
0069 F6 lda ,X
006A B723 sta 0x23
006C ; T1MODL = Period;
006C E605 lda 5,X
006E B724 sta 0x24
0070 ; //[初始化设置PWM脉宽为0]
0070 ; T1CH0H = 0x00;
0070 3F26 clr 0x26
0072 ; T1CH0L = 0x00;
0072 3F27 clr 0x27
0074 ; //设为PWM模式,不允许输出比较中断,输出低电平,不带缓冲
0074 ; T1SC0 = 0x1E;
0074 A61E lda #30
0076 B725 sta 0x25
0078 ; //允许定时器1计数寄存器计数
0078 ; T1SC &= 0xDF;
0078 B620 lda 0x20
007A A4DF and #-33
007C B720 sta 0x20
007E L7:
007E A702 ais #2
0080 .dbline 0 ; func end
0080 81 rts
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -