主要的程序我也贴上来各位看一下
) P5 p2 l9 X- N8 Z# b( x
1 y* V0 I% E. U5 k0 _0 L/********端口初始化函数********/$ v5 y* M2 L2 K. L
void init()
0 }8 B- C5 h6 _# A' k{* A z4 E+ @ j
ANSELH=0x00; //设置B口为数字I/O口
$ }4 m: D5 g# A2 I S) H. [8 a OPTION_REG=0x00;
5 \4 P" e# b. f) r0 l WPUB=0xFF; //设置B口弱上拉
4 Q$ l% |. n/ y INTCON=0x00; //关总中断 s$ {* M, M4 c d2 }2 g
PIE1=0; //PIE1的中断禁止' {8 u6 d9 k4 M0 r' t
PIE2=0; //PIE2的中断禁止
: C, l/ z$ C% J$ r' ]* { TRISB0=1;6 q; a" h" J1 m( M
TRISB1=1; //将RB1设置为输入口,按按键
( `8 y1 z5 G7 z- c7 q, C: I; t TRISB2=1; //将RB2设置为输入口,按按键
/ n7 ^4 j4 V" c8 ?& `$ N6 j, ? TRISB3=1;0 T5 l2 x5 K5 N2 v# d7 g
TRISB4=1;
% \1 q# |3 ]& Q' e; i+ u RC1=0;& }# J* M& q" e+ W1 F
TRISC1=0; //脉宽调制输出引脚,设置为输出+ }1 W% E, N7 X
}, z% c+ O: e/ s, {& d- t& H/ O
/********PWM初始化函数********/! p O T" d* h3 \; v* h2 \- z8 V
void PWM_Init()3 i' l5 p0 Y; Z. b+ ]
{
/ F) f: J5 y' ^. w PR2=249; //脉宽调制波形的周期为1000us
5 w5 A, I! ]2 j A3 W0 f: L: J CCP2CON=0x0C; //CCP2模块工作在PWM模式,占空因数的低两位为00
/ w" e: T, E% o% q V# y3 K: H T2CON=0x02; //禁止TMR2,且前后分频值为16,同时开始输出PWM
& R8 G- V1 Y/ d' x, |! }: b: @ e CCPR2L=0xB8; //脉宽调制波形的占空比初始值
/ \( y% t) |, n}
0 m* M8 o$ H1 F5 ^( m$ X/********键盘扫描函数******* */
0 [8 P1 q W- r* c; r' i- xvoid keyscan()
/ O, Z1 T% y# P1 w$ W3 F{! {5 w1 g. E0 m4 Q C/ s
if(RB1==0) //如果是RB1键按下 D3 j8 E0 O: u
{
- Q O1 e5 g6 w delay_ms(5); //延时去抖
0 Y* i8 x' V7 L: e( Z if(RB1==0) //确认是否有键按下# `9 I+ P9 { k4 Q U0 q9 Y! j
{
7 n; A7 j- ]0 j) ] while(!RB1); //等待按键释放
5 H) f6 ~) S {& q, w( o1 [$ M CCP2CON=0x0C;
1 A1 o3 a0 v' ~2 z+ S y4 p2 n. q% w8 T CCPR2L=0xB8; //80%占空比
" N f: X+ \/ e( Y) \# i5 Y6 B) W2 { TMR2ON=1;
) i% J/ R1 ^7 s: C: s }
/ F2 ~* L" ^0 k% q }
% l& x" g- A& K7 h6 A; q if(RB2==0) //如果是RB2键按下 T. m7 B6 S7 D' W1 m
{+ r+ M4 x: F, w
delay_ms(5); //延时去抖
3 V( N# @1 Y7 q0 m if(RB2==0) //确认是否有键按下
! C& p/ [4 n( M+ h; u0 k+ \+ c {
- _6 m1 w8 t7 Q- ~0 U+ ]" q& p1 y while(!RB2); //等待按键释放+ [' n4 r8 p/ ~$ ^# O% h9 c
CCP2CON=0x0C;
9 A! ^* y A. @* Z/ y7 W$ {9 {5 _ CCPR2L=0x96; //60%占空比 e! |. ?8 X* {
TMR2ON=1;
' G* C7 @2 s8 i/ {, U }
: w. L2 K2 q' A; T }# g; @8 h. o0 P* P
if(RB0==0) //如果是RB0键按下
6 o o8 S' c5 z% v- ~7 S+ o7 x A {
4 `9 ]* Y+ C, B/ _# L7 }# E delay_ms(5); //延时去抖+ Y- g7 q" X. k' J# B, [7 N3 Y( r
if(RB0==0) //确认是否有键按下- n! {8 L6 L4 p( f( I+ _
{! w) E. B' J5 \
while(!RB0); //等待按键释放0 Y1 E% o( l x6 N
CCP2CON=0x00; //关PWM8 e( N$ u( G$ m9 V9 `
TMR2ON=0; //禁止TMR2
2 p( k% I1 R( `" K1 Z6 F //delay_ms(5);
|# F+ \$ Y/ R, U/ D S& Y/ A. F7 p RC1=0;
2 L) I, F7 R! @! S) Z$ |3 |" B. k }1 c2 h. r0 V* j
}
2 u' R4 b6 S: W( b}
/ U/ @0 u/ y5 [* t/********主函数********/
- g1 u1 _5 D& |0 b3 Ovoid main()
`& U r; d9 A1 T: i{
' `5 K- W- p/ Q5 m8 [ init(); //系统初始化
: G# N0 \: Q8 V( E O PWM_Init(); //脉冲宽度初始化+ c4 H& ~, g, b+ F
while(1)
1 v) G/ B, Q, ^" D% i3 A2 `1 r {
o! B! |2 q" k+ e( b keyscan(); //调用按键扫描处理脉宽因数5 ~, _, n8 b6 q) ?9 |
}
9 m5 N9 W4 `7 b, w. O" T/ C} |