主要的程序我也贴上来各位看一下6 F3 A0 z! ^% J& g) F3 `$ i! v
4 Z6 {) m4 e, p' o/********端口初始化函数********/) ~4 z9 J) i. U
void init()# _3 f3 @. r0 M i1 h3 L
{5 q& p/ [% ~9 _. X& f
ANSELH=0x00; //设置B口为数字I/O口( h7 n- z* K' D6 i7 f
OPTION_REG=0x00;6 y: X3 e7 C/ B1 O9 o
WPUB=0xFF; //设置B口弱上拉
0 d# p, H/ ^5 b/ [; B INTCON=0x00; //关总中断: {0 y5 K3 G; F, G3 n" x, u
PIE1=0; //PIE1的中断禁止; k& }! z5 P3 J# v) s' y% |
PIE2=0; //PIE2的中断禁止: ]" v9 Q! F G" }
TRISB0=1;' C6 a$ H0 |1 d5 o
TRISB1=1; //将RB1设置为输入口,按按键
% b+ z7 R, P( V) x) b TRISB2=1; //将RB2设置为输入口,按按键' g1 z d7 s# P7 ^0 b3 N- S
TRISB3=1;- c0 I9 A* Z$ z- K' x+ j$ k
TRISB4=1;
* \- c, z1 ]5 G) h2 J RC1=0;
8 b' k2 J( \( L TRISC1=0; //脉宽调制输出引脚,设置为输出1 F, Q3 o& l! G% `0 V+ T
}
7 p8 ^ c! O. @" ^. {. n/********PWM初始化函数********/. I" ~6 O8 ^5 \/ I
void PWM_Init()
4 S7 G* \/ T0 Z0 [$ c{5 [! i# g1 K& T9 o3 w
PR2=249; //脉宽调制波形的周期为1000us 4 \8 I+ m. c2 l. L7 A" U
CCP2CON=0x0C; //CCP2模块工作在PWM模式,占空因数的低两位为00
' P" ?9 d% Q, }; ]9 q& L9 l! a0 [ T2CON=0x02; //禁止TMR2,且前后分频值为16,同时开始输出PWM
2 O! x# I/ M+ [9 x CCPR2L=0xB8; //脉宽调制波形的占空比初始值
2 i+ T7 R" {% D1 {3 `}+ N# z# v l- r, E: A
/********键盘扫描函数******* */
+ k+ i% P: r% w3 X! G' _2 evoid keyscan()7 m# [ w: V- O" e& v
{8 I& h8 l0 A, L8 ?, K+ Z4 Y
if(RB1==0) //如果是RB1键按下( r' w6 R+ {' Z* M* ^
{
0 W5 h: ?; B. J0 t0 e5 v0 t delay_ms(5); //延时去抖
. f: z# t+ x! Q. o$ q& @) X( q if(RB1==0) //确认是否有键按下
2 P/ ]7 V- w$ F0 _ {) R2 J% I" }# ?* K1 {
while(!RB1); //等待按键释放
/ \# s- g1 r4 T& k6 s6 d CCP2CON=0x0C;
. C9 N9 u" E0 x o% [$ z CCPR2L=0xB8; //80%占空比7 \7 I) k& H$ p8 r- }
TMR2ON=1;! f- o. D4 u7 H# v# G4 h
}
% \6 I: {5 {4 F, q3 X' y }
! M( {' |6 l7 I" P. u if(RB2==0) //如果是RB2键按下* h+ z# X* E9 L" r4 V3 p# T
{- q8 r2 g+ @9 F5 G
delay_ms(5); //延时去抖 q4 m; Z, z) Y
if(RB2==0) //确认是否有键按下0 [; l# r0 A+ P: l" }/ n; t0 }
{3 W1 \' @: H. ^9 z: G7 h& O6 a
while(!RB2); //等待按键释放% D4 e+ o$ ~. @- r6 Z
CCP2CON=0x0C;
+ K/ y& X3 [+ e7 n& @ CCPR2L=0x96; //60%占空比& X; W" b: k+ i" J/ M
TMR2ON=1;
# f4 U: Y- |* e! h7 I }
' L# p4 T" w! b5 r4 b# ` }9 F0 x) q& r) C- R0 p; d
if(RB0==0) //如果是RB0键按下" O R, t- u7 w
{3 K4 J6 F A6 N% e
delay_ms(5); //延时去抖. \6 q8 ~: v% K2 N& k) X" a, w5 z
if(RB0==0) //确认是否有键按下
) _) m6 R( Y& v( A1 \9 E {
5 P9 _" W, `3 Q while(!RB0); //等待按键释放% r2 |( J2 F0 n
CCP2CON=0x00; //关PWM6 l6 x8 i/ I& k: Y" a0 [4 ?
TMR2ON=0; //禁止TMR2; e/ L3 L2 ~" b0 V$ Z/ I2 A* v, d/ [' b
//delay_ms(5);( o- K: [! ?' b0 R( P0 M7 k" x" N, y
RC1=0;
7 Z2 M) Y1 |. U: D0 y/ ] }9 ]2 }/ k9 i0 v4 l1 E( a2 Z3 b
}4 l' Q+ U% l$ x; d. V
}, t, y6 i5 i; i1 S `2 r
/********主函数********/5 d6 A, q( p( X# D
void main()
/ V3 @7 ?( D7 `; }4 p- E* Y; H5 w{
* E: P' \) _6 d+ D3 N q) Y. F init(); //系统初始化
1 `$ T) Q8 O g1 C PWM_Init(); //脉冲宽度初始化+ t+ t2 Q0 `/ c
while(1)
. C/ y6 `* _5 V$ s& [0 \" H- Y {1 T1 y/ L; s" a+ [ j4 m1 D
keyscan(); //调用按键扫描处理脉宽因数5 t7 ~( C9 j [3 e4 B) ~6 T
}6 P( b' `6 y0 S8 F" U% M
} |