主要的程序我也貼上來各位看一下( ]" Q6 }! @+ q. Q
' L2 A9 J; [, D9 S" L! h4 F) Q* g/ s
/********端口初始化函數********/
: f. `- M# @! [* ]void init()
# H$ ~& \& y( u8 |& k{2 k6 E, J# x; I3 X- L% l
ANSELH=0x00; //設置B口為數字I/O口
0 `" d! S/ Y! q* y, ~' T OPTION_REG=0x00;
" X5 g0 P6 i- b9 j% r WPUB=0xFF; //設置B口弱上拉
3 z! z0 Y% G. W* \+ H' t INTCON=0x00; //關總中斷
6 j! ~1 n4 b3 q5 a9 _) @8 W PIE1=0; //PIE1的中斷禁止+ G1 }& w+ f$ q8 W: a8 i
PIE2=0; //PIE2的中斷禁止
3 W# e3 d9 m8 h3 q: C# s% G TRISB0=1;
# Q# X" m* h" } TRISB1=1; //將RB1設置為輸入口,按按鍵2 ?9 _' f# X, E# M) ?( j
TRISB2=1; //將RB2設置為輸入口,按按鍵: l! i, {+ P, }; l
TRISB3=1;
# [0 h+ M) e. \. m" w9 \) q TRISB4=1;
4 ^) P" j& d6 I8 `5 U% I RC1=0;0 Z, E9 x1 A# U9 I0 T
TRISC1=0; //脈寬調制輸出引腳,設置為輸出
$ f0 r8 M# i( F8 j2 u6 s}) t5 p. h7 t7 V/ d$ S
/********PWM初始化函數********/
" o# K9 |1 r& d, [) g) y9 Cvoid PWM_Init()
, @ F; y' U) K' ]( q0 e0 d b{& P, L( k2 F ?. V' p
PR2=249; //脈寬調制波形的周期為1000us 8 Y' Q) C; x$ b# J3 Y* w
CCP2CON=0x0C; //CCP2模塊工作在PWM模式,占空因數的低兩位為00
- o+ `* q) F2 S. ]) z* R T2CON=0x02; //禁止TMR2,且前后分頻值為16,同時開始輸出PWM3 k8 I; \ C* s* C
CCPR2L=0xB8; //脈寬調制波形的占空比初始值; o5 b8 f; i" M2 V* ~$ d" F' f+ Z
}
2 E- Y* N' I8 {& q6 j7 M/********鍵盤掃描函數******* */( u3 Z6 [6 T+ l4 N; A3 O$ o
void keyscan(); _- r- I- s4 x* z* _: i+ w/ M+ S
{, s7 N; Y2 q7 ?$ A. _% R9 E. X' R! D
if(RB1==0) //如果是RB1鍵按下0 y) ?$ d2 v p4 a: C/ K
{ _2 w$ s# u, R+ |, b
delay_ms(5); //延時去抖
- C: e' I) F6 E. t+ \) R9 d; t( I if(RB1==0) //確認是否有鍵按下( }: p9 @3 Q, E* x( P/ x
{
( a2 V! L! h- Z7 ]: @9 h; n8 T while(!RB1); //等待按鍵釋放# O8 a) F3 U; q4 ?+ Y. Z) f1 d
CCP2CON=0x0C;
! J- v( y* `5 ?7 V$ w) Y CCPR2L=0xB8; //80%占空比
, [, Z6 e9 I7 m; ~: C# Q8 J TMR2ON=1;
: g9 W8 x K+ C2 ~ }
- ?7 m8 B0 A7 K5 Q5 a) d }$ Z$ P7 v3 m& N& h
if(RB2==0) //如果是RB2鍵按下9 Q. I5 r' j% f5 t/ K* P* v
{$ H/ I% F$ @; C G
delay_ms(5); //延時去抖
! f# s9 o# J6 [5 v; r6 T+ X, a# g. |2 t if(RB2==0) //確認是否有鍵按下3 n" J, \3 P7 L. V* ]
{
5 U$ m' h9 @. p" J( \6 B- f R while(!RB2); //等待按鍵釋放+ \4 h4 k' j# \) K
CCP2CON=0x0C;
6 m8 p5 B. v- U) ?7 q CCPR2L=0x96; //60%占空比# ^; R p U5 @/ C
TMR2ON=1;
; T+ Z' M7 p) [+ B# \+ S9 W }+ f+ i7 }6 i& h" E7 I T
}
( l1 @0 k' B; U5 U, V( A if(RB0==0) //如果是RB0鍵按下
( a( t7 d, l- L7 i { b) t- ]' j: E/ P
delay_ms(5); //延時去抖/ @/ b% c1 k% z: z* x# e
if(RB0==0) //確認是否有鍵按下8 Y M# J6 f0 C' }& j
{
. v7 U' [& ~2 }" o while(!RB0); //等待按鍵釋放! t: H' s# K# w+ i( m5 I. P2 h0 [
CCP2CON=0x00; //關PWM, k6 ^8 t" b- E% [+ A% a
TMR2ON=0; //禁止TMR2
6 z/ {4 K- a" t //delay_ms(5);
2 q1 R: D- J0 L" r9 @! |) O( M RC1=0;! E$ F- J6 V; L, p' x G! p
}
: g( m4 N8 L: _, U4 u" c: y! N }! B" O8 E1 n( } v
}! C* y: J6 h3 i) t( D9 ^! t# S
/********主函數********/
9 Q+ `7 S- p1 f& o; P1 s' z! Cvoid main()
6 L& B* _6 P& r, C4 ]6 h( ?) M{
0 p+ ]. R) l& @4 z init(); //系統初始化8 ^# @& B' V# ~$ s( a! i: ?- k' E
PWM_Init(); //脈沖寬度初始化
) N: L- m* p! K6 R1 Q& S while(1)
) C" @4 C- d9 E) K: A* ? {: D' U7 I! L& a6 S' e
keyscan(); //調用按鍵掃描處理脈寬因數* ^8 x4 T6 i3 g- R% Q' Z( I
}/ J2 R- Z* H! T! S, _, w
} |