主要的程序我也贴上来各位看一下
, t/ z- ~, G1 c z# R6 L9 Z4 _" i$ J$ p# ` x* S
/********端口初始化函数********/+ e j/ {' d6 u" W7 I& ^7 r
void init()
9 {% w9 d1 }3 | c! p! h7 \{5 u( b- {; } I
ANSELH=0x00; //设置B口为数字I/O口
: D+ n1 R" `& b, |9 U OPTION_REG=0x00;
9 E$ o5 m. t# C+ U6 f WPUB=0xFF; //设置B口弱上拉
$ d/ `0 B8 u2 b. ` INTCON=0x00; //关总中断: M+ k6 F! X/ y# d, c6 \
PIE1=0; //PIE1的中断禁止
+ b0 h" P" N( j; E) A PIE2=0; //PIE2的中断禁止1 W; E/ k4 ]+ ~% x
TRISB0=1;* y( ]' F9 h$ Q! n
TRISB1=1; //将RB1设置为输入口,按按键
0 U. f' @ o8 C$ Z TRISB2=1; //将RB2设置为输入口,按按键1 H2 c2 L4 K: I7 B. p
TRISB3=1;
- r. h/ ?$ S" _, _& r4 w2 S TRISB4=1;
5 }; j& r/ t( {3 b" i( b! ~( f RC1=0;
6 i6 ^6 i0 ?+ S9 v. `, h TRISC1=0; //脉宽调制输出引脚,设置为输出# g" Y% F8 D' E& a% `
} a' P* Z" i5 g$ a1 a
/********PWM初始化函数********/; R) E3 c& w4 t% Q2 z! I
void PWM_Init()
: O0 g5 c! m3 x0 J: n8 s{0 F3 s' I. r/ a3 a f
PR2=249; //脉宽调制波形的周期为1000us . j/ V' L" z' O: Z% U
CCP2CON=0x0C; //CCP2模块工作在PWM模式,占空因数的低两位为00& b6 L, l( f# X; m) M. }; K
T2CON=0x02; //禁止TMR2,且前后分频值为16,同时开始输出PWM B) I6 v$ \# j+ h/ G
CCPR2L=0xB8; //脉宽调制波形的占空比初始值
9 Q* Q- J! w# @1 G}! u* h: Q" D: K# M
/********键盘扫描函数******* */
0 q. m3 n% \% e6 B: H" {5 \9 R/ k2 xvoid keyscan()6 l0 z$ t* |, T3 f n8 v, [
{
* O4 V. o c1 n1 x+ J0 X* k5 | if(RB1==0) //如果是RB1键按下+ H3 ~* `1 e5 z$ q8 }: K2 d
{. W+ O j9 u: V4 D9 ^
delay_ms(5); //延时去抖
/ z2 a# z1 q& H& k4 { if(RB1==0) //确认是否有键按下+ @( N3 s, i Y* j. c
{
/ f V# j2 o) N& S3 w! B n" Z, a while(!RB1); //等待按键释放: O. F8 e9 g1 M+ ]0 j
CCP2CON=0x0C;
/ d1 x+ a) q) t6 S1 ~1 ] CCPR2L=0xB8; //80%占空比8 m8 v) v# X8 j- b% \+ T2 Z
TMR2ON=1;: S' L8 q) K4 U2 e: u
}
% r* @* r1 R/ m4 _: s9 r$ W; I/ G }) c3 S* N( E J
if(RB2==0) //如果是RB2键按下
7 ~% ~) j2 _7 F {
- o ?1 \1 Z2 H8 { delay_ms(5); //延时去抖
+ s( ?3 o1 t# B, D# F1 G if(RB2==0) //确认是否有键按下4 x( v* d& q+ H! D5 l9 l
{, W( Q) w1 w O( f8 J1 W
while(!RB2); //等待按键释放0 b5 R" }$ l" Z- s
CCP2CON=0x0C;
; ^& _ i. n; d8 r7 j2 Q- g9 N0 N CCPR2L=0x96; //60%占空比( K/ Y) {7 m+ N7 f! n' ?
TMR2ON=1;! j2 i: K: M' x; Y, T+ Y
}3 D% p( K9 {% K" b0 [$ b( s. _7 j
}
# x5 i8 e) f( C _* p' l) Z+ ], a if(RB0==0) //如果是RB0键按下
8 _) q; r) X* ?, R1 T4 r! s {
% [! Z. |$ O- q0 C/ j0 N: g delay_ms(5); //延时去抖6 N7 [ L8 a' X, ~7 [6 l
if(RB0==0) //确认是否有键按下& d s0 x- p. w/ L6 K) E% n% J9 {! x1 h
{, N# h# B5 T3 o
while(!RB0); //等待按键释放* a/ G; [2 W' t& J
CCP2CON=0x00; //关PWM- W0 x# g/ c' h
TMR2ON=0; //禁止TMR2
: F+ }( W' A5 { //delay_ms(5);* W) C/ [' y/ ^/ e" X( C
RC1=0;, ]' o3 v# T9 k3 Y3 X: [: {0 K- K
}
! V% A# E" j1 @2 a }
5 I) q: Y: ~+ u' G; s+ b6 N}6 G4 n; i+ m9 C% l- B/ u7 i
/********主函数********/
N$ @/ k4 z, `% x. ~0 M3 }void main()3 C' W1 k* o, A. \* {
{
0 h! \' H2 t9 \# a, h: @ init(); //系统初始化- K. L* O7 ]9 S5 [# \$ P8 H
PWM_Init(); //脉冲宽度初始化6 S; d, X, o8 U2 N
while(1)! [; f' l( W. v+ u- q5 v
{; v: N) F# \( x2 |# e' g/ Y' j
keyscan(); //调用按键扫描处理脉宽因数: ^& Z. T' g ]0 r# b$ y; C
}/ z3 R+ `, Y$ ? e# H! J7 `
} |