|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机按键扫描程序
- T4 I; y/ B) o% m, R: ^#include "reg52.h"
0 ?- }+ J/ ~ a: A# G ]$ Z; O N7 iunsigned char count; //0.5ms次数标识
# [" E, g" Q0 L9 R' ~sbit pwm =P3^0 ; //PWM信号输出
- v8 z6 Q6 k( m2 d9 z1 Psbit jia =P3^7; //角度增加按键检测IO口
' q& x5 q+ U w5 `" [5 `sbit jan =P3^6; //角度减少按键检测IO口" ^9 \/ r; f9 _: a8 N5 H! [
unsigned char jd; //角度标识
% f9 {! T2 h" r6 avoid delay(unsigned char i)//延时5 N5 K2 s4 V' M. X A
{
% ?& O9 F$ c1 {: D) E7 X! a unsigned char j,k;
. O: T, E* _% G/ K; P; \/ }9 o for(j=i;j>0;j--)* b9 x0 y9 p. ~+ g
for(k=125;k>0;k--);
: P( a3 X/ f# ~" v6 N& j$ y5 E}
+ g2 \' c# U+ a5 L, Q6 `& \& [void Time0_Init() //定时器初始化
4 A+ l0 k. G) f2 {& s9 \( b S{
" M: F1 w% ^( g. Z+ q6 _- rTMOD = 0x01; //定时器0工作在方式1
: M/ C. t& i& M& g! h9 oIE = 0x82;
4 c% E9 W) o/ P5 X; iTH0 = 0xfe;0 v) d) R7 t# g& ?
TL0 = 0x33; //11.0592MZ晶振,0.5ms
& f$ ]/ p7 J9 O( ? TR0=1; //定时器开始
2 q5 V0 G# {7 N e3 E* Z}/ a; P0 N! A \
void Time0_Int() interrupt 1 //中断程序0 l6 z" J8 w3 I' `
{/ Q( a/ t% u; ~* ~0 j
TH0 = 0xfe; //重新赋值
0 o7 ~" h; v2 @/ gTL0 = 0x33;
4 k, ]. z5 s; n* R. Z if(count< jd) //判断0.5ms次数是否小于角度标识. y: P) M& F. g5 s1 m
pwm=1; //确实小于,PWM输出高电平
+ l3 }) ~: m# |0 H1 ~ }+ I else
# A# D- |6 ^* I pwm=0; //大于则输出低电平3 T) S) H( L( s
count=(count+1); //0.5ms次数加13 D& q: C$ F. z3 t- x& L
count=count%40; //次数始终保持为40 即保持周期为20ms1 |' X3 @: r: A! _( D' k+ S2 _
}
" _0 E3 x) M3 a# G) w: D: T( g6 ?$ R+ y4 ]! t
void keyscan() //按键扫描
- N, ?: y- S- c, Z/ F% k4 X8 y{
4 a$ K |5 F. S! C* A if(jia==0) //角度增加按键是否按下
4 T7 Y8 }* ~- q G' V$ w: S {. e _) s# \7 M0 @
delay(10); //按下延时,消抖
) P5 X! d5 E( D/ [8 l- N" N7 ? if(jia==0) //确实按下9 Z' K" G% E6 k* p6 A& ]0 }6 _
{
3 Y3 R9 ^* V& g9 n jd++; //角度标识加1
, W: v Z% o/ H+ C count=0; //按键按下 则20ms周期从新开始: O' k% F: y f& ^0 B/ i
if(jd==6)
6 `0 E- R. T& e" G1 b" C, I1 C: K jd=5; //已经是180度,则保持
1 f. z3 L9 E7 e) V, \ while(jia==0); //等待按键放开
( o2 l7 g' _0 a! Y& ]( w: f }& n9 Z6 V1 Y: l: k3 R) M0 s! k
}3 i/ h, B6 ~' s. M
if(jan==0) //角度减小按键是否按下/ h. R7 w% k8 l2 k* T
{
8 a- |" E+ V1 A2 m3 h) X4 {% O, x( U8 D delay(10);
. ?+ I1 P3 j. U9 B, b0 @$ y6 j- n& i if(jan==0)
; q9 O9 u* o5 l M {
; x1 N1 J3 R4 L' V; j2 t6 I3 k jd--; //角度标识减1
# |5 [6 A. V1 Z/ ~% o/ T count=0;
, f9 U! x8 K( H$ C* E o0 D if(jd==0) O3 z* X/ w/ J0 z/ G( Z
jd=1; //已经是0度,则保持
; G1 j3 T4 q; d) c while(jan==0);1 D( G* w( K( O* D
}
, n0 H& }; A t9 b9 I$ N }6 q0 a" C( o! D% a6 I+ [! J; K
}
% l8 Y7 K8 G8 z1 w. U1 @ Z. ivoid main(). P! ^ i( L, ?& \' ~
……………………3 @( _( D5 ~2 `; [
5 W# X7 N4 z9 P9 s…………限于本文篇幅 余下代码请从论坛下载附件…………% b. y' ]. k0 h. W
1 K7 A+ e) _/ Y P( t! C' D7 n/ v' F, S& c/ z+ \7 N
! X- ~: `- j0 ]& {) m; A$ _
4 w0 q4 I5 h" W& \0 u! f2 D! b9 N |
|