主要的程序我也贴上来各位看一下3 R K) U- `5 X
, M) j6 f8 _- @; }
/********端口初始化函数********/
1 w1 K- Y. ~1 |/ B4 P$ k. V# O( d- Q1 Nvoid init()% C2 y3 J$ ?4 l' m) M/ E* X# F1 g
{
; ^* x! R# u' h$ ?& k ANSELH=0x00; //设置B口为数字I/O口
, f7 l+ j/ q) d- V9 w OPTION_REG=0x00;! P+ Z5 R0 I' ?4 C
WPUB=0xFF; //设置B口弱上拉
' Y/ G5 @4 P5 s: H6 A' B6 H INTCON=0x00; //关总中断
1 i4 w- y6 O( R. N X& C PIE1=0; //PIE1的中断禁止
3 A& r3 R' ]; j* y$ v+ ?9 R6 J PIE2=0; //PIE2的中断禁止2 r/ L ^, O( p
TRISB0=1;
4 D* z% J H" M% b Y) _7 {1 G TRISB1=1; //将RB1设置为输入口,按按键) P1 L/ }. N" q3 ` D. Y2 ^
TRISB2=1; //将RB2设置为输入口,按按键
7 R B5 V2 Q" {6 i8 P' o6 H1 O TRISB3=1;
[9 S0 b( O' `5 Q TRISB4=1;: N2 o0 ?; Y, U- T: M: c
RC1=0;, T! I6 w; c/ j8 K; L0 c
TRISC1=0; //脉宽调制输出引脚,设置为输出5 M& y: _% Q' X( a" c, i- \
}* h) _, d+ P8 P8 ~
/********PWM初始化函数********/
0 r3 b3 s( \# @' W* Evoid PWM_Init()9 F9 c( C5 ]8 o9 O0 s
{& D" A9 ~( L, k2 ?
PR2=249; //脉宽调制波形的周期为1000us
9 L: p- L) Z, f4 F8 g$ a* R X CCP2CON=0x0C; //CCP2模块工作在PWM模式,占空因数的低两位为00- _2 \" i n- d" A
T2CON=0x02; //禁止TMR2,且前后分频值为16,同时开始输出PWM$ ]2 x* U/ q7 y/ C2 i& T3 [
CCPR2L=0xB8; //脉宽调制波形的占空比初始值% D3 {4 G- ^, r
}
5 L$ T, U ]0 i; ~( R8 w" ~/********键盘扫描函数******* */
0 \7 T% y3 |/ ~void keyscan()
- N6 Q( |0 O0 W+ [{# o: N8 S5 d! d0 Y( N! g
if(RB1==0) //如果是RB1键按下
# C; X+ b0 d5 c9 J/ A8 h* V {0 E+ |5 d- I6 D6 b5 b
delay_ms(5); //延时去抖- R8 x( s0 H a9 r
if(RB1==0) //确认是否有键按下% {* [/ r7 d9 H
{
+ |( S7 B! Y* |" n/ o! f. x) t. [- w while(!RB1); //等待按键释放+ i9 M0 }7 i1 k, _' y9 C
CCP2CON=0x0C;8 M" J; s; `! Q; O
CCPR2L=0xB8; //80%占空比
5 i: @2 H, f& a( M6 Y w TMR2ON=1;
" L# \0 [$ G7 E2 _6 E }
9 P4 w2 S N( [5 C/ y( \: ]0 | }8 `; m* Z( Q: ~0 `9 m P0 v
if(RB2==0) //如果是RB2键按下
1 P$ U$ W7 g" u% z( y M3 b {
6 i! J; q- h# b delay_ms(5); //延时去抖
4 M9 j: ?& H. k- n if(RB2==0) //确认是否有键按下
# G; r7 p, E5 T1 Q7 s) y. m {7 O6 P, {) i7 F8 V9 m
while(!RB2); //等待按键释放/ N9 o" s P7 u+ Z+ |- E
CCP2CON=0x0C;0 W: T U7 r: v' |7 I. m
CCPR2L=0x96; //60%占空比
' {. I; z- d- I, s TMR2ON=1;, d. J; |+ l" D! i6 H
}: m8 d) K7 C( O: @$ a2 @
}2 o/ `' H4 ?0 j; q
if(RB0==0) //如果是RB0键按下5 D" [/ h' f) w2 G/ b8 D
{1 |0 Z2 x c1 J: V: R& S
delay_ms(5); //延时去抖/ i1 t; l* `: Z
if(RB0==0) //确认是否有键按下$ L' |1 @8 p# i! u: d
{
$ a e2 g3 h* b% Z9 ` while(!RB0); //等待按键释放; F. i- Z& \/ K3 V: k
CCP2CON=0x00; //关PWM& [7 [: v5 D$ a. U: C9 v, L# ^
TMR2ON=0; //禁止TMR2( ?4 j1 Z& J/ \; e6 `
//delay_ms(5);* a' X9 ^/ v- S, F' `. ^ C% \
RC1=0;
* v, I0 W) ?) k* o& c/ w }2 y- ^* |! l7 B3 v# l9 I6 c; |
}- w R! J" s4 L) d- b# W& ^
}
7 @4 X% J& j/ B, L: V% k/********主函数********/. o3 o7 }! g7 H: v2 v
void main()
) s% _0 c8 L2 f6 v; I8 Z3 c+ B{
6 j3 K" ?. U1 T" ^! A init(); //系统初始化1 z0 c( c8 B6 V( L& H
PWM_Init(); //脉冲宽度初始化
7 p, D/ |& F$ B3 c+ P while(1)' E; S: I6 i& \: d2 U5 j6 l5 v# e
{
! J/ L# P7 g- j0 o keyscan(); //调用按键扫描处理脉宽因数
) Q8 d' C2 w; m4 N- } }/ |8 d7 B G ^$ ]7 U2 z
} |