主要的程序我也贴上来各位看一下0 T' Q- k/ J, }! e. K
$ q& s) t2 S4 E; {- e
/********端口初始化函数********/! R" u& q/ V+ f2 b/ U9 s
void init()- A2 w8 P, C3 J# B( n1 U: v
{' s7 q+ p5 c. i0 j Y0 R
ANSELH=0x00; //设置B口为数字I/O口
/ ~4 n! W. D$ k; q( ^# ? OPTION_REG=0x00;
( N& @( L- B$ l7 r8 C% K* c WPUB=0xFF; //设置B口弱上拉
2 o A4 b, N7 ]! [7 k* O INTCON=0x00; //关总中断% l, W4 y* [3 k8 M, n: l
PIE1=0; //PIE1的中断禁止
" Q& Y+ E1 R0 W9 G$ b3 q! D* u PIE2=0; //PIE2的中断禁止
' a* a+ \0 V" o TRISB0=1;
6 E7 P2 P/ r" _5 o7 f TRISB1=1; //将RB1设置为输入口,按按键
! i/ W( b3 j% P$ y7 o TRISB2=1; //将RB2设置为输入口,按按键
+ [1 z3 v1 [4 k TRISB3=1;8 H& S" U7 v0 i8 Q
TRISB4=1;
2 p" V' a h S4 Q6 |3 L% v, G9 g3 H RC1=0;
) l6 F i, M0 q7 s TRISC1=0; //脉宽调制输出引脚,设置为输出
' j# j9 v6 z8 a, _8 S$ d& r}0 B; k) f8 D, [
/********PWM初始化函数********/
/ S: j$ l( L9 b! U# Lvoid PWM_Init()
( h4 g1 ]* T' L. n3 ]# E{
+ _# j% S$ o' W( ^& O+ u+ r PR2=249; //脉宽调制波形的周期为1000us
* X' h0 Z+ \3 S8 e, z8 b ?$ W, C CCP2CON=0x0C; //CCP2模块工作在PWM模式,占空因数的低两位为00* \% G" |: S5 ]" {# d, u
T2CON=0x02; //禁止TMR2,且前后分频值为16,同时开始输出PWM
5 M* {2 u) [; d! ~' [. {6 w8 E0 A CCPR2L=0xB8; //脉宽调制波形的占空比初始值5 r' o) D/ O- J, X$ U; U! P5 g
}0 D" |3 W$ P8 F5 g/ w+ ^8 Y
/********键盘扫描函数******* */
) T9 n; d& K/ |3 z r9 A1 g+ ivoid keyscan()
L* Y4 G. S; t+ D{# h# ^9 p( k# R& Q# {; B
if(RB1==0) //如果是RB1键按下0 Z2 B' p; a% N+ h, E8 t' \6 l
{3 v6 C/ T Y! O+ @
delay_ms(5); //延时去抖
. n+ \4 Q4 a) Z7 I if(RB1==0) //确认是否有键按下' \ `% \0 j5 J
{1 N. x3 A4 I) ]' l! ~+ s& Z2 @3 T5 ~
while(!RB1); //等待按键释放# r" g" @2 k0 f6 ~% j6 S/ `
CCP2CON=0x0C;
9 d$ L, E6 {- S9 v0 p$ ^. Y CCPR2L=0xB8; //80%占空比
, B- d+ ]: _; i9 y TMR2ON=1;- c6 R1 N7 b T
}6 O" i2 V% H, m, ^
}
$ X' s$ q& ?4 ?, M S, `7 b% T if(RB2==0) //如果是RB2键按下
7 [' y. l7 _% j N) y {1 N. X' X% w% P4 `; _! A# q% J3 L* p
delay_ms(5); //延时去抖% E( W' U- o* R% D4 Y4 f, N/ m) [
if(RB2==0) //确认是否有键按下
+ S3 d9 _0 g/ o/ @ {
$ b! _6 r, I2 K, W" D' ^+ f while(!RB2); //等待按键释放
& L( t% J& A$ s+ ^8 f CCP2CON=0x0C;
5 P! U2 l/ K- M7 C CCPR2L=0x96; //60%占空比, J c: D. R# y$ y" g- ]6 T) T
TMR2ON=1;$ a/ W: h+ K2 O/ z% ^$ ~. ~1 ?; @6 T
}
/ S4 V6 j& i0 D0 {2 w, x8 o }
8 z% p" j. M' e. T" d/ r8 F# J if(RB0==0) //如果是RB0键按下( t7 v$ h, Z* ^# N3 q
{
# e B6 K! g/ U! a. K9 m delay_ms(5); //延时去抖
6 W' M0 P4 Y) |( ]2 f$ } if(RB0==0) //确认是否有键按下
2 O- {8 J* y8 F7 U; p {
0 _: I E7 s$ L- B" ~ while(!RB0); //等待按键释放8 \5 w% L7 i9 @" \3 R
CCP2CON=0x00; //关PWM
9 m- |+ { j4 k" @ TMR2ON=0; //禁止TMR29 e8 H; l& n9 h1 c7 f m) A
//delay_ms(5);
) |- J4 j- e# l$ x6 v' p; W RC1=0;: Z7 m& |' x& @
}) p" `( P# S/ L+ A8 J* o: ]; `
}
9 G: s' y2 B6 L7 g! Q. b. {4 y2 C}& G, }. m% P0 r ^$ B7 _ I' H" J
/********主函数********/' t9 _8 z* ^6 N/ A3 W! ?
void main()3 S1 ?/ I8 J# U. W5 Q5 E
{$ y( W9 R& v1 W1 A( Y' t
init(); //系统初始化& a3 S' C/ Q9 U% _
PWM_Init(); //脉冲宽度初始化
+ m. S7 b0 q& S while(1)
0 P7 n+ ?% a5 ?/ p# I {2 u- I$ q! ]& S! o# F. K/ v& N* H
keyscan(); //调用按键扫描处理脉宽因数1 I4 ]+ b) ?# P. F& d3 U: U) f
}
8 d' x4 [# o& Z3 D1 `} |