主要的程序我也贴上来各位看一下
( ]4 H6 K0 s- h4 ]& V% ]4 d8 i u3 p: B; R# U
/********端口初始化函数********/
: y) s- S# t( T+ evoid init()
& S2 d: e) Y' K) w A1 z' T* W{8 w- v- J( P' i
ANSELH=0x00; //设置B口为数字I/O口5 \! f3 b3 t; j) _& }8 Z
OPTION_REG=0x00;
$ ^# p# ] C# z5 L! s; I WPUB=0xFF; //设置B口弱上拉" x5 z' V/ F9 o4 e: }, ?9 _2 N! J
INTCON=0x00; //关总中断4 Q' \3 y& u5 f* b9 j/ g% k' K
PIE1=0; //PIE1的中断禁止
' ?( u* d! h W9 j PIE2=0; //PIE2的中断禁止
8 ^& \$ [4 p3 K2 a* | TRISB0=1;
( M- y! F# n6 D% q TRISB1=1; //将RB1设置为输入口,按按键
* y% T7 H9 W; l3 i) \6 S' s TRISB2=1; //将RB2设置为输入口,按按键& k! B- r2 H& w2 P
TRISB3=1;
( g- \" {* k1 }% E TRISB4=1;4 ^& P4 L/ G) I( X3 b9 Z( D5 a) m
RC1=0;
1 b* T0 m: @; \- z2 |# m* I TRISC1=0; //脉宽调制输出引脚,设置为输出0 F' {' J0 }$ ^ S, U$ t- v! ~
}
2 C$ J3 k8 i* E0 F" D/********PWM初始化函数********/# U- \1 G9 a- \3 S! J3 _
void PWM_Init(), }+ u4 I/ t9 s: k
{
7 y( O: Z: E8 d, \ PR2=249; //脉宽调制波形的周期为1000us
* W& S5 J4 D/ \. l CCP2CON=0x0C; //CCP2模块工作在PWM模式,占空因数的低两位为00/ q! @* l. ]. d8 w7 M
T2CON=0x02; //禁止TMR2,且前后分频值为16,同时开始输出PWM- \! w6 M3 P0 l! f
CCPR2L=0xB8; //脉宽调制波形的占空比初始值% ~9 d5 h2 A/ l. O; X5 U3 h2 f7 _
}) t; M, U2 G' J5 `
/********键盘扫描函数******* */9 }8 g3 h* L' d$ h
void keyscan()3 S4 \* J1 v# G8 X& v
{
# _7 r+ _; X( V3 }) h8 w if(RB1==0) //如果是RB1键按下
2 h6 M; I+ |* `( ~7 a' Y' d {# \. D% R9 U8 r4 X& ^
delay_ms(5); //延时去抖
+ ~: Y0 q. H7 R$ [ K if(RB1==0) //确认是否有键按下
, p- y, e3 l0 V+ ]+ F7 e' t& r {3 F \2 w4 M& H# z8 R' Y
while(!RB1); //等待按键释放
+ o6 v; m) W8 N. @3 Q CCP2CON=0x0C;
; g- q7 ^" B3 }( q CCPR2L=0xB8; //80%占空比- j+ `0 x2 N% ]- m8 ]7 ?0 h7 C$ @
TMR2ON=1;* e( r& \$ O5 J. O% x
}
: {/ Z! `- I7 a5 A2 A }7 O! z7 G8 Z/ h, A7 q* o* v0 T) m
if(RB2==0) //如果是RB2键按下
% e- X- q* H% ^8 c {2 J0 @& q' l' O4 e$ S
delay_ms(5); //延时去抖6 c% V, e1 C( g$ O/ I* H7 w
if(RB2==0) //确认是否有键按下
% y1 p% Y/ J) C" w {
; T" ]. k/ w) C# O1 Q3 E while(!RB2); //等待按键释放
/ P. J& b1 E' D; Z" y CCP2CON=0x0C;
" `# H7 L6 r1 \2 m; } CCPR2L=0x96; //60%占空比
, M* m9 c3 F. m e TMR2ON=1;; ]1 S# f9 _4 _8 E# k1 o& E
}: z* z# \$ x9 Z. O; j8 \. e
}
3 Y5 i/ M* _( A# n" r0 m8 k, ~) L if(RB0==0) //如果是RB0键按下
+ t* T' F2 P# \+ m, H { G |6 u0 G& q9 I# C$ Z+ o
delay_ms(5); //延时去抖0 a% ^7 s2 x; i7 o D/ [+ Q- ?' a
if(RB0==0) //确认是否有键按下! v& l4 t/ _& Y0 o/ \
{
6 o4 s' }' r4 R6 k i while(!RB0); //等待按键释放
$ c" I" c' ]8 @: G. L$ J( l4 A CCP2CON=0x00; //关PWM
& p/ Z" Z! q, ?0 L& J TMR2ON=0; //禁止TMR2
; s. i: [; K0 X& N/ U1 u3 z* d+ P, l //delay_ms(5);5 v6 y& J* ]% M* X) _
RC1=0;& g) z) d. X! P* N$ Z R) O
}1 F- h; u' Q. A! T* t
}
2 V' D5 Y- E/ R* u1 \! a}
+ Q2 K0 t! X" r8 }/********主函数********/* z% u' W9 k# m- w2 K- j+ E
void main()
2 f3 f) o+ x' N! j6 Q{
( F( q" l) { M" N5 G3 f init(); //系统初始化 j# C( O4 n+ _% [' c
PWM_Init(); //脉冲宽度初始化
/ e2 a& e* K4 f3 w while(1); ^1 I( B) K" \1 L' L4 b( Z1 ~
{+ [: O' Y# E5 y7 C4 \1 L4 ]
keyscan(); //调用按键扫描处理脉宽因数8 S! r+ y( J( E7 @: l* D
}
+ J. u0 V' u2 i} |