主要的程序我也贴上来各位看一下
/ s! E7 c# x9 Q# l' P* F' x7 E4 @; p* I+ v
/********端口初始化函数********/
3 G2 G5 E: t, ovoid init()
% P0 x5 k& K n- z5 z7 s- s{9 s# l3 J/ m3 W9 P" k
ANSELH=0x00; //设置B口为数字I/O口! G* g* N7 l4 n {* H
OPTION_REG=0x00;
* C5 X' _3 [/ s$ ^3 A WPUB=0xFF; //设置B口弱上拉& v. p/ r3 D7 H, B e& A
INTCON=0x00; //关总中断
$ @. _. o/ S9 }3 S PIE1=0; //PIE1的中断禁止( i a" V/ u+ U6 B a0 E8 j
PIE2=0; //PIE2的中断禁止6 V1 s% ~0 f% ? k
TRISB0=1;
+ @* D; k) a: _, N) p6 Q TRISB1=1; //将RB1设置为输入口,按按键) q2 }0 S8 L. ^* e3 N
TRISB2=1; //将RB2设置为输入口,按按键* ^/ O3 s- G d7 n& K# o
TRISB3=1;4 }6 Y, [/ O! e, c H4 }9 ^
TRISB4=1;
, }2 t4 d5 ~; F5 F% A$ j# o G RC1=0;
- K' y, Y; f6 r" n TRISC1=0; //脉宽调制输出引脚,设置为输出4 o4 r8 J! B' w& Q, T
}
2 Z" n5 E0 Z& Z2 O$ ~7 }2 k/********PWM初始化函数********/
' G- Z. O7 K" @$ Q. c+ {1 {void PWM_Init()9 y0 G9 E2 N3 s2 x& n0 x* H
{
1 p3 [/ E4 Y) H PR2=249; //脉宽调制波形的周期为1000us 1 g2 I0 \/ S/ T. ~2 U5 E! M$ C
CCP2CON=0x0C; //CCP2模块工作在PWM模式,占空因数的低两位为00
0 Y7 u0 W5 n, `1 e3 D& p T2CON=0x02; //禁止TMR2,且前后分频值为16,同时开始输出PWM
3 H: i s+ l0 n" \8 s: g- f CCPR2L=0xB8; //脉宽调制波形的占空比初始值( w! E* f2 F" a' `3 I! k& F* s
}
* x+ N" `) s' d5 A/********键盘扫描函数******* */9 k' F% {3 Z- Z1 L; J- E2 Z1 f5 T
void keyscan()% F1 E' p3 ?- Z
{
/ L! ?: ]2 s' X, ]1 N# A: a if(RB1==0) //如果是RB1键按下' }5 b9 I- i8 F+ i7 P0 l# h
{
' P( @ e% F+ x/ T' V1 o( g% Z& O h$ E delay_ms(5); //延时去抖
) Y- {, @! A" p$ ~( {2 X" a$ `$ { if(RB1==0) //确认是否有键按下
/ v8 l- c" ?) v7 \* d$ R {
4 {: X8 T% x& D* N1 e4 p while(!RB1); //等待按键释放
, z( P7 I7 v z' x* L CCP2CON=0x0C;! j' ]1 T# M" I0 |
CCPR2L=0xB8; //80%占空比$ \' V8 K: [6 g& P
TMR2ON=1;
8 i' H! a) x* o( a* n3 ?. t }
$ m, H; u% k7 j- w$ G3 c1 T! V! Z }4 l% @% [0 h2 K2 i
if(RB2==0) //如果是RB2键按下
% O# i0 d7 W$ F' I {5 N- X i8 U ~/ i2 }/ g
delay_ms(5); //延时去抖# M8 K1 i- e" U W5 d( ~! f
if(RB2==0) //确认是否有键按下
) d5 G2 [. O+ k" T {
- v9 o, t/ ]2 b- G# y/ T# S& }0 U while(!RB2); //等待按键释放' E# O6 b# r6 R, O$ T3 c
CCP2CON=0x0C;1 i7 E; v% N3 R
CCPR2L=0x96; //60%占空比) X1 @7 U- L" J& L* h% `5 f# a
TMR2ON=1;
0 R% l% q7 i6 v9 g1 [ }4 R z8 }4 G1 V6 v( L
}- [+ l. ?8 {6 p) I6 ?
if(RB0==0) //如果是RB0键按下
d$ w+ h& @( Y+ G8 |, s- f {
, w2 [$ f# \) i4 [0 v6 m; x4 z delay_ms(5); //延时去抖
* T- w6 X" Q2 O h* S if(RB0==0) //确认是否有键按下
& O: Y# _. e$ w {
. a- m% S6 Y# a! W2 z# o while(!RB0); //等待按键释放
, ^ o, G2 s6 j& Q1 c: i2 W CCP2CON=0x00; //关PWM: e' T$ u" d" I6 V4 t
TMR2ON=0; //禁止TMR2
7 ]$ ~0 E/ C: w8 i0 \ //delay_ms(5);
Y7 y& v- U0 o# S- t- A% { RC1=0;
( ~+ c! {. v6 ]. K3 e7 A }
/ i8 d P: P$ g3 H+ ~& ^% c" y }/ l& G' @0 P t: P& k6 d! f" Z) K
}& ]0 K6 I O# n% ~- @
/********主函数********/
9 f, ~) u, v) N1 Dvoid main()
2 ^+ w# {+ c \! I. c& U{
5 O& K: j9 ~5 g/ u8 ]8 r; f init(); //系统初始化
" [7 s+ w# p3 M* x& {5 J Y+ X4 k% ^4 S PWM_Init(); //脉冲宽度初始化
% l2 @ l/ _7 Z* B while(1)
, o7 D$ ^% `7 I* C* z! ~7 y% n {0 b D' v q& L1 H" j! Z/ X3 {
keyscan(); //调用按键扫描处理脉宽因数3 A) i5 U* _" E: h+ ~: \; Q
}, Q7 U" [" _& k B) C2 y
} |