主要的程序我也贴上来各位看一下
* e! n% @$ [% C6 ^
% F* P1 h7 W8 C8 b Q6 o/********端口初始化函数********/
& N2 l7 X4 Q g& D/ H; rvoid init()3 D) u2 a5 a2 h: D. q7 V' ~5 O
{& o" ^0 r0 m% a
ANSELH=0x00; //设置B口为数字I/O口& s* }" L4 L! @6 o: j
OPTION_REG=0x00;
' l# Z0 W$ |: b4 e Q- L+ D; ^ WPUB=0xFF; //设置B口弱上拉
, O' T& ?. c v INTCON=0x00; //关总中断
9 j k9 D% N% |# r9 K# o4 g PIE1=0; //PIE1的中断禁止$ W$ h" o. m1 X. Y5 N# e) W/ S
PIE2=0; //PIE2的中断禁止
, Q& ~1 O. t2 F3 K TRISB0=1;
" y* h2 O5 H- _' l3 G TRISB1=1; //将RB1设置为输入口,按按键- ^+ M( t- B! S R5 W- `/ P# A. `
TRISB2=1; //将RB2设置为输入口,按按键0 U. A( \! K5 q
TRISB3=1;! L3 [; j& Z% ]! k+ i
TRISB4=1;6 W' E5 z% U& s- F
RC1=0;, s3 I4 Z8 R- G1 I8 B7 W
TRISC1=0; //脉宽调制输出引脚,设置为输出0 N& S z- ?& p, R4 K4 D1 X
}" S8 K3 C1 \5 a& P8 s0 z" j
/********PWM初始化函数********/
t8 j% Y9 m2 @' E0 Yvoid PWM_Init()
# l* k2 r3 c/ Y% |3 r4 }% R$ H{/ L5 @; h0 v6 W$ w9 v
PR2=249; //脉宽调制波形的周期为1000us " ?6 f g5 W/ Q: Q5 n7 H
CCP2CON=0x0C; //CCP2模块工作在PWM模式,占空因数的低两位为00: G! T& L6 n. t# J
T2CON=0x02; //禁止TMR2,且前后分频值为16,同时开始输出PWM# l, P7 w* r; w
CCPR2L=0xB8; //脉宽调制波形的占空比初始值
: C' L8 n/ ]" R}, ]+ e) d: _, v2 A& D0 p, |. K6 T
/********键盘扫描函数******* */9 a3 s# q8 T' Z, V4 h# p7 E1 q7 \
void keyscan()
# J _9 e: X9 H- C{
# H/ z$ {3 E# E+ i5 \, c if(RB1==0) //如果是RB1键按下# j6 a* h" V. Q: n' q2 M; ~9 w
{% h6 b9 `8 T" R
delay_ms(5); //延时去抖: [7 Z9 a7 ?! q# w; ]9 d
if(RB1==0) //确认是否有键按下2 _' b! k7 n7 g7 Q3 s! d& U7 F: N
{. t, ^; L1 {- F
while(!RB1); //等待按键释放; U v! P5 X z/ q7 j' E& U
CCP2CON=0x0C;( x8 j" ? ?0 C5 ?
CCPR2L=0xB8; //80%占空比
5 G8 |+ F4 R7 V" X( W1 N TMR2ON=1;8 V& a: Z0 e" Y) f* p: C. s
}
8 V; K6 f& a; K B }
7 R$ G |. ?: z& f- e' u- h8 [ if(RB2==0) //如果是RB2键按下
& _. q8 z$ K& K/ T* T; _ {% I- M E2 m8 n# O& v6 K
delay_ms(5); //延时去抖
/ A3 B4 |* J n% B. D if(RB2==0) //确认是否有键按下
8 D& I; I% D; @6 [ { {1 _- c7 s' S- X4 L7 j
while(!RB2); //等待按键释放
) V$ k$ O/ C+ l+ u5 { CCP2CON=0x0C;
# P/ u1 S) B! t CCPR2L=0x96; //60%占空比
; O. y/ ?: ]! w5 ?, z TMR2ON=1;/ g- v C" C) E$ c
}
y5 L: |7 F( F& v: c# T2 p }9 V9 d3 R0 C% s7 ]. D% M
if(RB0==0) //如果是RB0键按下
/ Y+ s/ U! Q! r& B: i6 x {* x1 d6 y+ ~6 ^3 m
delay_ms(5); //延时去抖2 f. S1 ^1 @+ I9 T ~2 p1 i$ `
if(RB0==0) //确认是否有键按下
! e/ H$ l+ J0 b4 F! Q {$ U/ ~ ] ]4 _
while(!RB0); //等待按键释放
; x2 K- c9 o) M$ N# Z; H2 ^ CCP2CON=0x00; //关PWM
& D( r2 C `! n' S7 A TMR2ON=0; //禁止TMR2, e( u; m! S7 U) _( O+ U/ M
//delay_ms(5);
0 d, U$ _' C$ R6 ~6 S" {. ] RC1=0;0 r9 H8 G: t/ ?5 c* \% V2 z1 A
}% x5 _8 v7 R( p; J: o$ o2 A* k, t; s
}( t, o! A" G, n
}, j$ |$ I! w7 F. j, V0 \* O
/********主函数********/' f& }$ Y+ ~% W U* R; ], k
void main()
9 v8 {; q8 u6 f{
; V; f1 t2 p6 n) y! r, M+ ^% [ init(); //系统初始化' S: U* L2 e+ E+ k3 F# F/ ?7 M
PWM_Init(); //脉冲宽度初始化& f; X* ?! d. q8 z4 H1 w
while(1) h: u! A6 z/ @. p5 _
{
+ b9 m7 M' \. q) M6 y" F3 n keyscan(); //调用按键扫描处理脉宽因数0 P w/ h( B' H( T4 a4 t$ w# R( k
}' i, N; p, |* O6 w h" W5 W: l6 A0 K
} |