主要的程序我也贴上来各位看一下: L6 x: ]4 n1 V
$ a6 v7 Y8 ~4 T3 d9 @2 c9 W
/********端口初始化函数********/
2 h( a8 v$ a7 _& {void init()' W: s" a' u& b; c
{' a$ r0 l5 O' g$ r9 Z
ANSELH=0x00; //设置B口为数字I/O口4 @, \7 ~/ [ w/ ^2 U
OPTION_REG=0x00;
3 y' O7 r8 Y: p2 W6 L% m WPUB=0xFF; //设置B口弱上拉+ a- O. w3 s: D: S0 S5 A
INTCON=0x00; //关总中断: g% Y+ K- N& `( `: m' K9 z) u
PIE1=0; //PIE1的中断禁止* c2 E. X# Z( w2 \8 T0 ?1 a
PIE2=0; //PIE2的中断禁止% s2 n3 `. M5 X7 N; a4 I5 n- Q
TRISB0=1;' Z- J: L& ?$ R! G* g4 d
TRISB1=1; //将RB1设置为输入口,按按键
. f2 Z1 x9 U0 n n$ j& E* S. V TRISB2=1; //将RB2设置为输入口,按按键
! w* v2 U! }! ]% @! V TRISB3=1;2 X. g$ N3 e O! x
TRISB4=1;1 I7 g) g- G" `; o7 g6 B9 m9 b
RC1=0;) F/ W7 r5 l- N, r) @+ Z2 n% B
TRISC1=0; //脉宽调制输出引脚,设置为输出
9 U8 A' Y! H) v" O$ V}8 S) [) `- M% P# }5 D4 C3 T
/********PWM初始化函数********/5 C5 C) c4 s5 G% E& F* ~! ~
void PWM_Init()
7 L1 w, G! v2 [& O0 Y# t" B{6 ?4 B( s5 d. p5 i9 `
PR2=249; //脉宽调制波形的周期为1000us
! p3 H" L7 \; Y; l! T- r) N CCP2CON=0x0C; //CCP2模块工作在PWM模式,占空因数的低两位为00
" A3 i; [, v0 o/ i" `& _ s( Q T2CON=0x02; //禁止TMR2,且前后分频值为16,同时开始输出PWM+ s3 C3 z6 g$ B- s& }' v( z
CCPR2L=0xB8; //脉宽调制波形的占空比初始值+ `' i, m8 \/ q2 N
}' i& O7 i$ n5 u6 N
/********键盘扫描函数******* */
: G7 a" K. x5 {! k8 m) F6 |* O1 kvoid keyscan()
. n* A8 B8 g4 p{3 r% O' [- ^' w- Y5 P) v+ D
if(RB1==0) //如果是RB1键按下3 a7 _# v, P: Q! Y
{
, R6 T& B# X# E3 G, z( a- J delay_ms(5); //延时去抖
6 P1 F& j9 t2 Z9 J if(RB1==0) //确认是否有键按下& i, @* x+ U' L, T
{
6 g# S; O1 J0 K6 b5 x+ d9 S) O4 F% c while(!RB1); //等待按键释放
/ T$ v( ~# `: d" v- u CCP2CON=0x0C;
+ w" n& X8 ~# a0 @- `: `" c/ I: v9 ^$ } CCPR2L=0xB8; //80%占空比- W- p+ {: e0 |8 S4 ?$ Z
TMR2ON=1;" R, O8 _" V3 B6 Z/ c! ^
}+ N9 o5 j. n$ {: U- x
}: F2 j' d3 H Y4 O0 b8 b0 f
if(RB2==0) //如果是RB2键按下
+ y) v. B4 r7 ` {) W7 e7 z, c3 Q8 w9 X
delay_ms(5); //延时去抖/ n! t. V( ~* u7 T
if(RB2==0) //确认是否有键按下1 _/ M- D" v( v8 e" g% Q
{: q4 ~! |/ s1 x2 A }, r
while(!RB2); //等待按键释放" C" j A Z0 S, i. S
CCP2CON=0x0C;
4 M( f c) s0 D" z+ O$ o* Q! _ o( f; }7 l CCPR2L=0x96; //60%占空比
) |4 j: M9 R% L: l% T TMR2ON=1;* H$ z& r6 S9 E( C" ?+ a: t9 u8 w
}
. [4 M# m( r+ `( G y }* T) e; T7 w6 V5 j7 X4 q" A
if(RB0==0) //如果是RB0键按下! Y7 F. G" X% n+ s6 |
{
, D h6 e' ]( ]2 L8 I* R( n0 t delay_ms(5); //延时去抖# o: d5 N) i# Y* a" _
if(RB0==0) //确认是否有键按下
4 T1 f6 w/ d: Z2 s {% a* E, `; r: ?, a+ C. W
while(!RB0); //等待按键释放
) V9 r5 k/ I; d' g7 x: A CCP2CON=0x00; //关PWM" x7 C) W8 X( i" t
TMR2ON=0; //禁止TMR2
; n4 c9 a/ B) ^( f: M //delay_ms(5);5 O p' y1 B! p. C: p/ s4 l
RC1=0;. c0 V- X( S$ B- l. V8 ?
}7 C3 d' P; |9 i5 _
}( H! B/ ^# D6 {# c& R7 Y! @
}. z8 N6 X1 B5 C4 Z( u
/********主函数********/
* B& ?- M! R( {2 | p- svoid main()( L: U8 j5 p! T5 L6 `' s
{, b6 Z# J: g( s0 O% { K6 P9 X3 _$ K
init(); //系统初始化
7 u% m( K+ Y. [6 y1 |! W PWM_Init(); //脉冲宽度初始化8 m0 G# d8 |% a; ?3 X5 l) I
while(1)( }! l$ ~" V' O0 D
{. Q! o3 Z( E6 X2 a: X8 Z% f7 C
keyscan(); //调用按键扫描处理脉宽因数0 y% g7 j( r4 u' c6 j7 i& g7 u! d. A1 U
}
$ T" X& _( w7 V% u" ` _: R# M9 L9 N} |