主要的程序我也贴上来各位看一下) Y `1 E3 y. H3 Z) w: U4 O ) K! F p( i$ h, B /********端口初始化函数********/" t- d, G3 f& s: X6 N F) A void init() 1 O- o6 Y4 L$ I; x{0 R# j' _$ T. `# T3 L. i! ^, I ANSELH=0x00; //设置B口为数字I/O口1 q5 N; [: G7 _) J$ ` OPTION_REG=0x00; + |+ D4 M7 X. WWPUB=0xFF; //设置B口弱上拉" J; p7 ^8 d& M4 A" m INTCON=0x00; //关总中断: Q4 b7 G0 p' y& v6 V PIE1=0; //PIE1的中断禁止 . K* ~) i& S! G# R b* q5 \PIE2=0; //PIE2的中断禁止 8 U3 i+ I e' J9 f2 @9 p3 e8 N i- ?( HTRISB0=1;9 p. I$ [$ U6 J TRISB1=1; //将RB1设置为输入口,按按键 2 g+ x x" s6 _3 T* u% ?TRISB2=1; //将RB2设置为输入口,按按键 7 U; H5 ?0 z: B$ {9 T9 xTRISB3=1; ; c: T6 m, ?7 n5 R# wTRISB4=1;, q1 Q+ z4 z0 `6 a RC1=0; 2 Q; p( f/ g, U4 ZTRISC1=0; //脉宽调制输出引脚,设置为输出5 W% w2 `. F y8 A0 e } + p0 V2 v3 {8 O# z( X/********PWM初始化函数********/ 5 C* g1 @. ~2 M( I% g/ }& I& g$ Pvoid PWM_Init() ) z' o0 w& s+ |; f{3 P3 `' G2 l, @2 A+ d9 `6 \+ Y PR2=249; //脉宽调制波形的周期为1000us! Q1 v+ {4 p- x# w" u0 \5 ~ CCP2CON=0x0C; //CCP2模块工作在PWM模式,占空因数的低两位为00 2 i& ]# a+ |0 E9 J- A5 xT2CON=0x02; //禁止TMR2,且前后分频值为16,同时开始输出PWM, L" F* n; U# _. m7 _ a7 U CCPR2L=0xB8; //脉宽调制波形的占空比初始值 3 ~( ?( Q" U' p; M}" d1 ?* V" x* K( ]6 k9 H /********键盘扫描函数******* */; v, y3 G# G2 s p* a: |( C void keyscan()* [- g q. o3 T9 g2 S+ {, D5 Z { 1 ?7 j5 U" n/ L4 O6 e, ?if(RB1==0) //如果是RB1键按下 6 o5 a* E& x. m" \ d% g6 f" G- Y{$ z( f9 @( u8 Q) ^9 D delay_ms(5); //延时去抖 5 _. Y' e; u: d% K6 Nif(RB1==0) //确认是否有键按下 9 h7 ]* }+ Q; t. }$ i' c8 v) I2 v' x{ 4 b: o- \2 H$ w" ~& U0 F. X5 |: _- Vwhile(!RB1); //等待按键释放 $ \& F. ^% O7 B3 f+ Q @9 sCCP2CON=0x0C;% K% ?, D. l7 P4 t2 k. |+ C8 I) r CCPR2L=0xB8; //80%占空比 3 _- e8 ?( U' LTMR2ON=1; 9 W1 k) _3 z" S4 {( x; ` L} * a$ J# R6 R- p2 U}1 ]! I+ D% {' I3 c8 [ if(RB2==0) //如果是RB2键按下2 E6 C) S, F* q; E) e { " u9 q5 D1 j# m. r0 ~delay_ms(5); //延时去抖 & W, u5 [% m( Z1 f3 v: F: kif(RB2==0) //确认是否有键按下8 E, n8 `2 j7 q+ V6 b1 Z { 6 ~8 Z! R5 L) z. e) m1 \' i# Kwhile(!RB2); //等待按键释放- s; V" k. w/ S6 t |+ s3 Z CCP2CON=0x0C;" h1 K* `4 i/ g1 C CCPR2L=0x96; //60%占空比 ( f; Y4 h9 b/ Z: yTMR2ON=1; ) k4 G. |- \- v& r1 j} 7 L9 R% ~3 W/ m* e }% g}6 y) F2 M6 X) L$ ] if(RB0==0) //如果是RB0键按下# e j. v" e# C8 Y. Q { ! o! t7 ~2 c3 s! t+ vdelay_ms(5); //延时去抖 2 c( e6 D" r# G3 sif(RB0==0) //确认是否有键按下 1 ~5 ~# M" _, c4 T: G) w# A{0 T% E! F8 S4 S9 y while(!RB0); //等待按键释放/ `9 W+ u# h; @/ L# ^: m CCP2CON=0x00; //关PWM / g7 @6 s$ {* x6 X' E6 b/ w1 yTMR2ON=0; //禁止TMR2 ) W) ?& w8 C" `) m- c+ Z//delay_ms(5); 6 }: X' [7 c5 ?" f6 x: b. jRC1=0;/ n9 f; z+ I! L8 Z/ P! U } ) m0 F2 _" h! h" W}+ P- a) U% E. x! z6 \8 u }/ m% S9 A( G( O% x5 v /********主函数********/ & i" x9 u( r r1 ^6 }7 r9 C1 cvoid main() & P' o2 P3 Z, F{ # l2 E( b) u t5 s6 h9 R6 C+ n' i9 Xinit(); //系统初始化 : t8 k4 d9 e6 g2 l! Z# GPWM_Init(); //脉冲宽度初始化2 q4 g1 n# n: K while(1) ' r$ P' l, `4 N) i5 e( @" @{$ Q9 x. @0 B: _6 \- Q( `; X3 @' _ keyscan(); //调用按键扫描处理脉宽因数 9 a2 j( q3 H. V0 X} / c) A" T& ?2 D% n} |