|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机按键扫描程序
# f+ d& z! O5 t1 ~( n9 ?0 E! h#include "reg52.h"* R2 i! z3 B6 @: t( F3 q
unsigned char count; //0.5ms次数标识
& B6 \+ s! } usbit pwm =P3^0 ; //PWM信号输出
2 V5 ^0 _# \8 Zsbit jia =P3^7; //角度增加按键检测IO口9 T' M$ z4 z" Z. R/ m* [
sbit jan =P3^6; //角度减少按键检测IO口
' g, r" s6 ^( X( N* B! M. Munsigned char jd; //角度标识 p0 G$ t+ C L! c" Y. d1 g
void delay(unsigned char i)//延时4 t8 S V! Q' c/ s$ t
{
8 Y6 s% _* \8 `$ j" s7 U6 G+ Y4 i' R unsigned char j,k;
, W4 Y8 F$ o& a for(j=i;j>0;j--)1 {2 ?6 L5 R- R' h
for(k=125;k>0;k--);2 }5 X# D& l8 `/ ~
}
' S9 y. C! s3 D, R r$ Zvoid Time0_Init() //定时器初始化
/ e4 P$ M, Z! A. Q* A{: |- R) y: c4 w, S3 Z) ?8 s
TMOD = 0x01; //定时器0工作在方式1 # v/ V7 [7 u, x7 l+ f: X
IE = 0x82;
* x) n% L" y4 p0 h* kTH0 = 0xfe;, s4 H) f: o& k5 q3 d" Y/ w
TL0 = 0x33; //11.0592MZ晶振,0.5ms
8 H4 C6 h7 Y& a, y7 T2 x TR0=1; //定时器开始; t1 @) S) |, F2 O1 d u! u6 ^% H
}, h/ A6 w/ f: _/ l
void Time0_Int() interrupt 1 //中断程序
0 E0 J/ F. t) s/ ?- ]9 x/ \ c{/ |4 |3 b7 M: [: J8 h
TH0 = 0xfe; //重新赋值
; Q8 R! T% ~3 S) B2 F7 k0 yTL0 = 0x33;" D( a: f# m+ k% X
if(count< jd) //判断0.5ms次数是否小于角度标识1 @: \- ~" [ l
pwm=1; //确实小于,PWM输出高电平
1 j, g( u2 ~8 W1 w# I! x else
. D( V( p( f! ^! }( Y! ? pwm=0; //大于则输出低电平
/ y# B4 r" A1 | count=(count+1); //0.5ms次数加1
. {2 M! t3 X3 E A# w) d* I count=count%40; //次数始终保持为40 即保持周期为20ms. P# E8 Z2 D# f7 Y( X& p" f
}
! s) N0 l! r) m* x' K) f- `' G3 R) Y
void keyscan() //按键扫描% {2 l% p; o1 r0 K1 x) H! i; h% p! J
{
$ u* U7 I: |+ W% |( ]! N" R if(jia==0) //角度增加按键是否按下+ u" T5 A: K. b- m" B4 H
{6 [' T( p- U2 x( l- `
delay(10); //按下延时,消抖" n5 i, N5 g6 r0 ^ ]3 y
if(jia==0) //确实按下4 u# c* P2 Q/ t8 ?) i& |. U, F
{& H! r4 ]8 P# P
jd++; //角度标识加15 I8 o. i, s3 n& f$ q& \1 K
count=0; //按键按下 则20ms周期从新开始
! }" k! }4 ]/ V- Z if(jd==6)3 B2 h* K: M/ R9 V
jd=5; //已经是180度,则保持* w6 E( c3 ?, N2 h& l" w% T+ ~
while(jia==0); //等待按键放开7 ~' T& ?% F9 c( ]$ a
}
W3 T% L; m$ L }
& m9 O# i# B' } if(jan==0) //角度减小按键是否按下4 L6 S. a f* g3 A+ m
{& l+ I- r; o# K( z$ J
delay(10);
. |7 J9 N) L% d- s; w$ Y: h# E if(jan==0)
; R1 {1 B7 g0 D& A; Y {: K) n3 J6 m3 \- Z! C7 W: ]
jd--; //角度标识减1$ {6 l6 I5 |/ q! A! ]
count=0;$ Z9 m) t& _( T# V% B0 i" `( ?6 n
if(jd==0)
% ]! u! E* E/ l jd=1; //已经是0度,则保持
1 T. x# t% ]$ ?6 ~6 }8 U while(jan==0);
0 Y0 I+ O5 e- P7 W- D }
! V7 m& g5 c* X' p. [1 N }8 j3 n& X8 M, X8 U
}
6 A6 \- J* C8 B( j$ R4 a5 ?void main()
: I1 B& ?+ @8 _+ I: v3 O……………………
5 z& i6 R D2 J5 G9 { g* o9 X5 W7 }0 `3 t
…………限于本文篇幅 余下代码请从论坛下载附件…………; j6 l6 s2 n% L
k: c! m+ l2 K3 R1 B: C2 x- ]. V) j! F# k) ^4 W1 m" `
4 Z0 C- z; B5 Q# c# D% v0 h
. B6 O$ E' s ]) U6 |' V: U |
|