主要的程序我也贴上来各位看一下
" k8 t) D( J0 [5 M+ x) @) b& w. S
7 ?$ t Y3 R* }& T r5 w) I/********端口初始化函数********/( ^9 r: p4 p2 Y) {. H; L5 C$ r
void init()1 a- v9 }3 {! b9 `
{7 v2 y' S O# G5 i) S
ANSELH=0x00; //设置B口为数字I/O口- P1 ]* v* B9 U' v
OPTION_REG=0x00;
4 Z/ e& w& H- f$ c8 |$ a) g! n WPUB=0xFF; //设置B口弱上拉# q) b4 v5 r$ R7 ~* y, M I( q5 t0 U/ ]
INTCON=0x00; //关总中断
. {: u( m7 }* K; t0 G PIE1=0; //PIE1的中断禁止* m! b% [2 G! w- P# w6 @) B5 G$ M
PIE2=0; //PIE2的中断禁止5 u) H# B/ N9 y/ t* i* Z5 @$ d
TRISB0=1;: E4 e) N: d" i" |& w& K
TRISB1=1; //将RB1设置为输入口,按按键
7 ~+ I& W9 k( [& r- T TRISB2=1; //将RB2设置为输入口,按按键
/ _/ o) L* c% R, [/ _ TRISB3=1;
6 K- Z) V, q; [ D. E$ x. z$ u TRISB4=1;
/ h8 H$ @ C( O6 T' w& C RC1=0;
; w8 V/ I5 R" ?6 u/ O: }( { TRISC1=0; //脉宽调制输出引脚,设置为输出2 D8 a2 _8 P& O2 y
}
3 y5 H; k, N+ Y) C/********PWM初始化函数********/
2 F& h0 l# U" V6 _$ r+ nvoid PWM_Init()" t7 x! C) y% [
{! {4 f6 [9 b: L: r7 @1 `, w5 ^
PR2=249; //脉宽调制波形的周期为1000us
/ r& t- }) n) D- Y m% y; ^ CCP2CON=0x0C; //CCP2模块工作在PWM模式,占空因数的低两位为00
/ F4 c. \+ W. p9 e& W; S/ h! a, q& e T2CON=0x02; //禁止TMR2,且前后分频值为16,同时开始输出PWM/ |; S* `) j. S
CCPR2L=0xB8; //脉宽调制波形的占空比初始值8 p8 \$ w1 h& M! X" w6 A) U
}5 F" x n8 j! \: R) ^6 A* k# }! H5 N4 b
/********键盘扫描函数******* */
! H7 {; d6 p. u: W3 C6 p9 f' }void keyscan()
3 `9 |% r4 d+ s5 J{
2 H& @' j( ^ W2 B if(RB1==0) //如果是RB1键按下* U+ ?; E I& H7 V0 a5 F
{
/ t. N2 m+ g7 f delay_ms(5); //延时去抖9 w" V8 T2 N- g' ` o1 u
if(RB1==0) //确认是否有键按下7 r7 n* p* {0 o
{
" P2 R3 A5 B! s* p& W- K4 \ while(!RB1); //等待按键释放 T" j [7 R3 Y6 K P* @% ^* o
CCP2CON=0x0C;, |) A+ j9 u6 d- F! D
CCPR2L=0xB8; //80%占空比
, h2 J$ t8 R! T" x* i; ^" ^) o TMR2ON=1;" K0 |. I6 s+ U" o' ]2 @) t
}
4 {" \) r v% d0 W+ m C$ J2 F, c }4 T. b: f; g' w% [! ?- z
if(RB2==0) //如果是RB2键按下5 c3 _4 M- z' h9 C& ^6 t B: ?9 d
{0 y) G5 ]# N) \! U* k
delay_ms(5); //延时去抖8 ?2 X6 P0 I2 l- z" y- o1 K4 e
if(RB2==0) //确认是否有键按下$ S5 ^6 G$ m2 b+ D; R/ k
{4 m" u, E, i% ]" q. G5 x9 Q E
while(!RB2); //等待按键释放
2 `% B- r0 h$ j CCP2CON=0x0C;
/ g) p; X5 U# X e+ s CCPR2L=0x96; //60%占空比
2 S& B2 P' x7 b( ?. `6 C# j TMR2ON=1;
5 `/ h. N2 K% M( D3 u) @ }
) v- O$ [! u! e6 A3 R9 I5 g4 A& U; V3 N }
' t6 i) Z8 A. s. T4 ] if(RB0==0) //如果是RB0键按下
+ }8 ?7 n5 x* K/ m$ @4 W; [6 e4 o {
" i( t& U* B# ^9 j; L* E! g delay_ms(5); //延时去抖
0 d! x# S! a4 H3 y9 [: D7 c if(RB0==0) //确认是否有键按下
+ z1 a) N8 n/ N% O9 |/ l {
) ~' R, ?% n1 Z3 d# V. D while(!RB0); //等待按键释放1 u$ S8 s, p d# ]$ ?
CCP2CON=0x00; //关PWM9 z, o# B# ^6 ]
TMR2ON=0; //禁止TMR2
* r: g% I4 B5 r j# D //delay_ms(5);0 u& W. \% P. }- f0 x6 k# Q
RC1=0; e0 F$ l7 s/ k& \; a( g$ b* r6 I
}) ]) j; U3 B- F* o5 K$ _) K
}9 j7 Z* E. H/ D4 y1 l) t! [6 z
}( F5 v; `& t- y- F! n, [6 D
/********主函数********/
4 H( l9 R% R3 m& N# t! ?void main()0 X- |9 `' R, Z" v; y
{( v$ q. B1 b5 P
init(); //系统初始化
/ @4 I$ I: o. e# y! p) E; n, [ PWM_Init(); //脉冲宽度初始化
& Z3 E1 o K/ _- ?/ U while(1)7 M m2 \3 s+ `. M* _6 u" S
{
) ]" j0 i$ I1 g* r% q1 v+ H8 x+ ~/ s keyscan(); //调用按键扫描处理脉宽因数
2 I0 i2 j0 c+ S% j3 h7 x3 p }
, v G; }7 p& G& {5 ]3 Z- g {# N} |