主要的程序我也贴上来各位看一下
& `3 T3 S0 @) t) l
* \+ F1 I- ^! c3 k# ~+ p/********端口初始化函数********/2 _& f% I: }1 Y/ A1 s
void init()
7 {* {: n& s. P9 i7 W' s{$ I `8 A1 F; H" X! n
ANSELH=0x00; //设置B口为数字I/O口 u# I* ^# _& ~% ?5 J
OPTION_REG=0x00;
% _5 ~- b1 a- v2 k' ]' h WPUB=0xFF; //设置B口弱上拉
: y: v1 N; d; e+ p. ]% ] INTCON=0x00; //关总中断
5 w2 W4 {) a6 ^4 Z' m, m( N PIE1=0; //PIE1的中断禁止
7 W: n/ F; P- ?$ h8 }- L8 x PIE2=0; //PIE2的中断禁止7 I0 x' k- v& ]" @* h/ k9 e
TRISB0=1;% L( m: P% T7 E) M
TRISB1=1; //将RB1设置为输入口,按按键
K) f @( c. T7 m TRISB2=1; //将RB2设置为输入口,按按键8 a6 `: E- d% d1 r# p# [
TRISB3=1;
' x7 C) U1 J! N6 z" d1 V TRISB4=1;9 x; s) z5 J) K5 }
RC1=0;( O; X3 \$ t; K# ?; \& Q
TRISC1=0; //脉宽调制输出引脚,设置为输出
/ f: |5 M6 g5 r* Z+ ]. ?$ h}; j) P2 S- d% ^; f7 b+ X
/********PWM初始化函数********/* T5 d. P8 A8 W" P8 E4 E
void PWM_Init()
# b# ?3 B2 o# }{8 S* S/ u* `& j. k# {
PR2=249; //脉宽调制波形的周期为1000us - \& j9 d2 i8 U2 e6 f" u1 x
CCP2CON=0x0C; //CCP2模块工作在PWM模式,占空因数的低两位为00" r9 t- f3 _6 ], ]- C# L- `
T2CON=0x02; //禁止TMR2,且前后分频值为16,同时开始输出PWM
7 m9 D" Z# C4 z9 k# |" m CCPR2L=0xB8; //脉宽调制波形的占空比初始值3 z7 E3 J" Z- y$ y2 J$ I& Z2 Z- o
}
5 e9 A; t6 D; q( i- Y( ]" x/ _/********键盘扫描函数******* */" P J$ Z+ m, E
void keyscan()+ {! D* T4 }0 t& i. V3 x; K8 R
{
% e& B& O* n: o1 C0 J4 G3 N if(RB1==0) //如果是RB1键按下; }# n0 {" u2 p
{. o3 o7 V/ M3 U' F# {% v' p8 Z" k8 q0 k. I
delay_ms(5); //延时去抖
$ @+ _& i! h# o if(RB1==0) //确认是否有键按下
' h8 l3 w( c1 L# S: s4 ] {' p1 O1 e& H+ G [# W
while(!RB1); //等待按键释放
2 Q0 R3 i5 N6 { A4 z CCP2CON=0x0C;
- {* W9 l7 T9 y# R# F8 C6 p7 Q2 A; F CCPR2L=0xB8; //80%占空比( G- G$ |. V' K% m9 q$ R
TMR2ON=1;
( K% o* U4 M9 r }
- d( ^+ I7 y1 ?4 y }. y" H3 M- B6 R/ ~6 K* ~4 u
if(RB2==0) //如果是RB2键按下
1 k, W2 J* X. b: J# q) U- l {
/ l. x0 [1 c& V3 n" E0 e) g delay_ms(5); //延时去抖3 w2 ?6 R7 M! n8 ?( ]
if(RB2==0) //确认是否有键按下
0 f7 i5 s% ^2 W4 `" g/ s {
$ z8 f6 c" e3 C: U while(!RB2); //等待按键释放8 Y( I. |0 H: s# _/ k0 Q
CCP2CON=0x0C;7 v8 N q- Q! R+ [2 s9 h" [
CCPR2L=0x96; //60%占空比- _. f, I9 ^- A+ |/ h
TMR2ON=1;
4 t9 p$ E/ Z, `) f1 L } i. ]3 _) _4 S, W7 K/ e5 t
}) U& X5 ~! G1 b* E5 l
if(RB0==0) //如果是RB0键按下5 D. b7 T2 o: u: s/ T: \6 v
{
: e2 q7 u4 A+ R% j4 [+ ] u delay_ms(5); //延时去抖3 r" V! r2 B" j8 `9 @" O! Y1 l3 O
if(RB0==0) //确认是否有键按下4 n# u- u+ p6 b' O6 A2 t
{7 i9 U# ?2 k$ c0 b3 t
while(!RB0); //等待按键释放, p6 _1 x, t* [& J8 Y& p
CCP2CON=0x00; //关PWM) w: E: t/ k+ J. f8 }( |
TMR2ON=0; //禁止TMR2
- K8 L$ S) z6 |; p* Q6 f //delay_ms(5);; |! O& z9 D F; u2 n& ~
RC1=0;3 Z8 D+ w/ \* t8 h& S
}
& c% x2 k. t8 @2 M7 t9 r- f2 x }& u# ?& z9 L) h
}
5 M" e; R- t X+ |3 e" k! [/********主函数********/
( s. z+ S) k: u* x( `$ Cvoid main()
j: L) Y) R! `3 p! v{, o% \: y- V5 Y2 l8 ^
init(); //系统初始化
1 x: h/ J+ k& t" R1 C7 q& g2 z; v PWM_Init(); //脉冲宽度初始化* z( ^: t. {& q% T# ]7 P" a
while(1)- Z* P2 r! ^6 s" m% d
{
$ m: g" h! S* ~/ @* a$ s! m0 |, k keyscan(); //调用按键扫描处理脉宽因数
8 g4 `+ J t& ]6 x" M; e }
5 d- Q" A* L0 C* E r* f* P} |