主要的程序我也贴上来各位看一下. f3 n. i7 Z' K% G, ]+ b( q
6 _* e0 V z+ o
/********端口初始化函数********/' m! X! F* ~2 e9 e$ W
void init()
7 i% o" r' K+ D' F{
9 f- i" S2 k E) G9 p' z ANSELH=0x00; //设置B口为数字I/O口% p" Z) K$ ?% C, P1 [. z9 P
OPTION_REG=0x00;9 Q0 D' y. T s$ c1 E( |/ J
WPUB=0xFF; //设置B口弱上拉
2 _# k( a+ ]( W+ `0 ~6 p9 @9 J INTCON=0x00; //关总中断
% P9 k0 {: P' Z3 [7 a PIE1=0; //PIE1的中断禁止) j; f, m; Y# ^1 v9 i
PIE2=0; //PIE2的中断禁止
' [% a9 ^/ c( M1 i" w; k; R TRISB0=1;
4 U. B* G# I7 g# v. t" K4 X TRISB1=1; //将RB1设置为输入口,按按键
% o4 V& y: d1 \) g. k( z( s+ O TRISB2=1; //将RB2设置为输入口,按按键
, V% a: K" ~2 ]/ H7 }' G7 y- W3 | d TRISB3=1; S' h' `: @3 n: P! q( e
TRISB4=1;$ z* H' a0 I- D7 b, b6 V/ i
RC1=0;' M/ A! ]% f+ H% v: ?9 {
TRISC1=0; //脉宽调制输出引脚,设置为输出
# c5 |5 c7 [) m0 I/ ~* Z$ T' B}
! W4 A) t- U1 q4 {1 I/********PWM初始化函数********/
H3 a$ K+ ~3 ?: c5 Fvoid PWM_Init()
/ E/ p* p; x0 ]{
! Z! \& Y. ?$ S PR2=249; //脉宽调制波形的周期为1000us
( _6 B9 P( i$ j# c, \ CCP2CON=0x0C; //CCP2模块工作在PWM模式,占空因数的低两位为00
; E4 T& W- F+ q8 [! J4 V: X. P/ W T2CON=0x02; //禁止TMR2,且前后分频值为16,同时开始输出PWM
; Y7 J/ I7 q4 \5 U$ h+ \8 S E CCPR2L=0xB8; //脉宽调制波形的占空比初始值2 \7 n7 D& K% l v
}
. Y& h7 o$ i3 ]. \" p. j8 g0 n9 ^/********键盘扫描函数******* */- h6 k1 l% r9 j+ F o1 ?2 |
void keyscan()5 y. A2 E- v) |' y# i% Y2 j
{2 o! u5 e! N& c6 g& z3 M+ W$ W
if(RB1==0) //如果是RB1键按下. C- c% j( P& q) _! C* S9 S7 G
{1 [& h( a) L& U. o8 Q5 a: [2 Y
delay_ms(5); //延时去抖
2 A/ V, g$ o8 H/ m if(RB1==0) //确认是否有键按下0 I: ?& T0 o0 K3 S3 o
{
! f) K- U4 Q5 b& A while(!RB1); //等待按键释放
6 q$ e- g2 a/ _+ K9 z CCP2CON=0x0C;
( z- ^# { h6 ]8 E, U CCPR2L=0xB8; //80%占空比
; o& `0 s9 `! r K4 R; m TMR2ON=1;, F& A( H$ W- N
}0 t- ?: X9 k3 Y- Y
}
% l. H4 ]" Q3 \& H5 H/ H1 l( d if(RB2==0) //如果是RB2键按下( O% ~$ B$ w5 D
{
- H v8 E V7 ?' t delay_ms(5); //延时去抖
# `* g! K) f. T+ d) A if(RB2==0) //确认是否有键按下8 ?3 e$ Q; N# o/ M2 f
{
- P! \. q% K4 l, c- S# a while(!RB2); //等待按键释放0 p/ W+ Y3 `9 C( V
CCP2CON=0x0C; _5 w% p7 `3 g) n0 c: e
CCPR2L=0x96; //60%占空比
6 i) b R% \( Y TMR2ON=1;. X' `5 R+ u! ^" g( f. S
}: ?% c& m' N+ y+ m, s
}
2 I! m$ q, z& c: k( b if(RB0==0) //如果是RB0键按下' S9 w- S6 s3 L
{* `; R: _6 q" c! T9 f
delay_ms(5); //延时去抖9 c3 _% c% y1 i3 R3 h( ^' O
if(RB0==0) //确认是否有键按下" L5 b3 `2 P( I, w! n
{8 u) B* J/ d) @: x
while(!RB0); //等待按键释放
E/ B, K2 E }2 b, k, s- Y CCP2CON=0x00; //关PWM1 K0 ?0 t6 q( I8 f& m6 u4 q) N% I/ ~
TMR2ON=0; //禁止TMR2
- }7 x$ E! K. J# r6 Z9 e# W, l- y //delay_ms(5);
' W2 W3 O! V; n1 o- _9 R RC1=0;% y8 j+ R) E K( k0 C) Y3 _' B
}1 D% w; @% f$ B. V, o2 G
}* p! E! m& R3 ]% p+ @: c
}* v4 l' i1 n* e1 S
/********主函数********/! F' ?4 Q. K0 f5 F. z% ?" \2 @ C
void main()) s) l2 z( m: c
{
* f* S! g) ^" w6 ?+ n* F! Z init(); //系统初始化6 j p1 E) K% j& R" R- ~
PWM_Init(); //脉冲宽度初始化. S, }; F; J# c
while(1)$ b! Z" r: q" x
{* o7 _! T! w' n" U1 d
keyscan(); //调用按键扫描处理脉宽因数
2 S9 A: G, K1 k }# ]4 n/ A4 X0 t/ Y' D- n
} |