主要的程序我也贴上来各位看一下
; v F. `* ]4 d7 ~4 ^4 N4 w8 ~. u5 d9 b$ p) D; w7 Y3 \
/********端口初始化函数********/. R& c% @7 T, i2 ?9 }
void init()/ ?* A- {" \, O$ _
{7 y& c# Q5 a7 m% }
ANSELH=0x00; //设置B口为数字I/O口& _8 ]$ r j' Q& Q2 m4 A* |, s
OPTION_REG=0x00;
( d* r+ }$ N0 V! M; v WPUB=0xFF; //设置B口弱上拉# W0 n" c3 L2 P! c8 a
INTCON=0x00; //关总中断
, I6 D, B' h' o! b' f+ m6 V PIE1=0; //PIE1的中断禁止
9 X* ` J2 K7 j) @ PIE2=0; //PIE2的中断禁止. [' \6 w! ]0 ~* J
TRISB0=1;
$ A6 b( u- a7 t; T TRISB1=1; //将RB1设置为输入口,按按键
3 O7 O \% k! a$ |7 n: R+ | TRISB2=1; //将RB2设置为输入口,按按键! r! x: B1 n S8 {- G4 j: L K
TRISB3=1;: D0 l5 J- G) ~" p6 M
TRISB4=1;; F. N+ Z/ G# i1 J+ S, R
RC1=0;' o2 e& n' q! V/ l, D- \; s
TRISC1=0; //脉宽调制输出引脚,设置为输出
' r$ G# k& m" i, W9 R}
! ~" }# G5 h$ _8 ]/********PWM初始化函数********/
, G9 m/ y+ h2 F" Q' }void PWM_Init()% {/ W1 L' g7 v1 F k
{) c- \, g$ o6 t* {( X: g: ^
PR2=249; //脉宽调制波形的周期为1000us
8 t4 ~1 t& i3 i2 y) R k6 S CCP2CON=0x0C; //CCP2模块工作在PWM模式,占空因数的低两位为00
( ?/ {* B" f: K8 ] T2CON=0x02; //禁止TMR2,且前后分频值为16,同时开始输出PWM
9 e) U6 ?# n3 x8 \0 x CCPR2L=0xB8; //脉宽调制波形的占空比初始值
8 i: C6 r% B9 m/ I1 w9 [}6 t1 i' S4 o0 F' a5 y
/********键盘扫描函数******* */
7 k6 T8 f0 j; E+ H R. `void keyscan()* J; @! f2 Z3 s8 ]: m v% `
{7 F7 V1 T; i8 p7 R: J {. U3 ]
if(RB1==0) //如果是RB1键按下' P1 T, B; v4 X' q* }; r0 o
{
! e1 A8 }2 C& G; t delay_ms(5); //延时去抖' N: y/ i# ?8 }; D' _- j
if(RB1==0) //确认是否有键按下" E! _, o2 P8 ^# T6 h
{$ H d: R( k- q
while(!RB1); //等待按键释放
@) a5 J5 p* P# G CCP2CON=0x0C;! V- m! F8 c% z( E/ w
CCPR2L=0xB8; //80%占空比
9 h: g: j8 d! k# _% a# m/ L2 { TMR2ON=1;" N5 {7 j$ C2 I
}7 U5 Y$ I4 E7 f
}, u2 {' T# Z+ c9 h C5 j! k6 A; L
if(RB2==0) //如果是RB2键按下
/ I# q& a5 m& Q {1 k; Q4 o% v; e* t
delay_ms(5); //延时去抖# ?! P. P( B1 k
if(RB2==0) //确认是否有键按下
6 {, o) \" [& M- E/ e {+ `) }+ Y: m8 I8 D/ [
while(!RB2); //等待按键释放; B2 }! A& l) J2 C% _6 ^: O
CCP2CON=0x0C;
9 X) @) }3 @0 w) s2 K( d9 U' x CCPR2L=0x96; //60%占空比
l3 k6 p% {; |) [& n8 T6 `" g TMR2ON=1;
9 Z. o( m7 E P2 J8 h }
( ?! N/ m# D' A) ? }
% z$ G" A0 T( k! M/ h+ X if(RB0==0) //如果是RB0键按下! H( o, z) A" h$ k5 D
{. s& t+ h. Y1 Y! r2 g- g9 f
delay_ms(5); //延时去抖
( u& Z) L& Z/ X if(RB0==0) //确认是否有键按下0 [, ]+ P' V. Y N2 X5 o; n5 f" V- K
{
# r( }! K& H! d2 F" o2 i# @; F3 } while(!RB0); //等待按键释放
1 o/ p1 a, S: K, B CCP2CON=0x00; //关PWM! h. t# H1 v0 P' h: L
TMR2ON=0; //禁止TMR2& C: H6 `' a' n) R t7 A
//delay_ms(5);$ E+ i* S. p$ p
RC1=0;' d( M/ [/ t( [2 p/ B3 M u( s
}" q9 x* v) f' Y, S9 {
}
) k8 ^: c$ ?% ^+ L' n}: ?/ _ ]& X2 g; `* [4 @9 S! |2 C
/********主函数********/
) t% J# M5 N% j, k8 x+ _: Wvoid main(); P0 s" B6 I* D! E0 m' d
{
" v4 ^9 Z4 Y; v' d# I init(); //系统初始化
! d% b; O; X% f0 x7 J PWM_Init(); //脉冲宽度初始化
( e3 D/ |+ a* t9 l9 D0 Y9 ^ while(1)
1 H% e# v0 z/ y& ` {
) r- \2 p% a8 s+ ?7 Z keyscan(); //调用按键扫描处理脉宽因数5 f" \- \2 D" i2 }( c4 F
}
0 D. D( S* y' j1 u( @ q} |