主要的程序我也贴上来各位看一下2 [; p# c) U3 j9 T
$ g- Q* q6 ~8 g% Z! I3 r
/********端口初始化函数********/
7 ~) Z( [5 O1 x# t* o2 B# Zvoid init()% c; r' U; q+ z( R0 i+ @
{
6 w- f# s2 ?# N9 T5 C% r2 t ANSELH=0x00; //设置B口为数字I/O口
s, c/ q' y! t1 B: Z5 I0 M OPTION_REG=0x00;
$ b) t% x- b' _7 | WPUB=0xFF; //设置B口弱上拉( }* s0 m8 j6 S4 d
INTCON=0x00; //关总中断4 r' K$ R6 u2 m6 \( s2 Z
PIE1=0; //PIE1的中断禁止
: U! l' b( ^6 @/ h# Q- g0 N" T* _ PIE2=0; //PIE2的中断禁止
, i5 `: u; K" A TRISB0=1;$ h( j+ d4 f' K
TRISB1=1; //将RB1设置为输入口,按按键
& l+ p; j0 ~! ?4 S TRISB2=1; //将RB2设置为输入口,按按键
8 y: a. \. m" [1 T7 `, F4 m/ C TRISB3=1;
# n' @' h! k' s0 q$ c TRISB4=1;
/ ~$ j7 W: R- [* l RC1=0;5 Q9 U6 z+ A* n" y) I9 D7 u* m9 y
TRISC1=0; //脉宽调制输出引脚,设置为输出, n0 ]' I2 x; W4 l) Z! R( M) b
}5 N6 `3 z z% n" G2 j) j
/********PWM初始化函数********/
6 m+ J* i1 u& p! ^. K$ [0 tvoid PWM_Init()+ H3 F P3 ^9 x
{$ K6 L- o$ t1 p, p, l- B
PR2=249; //脉宽调制波形的周期为1000us ! i' ^* O6 H0 L# x! ~; o2 t
CCP2CON=0x0C; //CCP2模块工作在PWM模式,占空因数的低两位为00' o$ a* ^5 T) k& H% v; C+ u
T2CON=0x02; //禁止TMR2,且前后分频值为16,同时开始输出PWM
* d* T1 f; T; U3 |; n. `2 D CCPR2L=0xB8; //脉宽调制波形的占空比初始值) l- N- T% |! c+ K
}7 E) x, Z; _) ?. w. Y: {
/********键盘扫描函数******* */( @/ \- R/ J. e: D; ^' _5 e
void keyscan()/ ^0 u( n) o7 v
{3 F4 C: P1 ^) y/ Q6 @- d3 ~
if(RB1==0) //如果是RB1键按下
/ A: a. D9 X$ ~) ^+ X) j; _/ O# [ {: X8 F3 S! r1 y2 J. d+ ]
delay_ms(5); //延时去抖, h. b8 ?( c- R4 u+ ^, T1 x9 @. x7 _
if(RB1==0) //确认是否有键按下0 Q# U: H# u* F1 ^" {
{* {% w1 N6 q) n: Q5 U7 H+ {) U
while(!RB1); //等待按键释放
) i; L+ k" k% @3 R CCP2CON=0x0C;
3 O2 ]8 l4 D5 K: Q$ { CCPR2L=0xB8; //80%占空比& J9 Z7 R& S4 f1 l9 g$ y& ?
TMR2ON=1;$ ~, a( r0 V0 t; r, X
}& x x; ]6 s! o
}
2 |- g: B7 k8 J( s4 F6 s if(RB2==0) //如果是RB2键按下
) b& U0 z6 h1 {' H2 d! N) d7 X {
( b/ ~9 B8 v+ @+ c& V delay_ms(5); //延时去抖
. l- B: N; z8 @; x( ] if(RB2==0) //确认是否有键按下
# r4 R7 `. p5 `4 \, m! E9 y {
1 l: }* P9 o4 z# F7 c) ] while(!RB2); //等待按键释放
: C# B+ u& y' ~1 z( S CCP2CON=0x0C;4 s1 Z& }& h/ k5 x: u
CCPR2L=0x96; //60%占空比
# b* b; S$ i) u, u- I# t7 X TMR2ON=1;6 x( u3 U$ H, X
}
2 t Y q5 Y, w" p }/ z% P3 r; P& L) Q
if(RB0==0) //如果是RB0键按下+ X. W3 Y6 l8 S+ |. ]
{7 K2 z$ u6 m! A8 C, b; d( ~/ m
delay_ms(5); //延时去抖
$ B3 X5 X. u% a8 [% K if(RB0==0) //确认是否有键按下
' n3 b2 p) a6 R& j {# c3 \9 G, ]1 `9 G2 M- u" L8 b6 j$ [
while(!RB0); //等待按键释放
$ \2 q- G/ b; x: x& V CCP2CON=0x00; //关PWM
# N; f$ ^' n% r% [ TMR2ON=0; //禁止TMR2
) M1 d j; e, F' V6 k' S //delay_ms(5);) S3 B/ s# b/ m& V( d7 ?
RC1=0;
- G6 \6 W+ {# k3 z" V; e# z }
+ l7 E4 V' B2 v7 r- z }
' y* w* s/ c5 N# A" }; k L}
4 J" ^& W( N1 T/ }+ |. x ?2 W/********主函数********/
1 x6 l* m9 |4 Y" b/ Ovoid main()% c3 D* g! a. T0 H- R
{
" v, q6 B2 R3 C- Y- P) ~ o Q8 x init(); //系统初始化
; }9 F8 f7 u- @- _9 X PWM_Init(); //脉冲宽度初始化% h) v. p3 v- A6 @' C! M
while(1)
$ R8 M* z/ Y. Y% Z; n9 L2 S' T {& j/ D0 R2 p8 w7 n$ `
keyscan(); //调用按键扫描处理脉宽因数3 `6 |, a$ y2 c/ p
}" _4 v& c' F$ f5 J
} |