主要的程序我也贴上来各位看一下
( a6 R+ j1 K$ v
' I/ i3 h _; b1 E6 w& r% ?/********端口初始化函数********/2 {* Z# z' Y p' G: O2 h. l$ Q9 {" v
void init()! h1 ~$ d8 U. L7 V P' ~
{
6 H7 t$ Z) V. r J ANSELH=0x00; //设置B口为数字I/O口
3 e# s( m/ G7 |9 T( V$ |6 [3 A OPTION_REG=0x00;
) K% K) L) o$ ]. w WPUB=0xFF; //设置B口弱上拉; d/ z z4 Q* r
INTCON=0x00; //关总中断, b; P" ?5 B4 P% [
PIE1=0; //PIE1的中断禁止- ^# P+ C* t5 t/ q- T) G
PIE2=0; //PIE2的中断禁止
" Q0 S; @3 ^0 a, t) T9 I( c TRISB0=1;$ Q L3 F% ^. I! l
TRISB1=1; //将RB1设置为输入口,按按键
+ p: G/ t+ h0 X- [ TRISB2=1; //将RB2设置为输入口,按按键
; I1 Q6 P3 l& f6 e2 {8 D4 e5 o TRISB3=1;
/ t6 s! I+ Y5 I* Q TRISB4=1;
& C6 [1 z& L/ b2 Y% R RC1=0;+ W9 ]1 _; q" E3 ], ^
TRISC1=0; //脉宽调制输出引脚,设置为输出
' t0 F" h; X2 P& i4 J2 i8 m}
( { \5 }. I8 n+ U2 U5 [0 w/********PWM初始化函数********/
/ F, ~. y$ S( u8 Cvoid PWM_Init()
% N" X$ {# E5 K/ C. N4 h; o{
1 O8 t& x3 o9 f) B% V PR2=249; //脉宽调制波形的周期为1000us
$ `3 ^; l M# W7 J) x CCP2CON=0x0C; //CCP2模块工作在PWM模式,占空因数的低两位为00' D- N' Y' n/ s( M6 c* V/ t7 U
T2CON=0x02; //禁止TMR2,且前后分频值为16,同时开始输出PWM q. ]$ q, V: ~& n; w6 a
CCPR2L=0xB8; //脉宽调制波形的占空比初始值; `6 z) p( L$ E! y. Z) y
} [& j0 E4 i, ?9 Q( A
/********键盘扫描函数******* */
1 X' M7 F2 S3 O C$ Fvoid keyscan() L, l c- B( q( q
{
6 k: `% w3 k; X* v if(RB1==0) //如果是RB1键按下
/ e7 Z" W6 F; t0 H {- ]* Q6 ~% V6 R* G0 C7 X
delay_ms(5); //延时去抖
0 v* U! r r$ K6 Z0 M if(RB1==0) //确认是否有键按下5 j" [% }- f1 k1 x/ i
{5 }+ [& O3 [* K+ X/ C; ?
while(!RB1); //等待按键释放6 C1 R0 v2 o# j8 y0 \! A6 a7 Q- O% n
CCP2CON=0x0C;; N6 p+ W! t" q: B# N) L: O
CCPR2L=0xB8; //80%占空比/ V' r0 L8 u. c9 y# ^* v
TMR2ON=1;- l c/ j5 y2 A
}3 N8 K# d; [ @1 |3 o: J; R4 I
}
5 d" |& ^2 T' E7 k) c" D if(RB2==0) //如果是RB2键按下
0 Y" D6 A- a$ b" E) \$ Z+ P {
3 [1 k [, w+ R+ r* m delay_ms(5); //延时去抖
/ \3 ]9 J# g E# f1 _0 t6 d if(RB2==0) //确认是否有键按下
i' G" F% [# h' j1 j6 e; ^9 |: { {
9 d* Y" o0 O( L; ~: W; ]/ [ while(!RB2); //等待按键释放9 o, \7 i" [* U
CCP2CON=0x0C;
, S0 T0 `; J& U$ J5 g6 ~ CCPR2L=0x96; //60%占空比0 [2 c2 Y2 F) S# v$ r8 J
TMR2ON=1;
4 S9 v& Q6 E$ ~: S+ D }
+ z: Q& N3 ^* D4 {/ r }
/ P% m* Q/ i; g- R2 d$ |6 a- o7 w9 k if(RB0==0) //如果是RB0键按下- Q; ^8 v( X3 }, |; P* j
{
7 m! x4 Z1 C5 U" U delay_ms(5); //延时去抖
8 n/ U9 |# R' [/ X0 [ if(RB0==0) //确认是否有键按下" q$ M; \0 s, X) C' P& o
{
, R6 x; d" p4 j" e while(!RB0); //等待按键释放
3 C) q& `: B1 P5 @( L CCP2CON=0x00; //关PWM6 t3 \/ I4 o% K: N {& ^
TMR2ON=0; //禁止TMR2
d3 T8 c! K3 `3 q3 @) @) s //delay_ms(5);
4 X% l6 L- u5 a9 J RC1=0;
0 X v& M% r/ ? }
3 g; m% o+ {/ a" L( N/ Z }
9 i& E, \: b- [1 m}
( N; K8 c) c- h1 a) m6 l3 R' ^; {: e: E/********主函数********/
9 k+ ], i( m9 ^8 E' `9 B- ~$ ]( ~+ Qvoid main()
$ F% E0 e" k6 d0 t# t$ ?7 ^{
& v7 C0 X4 {+ Z5 T1 Q- O init(); //系统初始化$ k3 D9 L) D. n% k
PWM_Init(); //脉冲宽度初始化
' V1 s9 l8 Y5 _! U( L# c while(1)# ~3 ^9 q2 J* a }
{% M) t# J6 [4 e9 L- q' N$ @
keyscan(); //调用按键扫描处理脉宽因数3 l( |, I- C, H4 i4 C+ C
}
3 I' j# F/ q0 v/ p c} |