主要的程序我也贴上来各位看一下6 P3 u# a. b, A1 e, j E Q
1 X0 e0 T2 p8 a8 s: H
/********端口初始化函数********/
; `$ p* e% c: g( N" T+ m% Vvoid init()7 }5 D4 g6 J, ^# n
{
, i1 |- e6 `6 V' k8 \3 i2 | ANSELH=0x00; //设置B口为数字I/O口
) L7 I' l& `' O+ ^( f OPTION_REG=0x00;
, ~$ {, h# p4 V+ m WPUB=0xFF; //设置B口弱上拉
- f" E9 V# H) Z, n1 Q. K5 u# P( h INTCON=0x00; //关总中断
0 g0 ]* n4 j5 L3 y$ I3 f( Y. f" S PIE1=0; //PIE1的中断禁止+ R4 X/ X: q" v& t; L+ Q- e
PIE2=0; //PIE2的中断禁止
( |+ r, x. M, {8 O! C( p TRISB0=1;
' p7 q/ f' k9 }- c0 R) ]. A TRISB1=1; //将RB1设置为输入口,按按键4 q7 o: d+ d" `, N# f
TRISB2=1; //将RB2设置为输入口,按按键& s `8 l! D% t; ~' F
TRISB3=1;
/ q0 E- q( q: c3 b D0 c. x TRISB4=1;5 q9 [) e$ p/ u+ N! h
RC1=0;" h$ S( i9 D- i, x
TRISC1=0; //脉宽调制输出引脚,设置为输出
/ n1 m; j5 R( d" z( H: w}
+ ]6 ^" E0 Y3 E3 w9 L# ^" o/ |8 u/********PWM初始化函数********/
& p! g$ B; r: {/ yvoid PWM_Init()
5 e G, p: v$ W2 ?! g% ]" X{, {$ O: |; f" A: w9 i: `7 V7 R1 x
PR2=249; //脉宽调制波形的周期为1000us % F6 g/ b s" I, f
CCP2CON=0x0C; //CCP2模块工作在PWM模式,占空因数的低两位为00! @% _0 i$ T5 g' E; z
T2CON=0x02; //禁止TMR2,且前后分频值为16,同时开始输出PWM8 S. S9 ~& h; v+ F
CCPR2L=0xB8; //脉宽调制波形的占空比初始值8 f! x2 T- ^: E/ h
}0 v4 P* {$ Z+ P6 t8 g9 Z4 h
/********键盘扫描函数******* */
3 L: F6 x& C. q- A0 T9 yvoid keyscan()
5 n' H: D$ A7 O1 b5 r4 q" w{
) E$ r5 \% ~$ Z if(RB1==0) //如果是RB1键按下
! n: R7 z7 d9 E) m) X {' L. i* F4 _& G/ O" k) Y z5 x
delay_ms(5); //延时去抖
7 V* A1 u, C1 {2 O if(RB1==0) //确认是否有键按下; j7 {2 y5 m3 L- d* N4 i' c
{) B) j4 Z. l7 \, _; Y
while(!RB1); //等待按键释放9 \' x8 P% ], O7 _; O. ]/ i
CCP2CON=0x0C;
& T1 ~1 s1 k) P* b0 E( ]! M! Y2 N CCPR2L=0xB8; //80%占空比/ A( B/ _5 W6 d" A2 O- |+ u# M
TMR2ON=1;2 ? X4 S3 E% I+ X; o$ Z
}' V- p3 S; X5 \4 J
}
! Q8 [+ @: e! I2 m8 N3 c if(RB2==0) //如果是RB2键按下: B% O6 F6 L$ Z
{: y' a" L' M% ^1 J
delay_ms(5); //延时去抖
; j$ L; g7 X, Z9 c0 z, s if(RB2==0) //确认是否有键按下
- H+ B* T1 I# o) \: ` {. w b! n" w7 r2 v o
while(!RB2); //等待按键释放
9 t. u$ U0 M5 j* U$ N8 L( D CCP2CON=0x0C;- Z, b3 P& X/ P4 @8 K" ]3 l
CCPR2L=0x96; //60%占空比 u& H7 ^" c6 O8 t* A2 r
TMR2ON=1;
8 `1 S. I$ v) Q* g; [8 i- k }' D& z" _; B! w: k
}
' i9 r$ I+ b. x; Z& ]$ N if(RB0==0) //如果是RB0键按下+ u* @- w9 e b; C0 z$ z7 B: H
{1 c! g/ J) {/ p: P7 t
delay_ms(5); //延时去抖
8 B6 n! \; \; ` if(RB0==0) //确认是否有键按下, \/ X' G1 F- O* j! z3 m! s6 r
{; y' z- `4 s( T" r9 j7 `
while(!RB0); //等待按键释放4 |1 q+ q- t, F" J
CCP2CON=0x00; //关PWM, w$ e, H5 H* |
TMR2ON=0; //禁止TMR2
" X0 X. T2 @8 z* X //delay_ms(5);
H N1 S# g1 F' j: i RC1=0;& w, y, H2 w% j5 |9 m* x) t
}0 y! N: T3 N6 ?. j! W$ B8 |9 V1 l
}: S: \* q6 p: G9 b3 ]# E5 z6 x7 l
} _+ B, ~+ h9 e7 m$ }& z% x
/********主函数********/3 U' l& o/ o! e3 w) C! \' Q' n
void main()% w: q5 Z: P! H& X9 D w
{
$ }* h9 P: f! p# G+ _. ` init(); //系统初始化
% c( n6 w* [5 Q1 ~ PWM_Init(); //脉冲宽度初始化
" J3 U' U r; `. R% e% M8 P5 U while(1)
6 Q; J4 _4 N9 e l {% X' Q; l3 M5 K) g2 v$ i
keyscan(); //调用按键扫描处理脉宽因数# M- h( s. Y9 R5 ^) v4 B+ x" R( |
}
' q' u) U5 V6 D+ J7 ?$ `} |