主要的程序我也貼上來各位看一下' ^+ b! P2 r# u# F/ s
2 z) L5 v8 `3 S, A
/********端口初始化函數********/
+ D' D8 w/ N" b9 U- b* vvoid init()
) V8 g% u2 h& i! E{! M+ \9 f/ ]- e/ T
ANSELH=0x00; //設置B口為數字I/O口
' H3 s N: W* g$ Z# ]; \, q OPTION_REG=0x00;# S7 u: ?0 ^$ E% E7 P3 j
WPUB=0xFF; //設置B口弱上拉
) D# L; {/ g. @- l) H INTCON=0x00; //關總中斷
4 w0 o' w% {* a PIE1=0; //PIE1的中斷禁止
. n3 \# u$ I' e PIE2=0; //PIE2的中斷禁止
5 Z I. L) z t# @0 T9 ]+ I! I3 n% D TRISB0=1;$ y5 ]* _7 z3 K7 X. q: {9 r
TRISB1=1; //將RB1設置為輸入口,按按鍵
+ Z- X) ?# E2 I3 f. ^ TRISB2=1; //將RB2設置為輸入口,按按鍵7 S( f: L9 k5 V# V
TRISB3=1;, ^" {$ r$ V- V, d& X
TRISB4=1;
- R: [8 C/ T& u1 H/ V% h RC1=0;2 U' m. n2 i- r+ X5 h5 L
TRISC1=0; //脈寬調制輸出引腳,設置為輸出
1 s) J8 I) J* u, Y* Z}
: W* G J$ b! N+ K: N) `5 P/********PWM初始化函數********/
1 ]) ?- C1 r w+ y2 I: q5 kvoid PWM_Init(), P# T7 U; q+ F8 ^- Q
{, ?+ L' z9 _' }5 H
PR2=249; //脈寬調制波形的周期為1000us
5 _4 Q2 B% D/ P/ R2 B: z CCP2CON=0x0C; //CCP2模塊工作在PWM模式,占空因數的低兩位為00
, @3 q" T& Q, Z" r+ q T2CON=0x02; //禁止TMR2,且前后分頻值為16,同時開始輸出PWM: P* A0 [3 s% ^0 W5 \! v
CCPR2L=0xB8; //脈寬調制波形的占空比初始值
7 Z9 B4 ]' H( ^( G0 `! M* g$ p}& z% Z! I& ]$ w' w* K, r
/********鍵盤掃描函數******* */
! Z# r# c% [/ S' fvoid keyscan()
; \* m8 h5 P" ]# l8 L5 z2 K{
3 P3 k2 H. L7 O3 M% T, S if(RB1==0) //如果是RB1鍵按下
" @( A! g) e, D {
5 [$ C" v! T7 `2 e0 E! |- n0 i delay_ms(5); //延時去抖4 ]- @3 g% Q9 X! P& l+ A+ D
if(RB1==0) //確認是否有鍵按下
S9 Y2 _& p* E {+ P2 M# t8 n5 O6 M1 q
while(!RB1); //等待按鍵釋放% _6 s" ^/ j9 r% h) a6 L1 U* q
CCP2CON=0x0C;
* H& B+ M$ h2 Z CCPR2L=0xB8; //80%占空比
2 @. z- z2 ]1 Q TMR2ON=1;
$ b) D. I( \) x: } }
. o4 Z X& y0 P: h# v3 B) J. ?) C1 m }
- P. r: h. a- w6 V& K if(RB2==0) //如果是RB2鍵按下
. U, J. G0 D/ U0 h {7 S! a) u- O9 I( X( ]/ W
delay_ms(5); //延時去抖
$ v, f7 u2 Z. j if(RB2==0) //確認是否有鍵按下
# L6 T$ \( D; J2 H9 o r/ o) G {8 g& l: `. w& q1 x9 l% l
while(!RB2); //等待按鍵釋放, M* f0 X) y5 u2 g& e7 w: a
CCP2CON=0x0C;
* m1 ~5 w1 a" z1 k% u CCPR2L=0x96; //60%占空比6 t+ \; ^) [6 |% j2 P( K
TMR2ON=1;% m& O* T2 m- C! X) x% C3 H
}! ~0 T# @' {% H, R) k! D8 B) \
}
7 N4 D; k, O5 }+ |3 [# J! W if(RB0==0) //如果是RB0鍵按下
2 J; r! C5 B; p1 o; K9 n& _. S {9 I& C# j: y3 g2 d; f* m2 ^
delay_ms(5); //延時去抖
. x& }. A9 s6 q3 ? if(RB0==0) //確認是否有鍵按下
( U, `/ Y3 U, f6 e } {6 `5 l* S+ ~- [
while(!RB0); //等待按鍵釋放
/ v% G, u% S" R( n/ B' p8 P9 J. {4 p0 O CCP2CON=0x00; //關PWM
8 y6 m1 i" x k& V& `. ^2 g0 R, \ TMR2ON=0; //禁止TMR2* N7 {" c) H6 n+ R% U3 Z, y$ `2 x
//delay_ms(5);! X" Z5 U! D# U% b0 s) i8 y
RC1=0;
6 U8 ]8 g# G& Z1 K- Z; T0 D }
* j" l! B& X- X( H( T0 i! H# l }+ F) l- U+ r# q4 Q0 \, j( I1 m! ]
}; e7 s$ A) m) j: h8 u# x P
/********主函數********/4 U$ F- \# \% x4 b" H/ ~
void main()
4 p/ U* M% o; E. o- J9 m{5 h$ Z. M2 |0 p' L& R% B+ K
init(); //系統初始化
2 G9 X ]1 _% T6 M+ p PWM_Init(); //脈沖寬度初始化
! j3 p. X- G4 D; a' g while(1)
8 [7 U5 c! d A0 J2 ^8 f t {
% p6 g7 j( Z! }9 c/ L' w+ L1 ? keyscan(); //調用按鍵掃描處理脈寬因數9 `2 e0 s- k9 o# Q5 Q& P
}
- E5 `+ f& F9 n8 f0 u$ `8 w7 w} |