主要的程序我也贴上来各位看一下" o. `' P, U- n- `+ @) F
~/ x, ?/ Q) K! q! t0 X/********端口初始化函数********/' e0 Q# @' Q& R1 x- q
void init()
/ U) e" h$ [& T) w: T, v{
/ b P0 ^+ P2 v; u4 h% r T( O4 _5 \ ANSELH=0x00; //设置B口为数字I/O口
, X' \, E K( b0 M( r g7 z6 u( M OPTION_REG=0x00;) o, y$ Y' H% Q$ e% V
WPUB=0xFF; //设置B口弱上拉
% P c& m r5 D* T) m* n S INTCON=0x00; //关总中断) j; d% ] D$ k+ I& }+ f* E m
PIE1=0; //PIE1的中断禁止
& S/ b. h; y. p* T3 O, ]- N: ? PIE2=0; //PIE2的中断禁止
/ l# R) W$ j2 L4 m TRISB0=1;6 H) ]6 Z+ w) n( O. l& b' X
TRISB1=1; //将RB1设置为输入口,按按键
8 Z) ^* C: q/ u& }9 H5 P TRISB2=1; //将RB2设置为输入口,按按键
1 t6 K* e# m0 W7 _# a5 C3 r TRISB3=1;- o( s1 k t8 n( t
TRISB4=1;! B9 @+ W- u5 B. J" i# K$ }
RC1=0;
3 S: n K. Z9 w' l TRISC1=0; //脉宽调制输出引脚,设置为输出
" H% n- ]+ z J& r$ W}
0 a7 O7 C; n+ c: G m/********PWM初始化函数********/7 i1 O5 T) Y( g8 R" [5 x
void PWM_Init()2 ^- j9 t5 [1 L0 O
{
9 z, l2 g3 E! }( G; j PR2=249; //脉宽调制波形的周期为1000us
. ?$ t/ `+ b! q9 \2 K! M CCP2CON=0x0C; //CCP2模块工作在PWM模式,占空因数的低两位为001 E! s8 P/ X% e5 j8 R. G
T2CON=0x02; //禁止TMR2,且前后分频值为16,同时开始输出PWM
W; M; W$ h) R8 r/ q CCPR2L=0xB8; //脉宽调制波形的占空比初始值
9 {$ K) }! x5 [}
5 p( o7 ~ y, N- o/********键盘扫描函数******* */# o( }+ l4 ]$ {) g3 q) w6 m# U
void keyscan()9 f7 h& w* g2 a) f- \" A! |4 @- ^
{
! Z9 V5 g2 _" k. @5 W if(RB1==0) //如果是RB1键按下
5 K4 F3 h# v1 L, c& [* p# [5 [ {# T. ~9 F& h* G5 @" s1 P, a( B+ L/ V# t
delay_ms(5); //延时去抖' D* X" |# G: ?5 g5 K3 ?7 w7 b/ ], m
if(RB1==0) //确认是否有键按下
3 W% F5 K/ [2 G2 h- p, A) @ {
' ~! ?5 P n7 H f+ ^6 W3 H2 v7 ? while(!RB1); //等待按键释放
% \0 Q. J- p& x! i1 P( A% x CCP2CON=0x0C;$ |" d7 _' J+ E
CCPR2L=0xB8; //80%占空比
. x* l9 L& {4 _% Y7 T TMR2ON=1;, I7 j* {8 g2 y# Z* h& a( Q; `
}9 k# m* w" M8 j! ?: Y
}
2 Z" J1 p0 C3 b& l2 `# N! h if(RB2==0) //如果是RB2键按下
" L2 K j p) [ { n5 K4 ?% U2 |/ a6 s! B. Y( S
delay_ms(5); //延时去抖
8 H1 [2 z: |. Y4 |% b& q5 D7 m5 k if(RB2==0) //确认是否有键按下! Z* U7 U1 s D
{
% l- ? ]7 f0 @. @) W3 p( D while(!RB2); //等待按键释放
- _/ o3 [9 h4 o$ x _ CCP2CON=0x0C;
z1 N5 m+ O; m8 H CCPR2L=0x96; //60%占空比
! `1 S" A4 u# o+ u |, m# W- Q TMR2ON=1;
0 t1 v2 X. w: r4 R9 J }5 F( X* u. D+ a4 ^% w$ _
}
0 B1 m* Z0 F2 T' l, ~& D1 d if(RB0==0) //如果是RB0键按下
; o! N T1 |+ ]5 q- V: n6 N {% `* t* y8 b3 ]5 @2 a* B$ |8 W+ G
delay_ms(5); //延时去抖2 o3 V c2 w" _! x
if(RB0==0) //确认是否有键按下 F4 n A" U# L; t+ F) B
{' Y! d' c3 t6 f
while(!RB0); //等待按键释放
8 u3 P( b) m1 y' {5 C; y CCP2CON=0x00; //关PWM# Q$ h# l2 S7 [) z4 Q
TMR2ON=0; //禁止TMR25 i. h3 Z/ Y6 f4 m, l7 U& d
//delay_ms(5);1 \5 H7 w2 ~5 P( m" K% Q0 F3 L
RC1=0;' J- X- n) @9 K0 d% _ h6 w
}+ Z! d# o: D! j$ c* W) }
}
7 v! ~1 ]5 _# ]+ g/ Q}0 c* z+ S- e+ \+ d" }0 x* `3 _
/********主函数********/
1 ]. F1 Z# E# x5 V7 Uvoid main()4 u/ i& O `+ Q' j1 O
{
9 `, F* g% o/ S) z1 Z) M init(); //系统初始化$ }9 K" d1 }# Z) o8 Y
PWM_Init(); //脉冲宽度初始化$ X$ b+ j( E0 S- g4 L v
while(1)7 }- X- E2 a: b1 [; {
{
Y0 B1 r) d# J# A$ F0 l4 L keyscan(); //调用按键扫描处理脉宽因数# y8 u6 f4 |9 r) `
}
/ r3 s S$ G( J2 a' i} |