主要的程序我也贴上来各位看一下1 ~* j- s9 E9 A
; T2 m; [, f. L: R9 h( v
/********端口初始化函数********/$ {) R8 v# B' F2 e
void init()
( G1 O w, ?! b& T" X3 q" e{6 \% I" A2 a! R
ANSELH=0x00; //设置B口为数字I/O口. Y& X1 T; @4 D% E, J0 b& @9 V& |
OPTION_REG=0x00;
. D' F3 T$ ` x WPUB=0xFF; //设置B口弱上拉3 r9 u! w( X+ h- k: j' ]9 M; I
INTCON=0x00; //关总中断
; Z# r) `0 `' ]* G PIE1=0; //PIE1的中断禁止
0 a& j1 u1 p3 @ PIE2=0; //PIE2的中断禁止 ~" {0 u' n9 f1 }; d* d- O! c3 X
TRISB0=1;
& B( ~0 T" ?3 O7 C; m7 H TRISB1=1; //将RB1设置为输入口,按按键
8 Z6 m2 W* J q( z( i* }* o6 i TRISB2=1; //将RB2设置为输入口,按按键
+ z/ l8 e b* W+ w0 q+ p: W TRISB3=1;2 q) W, y& ~/ g0 i d4 Q4 _
TRISB4=1;) o9 [7 L- E& a) E. `. Y7 U! o
RC1=0;9 d* X. N" r) U" C+ \
TRISC1=0; //脉宽调制输出引脚,设置为输出
) u- i" p" B# c( t0 m' D- C}& \/ U- t6 m n
/********PWM初始化函数********/
. y; \ W2 h9 \void PWM_Init()
$ ]" k- W0 e) X5 P4 I8 S4 }{
5 `2 C2 u/ W; ^- v PR2=249; //脉宽调制波形的周期为1000us
3 K* M( N ]+ o! i ^ CCP2CON=0x0C; //CCP2模块工作在PWM模式,占空因数的低两位为008 @: J& b4 f2 A2 ^. U
T2CON=0x02; //禁止TMR2,且前后分频值为16,同时开始输出PWM
% \+ w9 k+ a7 Y; c. C5 p: ^' _ CCPR2L=0xB8; //脉宽调制波形的占空比初始值. f. t$ D X6 T" q3 o- G" i* L
}
' L6 y, a+ Z# V4 ?4 P; V: L/********键盘扫描函数******* */
4 A0 H; y ], x- Tvoid keyscan(), F. d( L. E* ]
{. L0 n6 K( ?: j P5 z, ~) d: M
if(RB1==0) //如果是RB1键按下2 a) [" e( s: N! J) K# x
{
$ p8 B m9 a1 v% b: \9 [ delay_ms(5); //延时去抖+ q1 H/ G# P$ I: ?
if(RB1==0) //确认是否有键按下2 S, A8 x" p3 r# P# W7 h) C( L
{
# a2 M" S0 C$ s0 J while(!RB1); //等待按键释放: }& w* l+ e2 S0 e: F& T( l
CCP2CON=0x0C;
/ ]! K; b+ \$ C2 H8 n CCPR2L=0xB8; //80%占空比
9 l; M3 b5 [9 @0 P ?2 z1 ^8 X' x TMR2ON=1;
, G Y( F3 K1 x! a& \; |0 }3 e' I4 \: d1 U }
) n. O, T; J0 L }& b( O& q- G/ y) P$ |
if(RB2==0) //如果是RB2键按下7 @- i! V. G f: r
{* g3 L2 ^ g% V$ f: D6 t
delay_ms(5); //延时去抖
1 l9 B+ P* y! T5 { if(RB2==0) //确认是否有键按下
9 L# W- ^3 e; F: ?6 J, d+ T {- b& y! n; s; t8 k" B* T
while(!RB2); //等待按键释放
8 ^! Y0 B* Q1 V6 H7 ]8 k& x CCP2CON=0x0C;
2 i9 H5 Y5 Z1 _8 w) o5 } CCPR2L=0x96; //60%占空比
6 k% f' s0 f0 n+ z1 e' `% g TMR2ON=1;
/ H) ~+ E8 Y6 f: P2 @ }
4 B5 w ^- U+ b$ }: Y }4 Y1 q T* q! C
if(RB0==0) //如果是RB0键按下
6 x/ K0 E/ Q! _/ I7 @3 e1 t {+ H8 F+ O q: u$ _% W, r$ L
delay_ms(5); //延时去抖
% K$ ?& H4 x8 \& [ if(RB0==0) //确认是否有键按下* E u" y+ A# T* c2 I$ O8 v8 ?
{
9 k) \0 {+ P1 d2 X# z' }/ ` while(!RB0); //等待按键释放; A& X" K3 {; q5 U( i
CCP2CON=0x00; //关PWM
6 X3 {2 ?, y. C* x7 y9 r3 h TMR2ON=0; //禁止TMR2) V/ d, Q/ F: V
//delay_ms(5);
/ U* h* v$ P8 R8 D8 Q& r1 Y" ^6 Q! T RC1=0;( U; v z `2 v& h' a/ N. q8 g
}
. L% c6 I0 _3 V# A! l }0 X/ p0 p. m0 E
}3 V9 \4 W; a) r5 _7 B
/********主函数********/
* h5 P7 ]: `+ M2 ?8 b0 Zvoid main()1 ^1 K# O4 |. l. T: V
{, E* {: b9 i6 R
init(); //系统初始化. \2 B# _4 h" l) f, G v9 t2 ~
PWM_Init(); //脉冲宽度初始化
& v* a2 T: V- T ` while(1)
% Q, C4 k8 V- Z+ {+ t: W) N4 S {
* M3 X( ^% {1 V& x; K, _' Q5 Z5 g; \8 i keyscan(); //调用按键扫描处理脉宽因数" e$ x# l- g# B
}
3 @0 K$ M& [/ ?6 u; R% i- U} |