改变PWM输出波占空比程序
;本例通过编程,使CCP1模块工作在脉宽调制PWM 方式下从RC2 口上输出分辨率达10位的
;PWM 波形,波形的占空比可以通过键盘调节,当按下 K1 键时,输出的 PWM 波形的占空比为 25%, ;当按下 K2 键时,输出的 PWM 波形的占空比为 50%,当按下 K3 键时,输出的 PWM 波形的占空 ;比为 75%,当按下 K4 键时,输出的 PWM 波形的占空比为 100% ,默认输出波形的占空比为 50% ;为了强调编程技巧,键盘程序
采用变位中断方式
LIST P=18F458 INCLUDE "P18F458.INC"
DEYH EQU 0X20
DEYL EQU DEYH+1
JIANR EQU DEYH+2
;存储键值用寄存
器
ORG 0X00
GOTO MAIN
;转向主程序
ORG 0X08
GOTO INTSERVE
;转向中断服务程
序
ORG 0X30
CLRF INTCON
;禁止总中断和外围中断 BSF INTCON , RBIE ;B 口变位中断允许 BCF INTCON2 , 7 ;使弱上拉有效 BSF INTCON2 , 1 ;B 口变位中断高优先级 BSF RCON , 7
;使能中断优先级
MOVLW 0XFF
MOVWF PR2
;设置 PWM 的工作周期
MOVLW 0X7F
MOVWF CCPR1L
;默认占空比为 50%
MOVLW 0X3C
MOVWF
CCP1CON
;设置 CCP1 模块为 PWM 工作方式,且其工作循
环的低2位为11,高8位为01111111=7F
MOVLW 0X04
MOVWF T2CON ;打开TMR2,且使其前分频为1 BCF TRISC , 2
;设置 CCP1 引脚为输出方式
BCF TRISB , 1
BCF TRISA , 3
BCF
TRISE , 0
初始化子程序
.***************
******************
INITIAL
BCF TRISE,1
BSF TRISB,4 ;设置与键盘有关的各口的输入输出方式
BCF PORTB,1
BCF PORTA,3
BCF PORTE,0
BCF PORTE,1 ;K1,K2,K3,K4 四条列线置0,为电平变化
;中断的产生创造初始条件
MOVF PORTB,W ;读PORTB 端口,建立变位中断的初始条件
;(由高到低时中断)
RETURN
键盘去抖子程序(8ms 的延时)******************
.*********
MOVLW 0X0A
MOVWF DEYH
AGAIN2 MOVLW 0XFF
MOVWF DEYL
AGAIN1 DECFSZ DEYL , 1
GOTO AGAIN1
DECFSZ DEYH , 1
GOTO AGAIN2
RETURN
;*************** 键服务子程序
******************
KEYSERVE
JIANZHI
BCF PORTB,1
BCF PORTA,3
MOVLW 0X03
MOVWF PORTE
NOP
NOP
BTFSS PORTB,4
GOTO K1K2
GOTO K3K4
K1K2 BCF PORTB,1
BSF PORTA,3
NOP ;具体程序语句参考 3. 2节
;确定键值的子程序
;K1 ,K2 置低电平,K3,K4 置高电平
;使引脚电平稳定
;RB4 为0,表示按键为K1 ,K2 中的一个;RB4 为1,表示按键为K3 ,K4 中的一个
;K1 置低电平,K2 置高电平
KEYDELA Y
BTFSS PORTB,4
GOTO K1 ;RB4 为0,表示按键为K1
GOTO K2 ;RB4 为1,表示按键为K2
K3K4 BCF PORTE,0
BSF PORTE,1 ;K3 置低电平,K4 置高电平
NOP
NOP ;使引脚电平稳定
BTFSS PORTB,4
GOTO K3 ;RB4 为0,表示按键为K3
GOTO K4 ;RB4 为1,表示按键为K4 ,以上对键盘进行
扫;描,来确定是哪一个键按下
K1 MOVLW 0X01
MOVWF JIANR
GOTO RET
K2 MOVLW 0X02
MOVWF JIANR
BCF PORTA,3
GOTO RET
K3 MOVLW 0X03
MOVWF JIANR
GOTO RET
K4 MOVLW 0X04
MOVWF JIANR ;以上根据按下的键把相应的值送给JIANR
BCF PORTE,1
RET NOP
RETURN
.*********
确定占空比为25%的子程序*********
*
PER25 MOVLW 0X3F
MOVWF CCPR1L
RETURN
.*********
确定占空比为50%的子程序*********
*
PER50 MOVLW 0X7F
MOVWF CCPR1L
RETURN
.*********
确定占空比为75%的子程序*********
*
NOP BCF INTCON , RBIF ;清除中断标志
CALL KEYDELA Y ;调用软件延时子程序消抖动
MOVF
PORTB ,W
;读 PORTB 的值,并同时改变中断发生的条件可 ;以屏蔽一次无用的中断,又可以防止按键时间 ;过长发生连续中断
BTFSC
PORTB ,4
RETFIE
;判断为干扰,则返回,并可以屏蔽一次无用的 ;中断
CALL KEYSERVE
;调用键服务子程序,确定键值
BCF PORTB ,1
BCF PORTA ,3
BCF PORTE ,0
BCF
PORTE ,1
;送低电平至K1 , K2 , K3 , K4,以防止键扫描 ;时改变 K1 , K2, K3, K4 的电平,从而改变
中
;断条件
BCF
INTCON , RBIF
;键扫描时可能会产生 "电平变化"而使 RBIF ;
置 1,再清除一次 RBIF 以求避免额外中断
MOVLW 0X01 ;以下通过判断是哪个键按下从 SUBWF JIANR ,0
;而选择 PWM 波形的不同占空比
BTFSC STATUS ,Z
CALL
PER25
;若是 K1 按下,则 PWM 占空比为 25% ;以下同理
MOVLW 0X02
SUBWF JIANR ,0
BTFSC STATUS ,Z
CALL PER50
MOVLW 0X03
SUBWF
JIANR ,0
PER75
MOVLW MOVWF RETURN
0XBF CCPR1L
.********** 确定占空比为 100%的子程序
PER100
MOVLW 0XFF MOVWF CCPR1L
RETURN
.**************
INTSERVE
中断服务子程序 ***************
BTFSC STATUS,Z
CALL PER75
MOVLW 0X04
SUBWF JIANR,0
BTFSC STATUS,Z
CALL PER100
RETFIE ;中断返回
.****************************************
MAIN NOP
CALL INITIAL ;初始化
BSF INTCON ,GIE
;总中断允许
HERE GOTO HERE ;等待中断END