主要的程序我也贴上来各位看一下
9 e( z8 X7 R& j* Y$ e" O3 L2 W2 A4 W
/********端口初始化函数********/; B$ M+ t) m9 M; m ]9 A6 E
void init()
: }! g* v7 {( `{# p7 z3 y% o, V
ANSELH=0x00; //设置B口为数字I/O口0 | G! x6 F1 D$ a
OPTION_REG=0x00;
9 G5 d' ]# }7 W$ Z% u/ T WPUB=0xFF; //设置B口弱上拉1 G8 f: O3 r4 G5 o
INTCON=0x00; //关总中断
7 i1 u: y# T! p9 p PIE1=0; //PIE1的中断禁止
( `# D8 N6 c/ ~ s2 C' h2 {& m PIE2=0; //PIE2的中断禁止1 W/ s) C( o) j
TRISB0=1;
i4 F l, m9 L3 g% g3 Y; } TRISB1=1; //将RB1设置为输入口,按按键, u$ d8 y- {2 ?5 Z+ f
TRISB2=1; //将RB2设置为输入口,按按键
9 y) s/ G4 X1 |# m; R TRISB3=1;
$ l* p7 h1 a% F$ c7 @$ u TRISB4=1;
, W6 ]7 m* |5 o z& b1 C3 e$ E/ m RC1=0;
, _2 L6 d, b2 r) L" t$ { TRISC1=0; //脉宽调制输出引脚,设置为输出1 y0 g" b- I: V( d. w- W
}
) o8 r, h6 `9 |3 X/********PWM初始化函数********/
: J6 k* ^; i b4 L# X, l+ _void PWM_Init()
( w9 ?6 C# D6 |) R* H{
3 A0 w% Y2 Y4 ?) C1 g# C% ~ PR2=249; //脉宽调制波形的周期为1000us
/ x" g* q; a+ J( i; Z CCP2CON=0x0C; //CCP2模块工作在PWM模式,占空因数的低两位为00, G: C6 s/ m5 h# T
T2CON=0x02; //禁止TMR2,且前后分频值为16,同时开始输出PWM) s4 t' J& o# k3 T Z9 z
CCPR2L=0xB8; //脉宽调制波形的占空比初始值, ?. W2 ?; x/ p" ?; X, S' M+ ?
}4 B# O2 h' L* F+ \4 s0 ]/ V
/********键盘扫描函数******* */
4 [ L9 `/ k8 Q$ E( O M2 q+ Gvoid keyscan(), ]* X4 N% A' P y
{ R% _: q, \+ \, \& l( |) v, Q8 p: Q- J
if(RB1==0) //如果是RB1键按下" g6 T/ |/ N$ N% Q4 X
{7 r2 d6 C6 J {& X" M; D4 G
delay_ms(5); //延时去抖
3 m2 \/ ~2 [8 F3 z) C6 V0 C if(RB1==0) //确认是否有键按下( I+ G8 w5 _/ ^5 `
{8 C( }4 x0 k3 L2 ^4 Y; s
while(!RB1); //等待按键释放$ k2 ^4 e/ p: r6 i' d% P# F: h- |; J
CCP2CON=0x0C;) Q5 k) S7 G( Z
CCPR2L=0xB8; //80%占空比
! x8 e' P6 }/ Q* [: Z8 U7 r0 G TMR2ON=1;( s: \( W) ]3 N! b
}+ }$ p) h& D: d: Z% L h6 | j/ d
}
) ]3 |8 r. u+ C# R if(RB2==0) //如果是RB2键按下( ]' M* O+ Q0 S" |" x7 h7 w" k
{" C/ F% e) _7 E. s/ L
delay_ms(5); //延时去抖
% |- K* N2 N3 @) M" X7 T if(RB2==0) //确认是否有键按下
; \- \$ J/ Q4 f+ k {
% v. n# I! }2 G! j* G" N7 e1 B while(!RB2); //等待按键释放
7 p4 V, T; M4 h( e) J CCP2CON=0x0C;) S5 H) o* X8 S! p3 V" E, A
CCPR2L=0x96; //60%占空比* X- @4 R3 _: E, U
TMR2ON=1;
: _* J& X: v" M7 `9 k }
* z6 q2 }8 \' N2 [% p* [. v }8 y- A1 k% [% ~) n) Y( ~2 H' v
if(RB0==0) //如果是RB0键按下9 m8 }- r# I. X
{
/ ^1 G6 ?8 H. L$ r3 t delay_ms(5); //延时去抖
) K/ I+ s2 Z! A* S' W$ y if(RB0==0) //确认是否有键按下
1 }: z! U! ]# E5 K: s# m8 P) B, { {
$ z4 B/ ], ]5 F; G while(!RB0); //等待按键释放 A' y+ s* j8 a
CCP2CON=0x00; //关PWM
* A- t7 O; w ? w2 s: K TMR2ON=0; //禁止TMR29 L2 a) S* o1 Y8 F* w l$ t
//delay_ms(5);( z4 f5 t. ^! N
RC1=0;4 K, g- d. Y: `
}
3 g0 X4 L" K4 |4 j }
: T* s. B1 h7 k% n8 Y* _}; `# l- i6 g |, J4 W) U2 x
/********主函数********/
' R) J; a8 o# F# R$ q% i: Bvoid main()
, @5 k O- B B0 c6 Q) D{
0 [$ P5 \5 ^! z init(); //系统初始化
! U: u! d p% k" @. `; v: W PWM_Init(); //脉冲宽度初始化! q& |# N2 e: n9 i" W
while(1)$ [0 Q1 U& W' v. v* I9 n& z
{: i9 s5 M1 r4 }# V4 G6 ~; W
keyscan(); //调用按键扫描处理脉宽因数
4 l6 X5 F; U0 O/ z8 C7 v# b }
( P( D; h. ?8 e; g5 S/ w} |