|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机按键扫描程序
5 X' H( {" Z7 M1 {( y0 S. Q#include "reg52.h" @. l7 r0 a9 N8 Z8 g6 p( G- [9 v1 g
unsigned char count; //0.5ms次数标识$ ^; {! }9 P5 z% `: S! t
sbit pwm =P3^0 ; //PWM信号输出- b. U+ F2 p3 V, Z3 Q* H
sbit jia =P3^7; //角度增加按键检测IO口 s) k+ J/ M2 i9 f9 c& T; ?. j) t: U
sbit jan =P3^6; //角度减少按键检测IO口
8 P& P! }$ ~) @ }4 q, wunsigned char jd; //角度标识
. }, Q2 ~! z" W' xvoid delay(unsigned char i)//延时
7 k4 c! `, E0 B# b. k5 y8 ]{
; E( k6 |% j+ v! ]2 c unsigned char j,k;7 U/ `+ y# t/ Y+ ^9 t8 Q
for(j=i;j>0;j--): z6 A0 Q. F1 W. b# L
for(k=125;k>0;k--);
% o% Q' K4 }" k% m}7 ?+ n+ {( J) c8 V; J& O
void Time0_Init() //定时器初始化4 _3 q4 `5 A$ v2 M5 ^
{
* G7 U2 Y3 h5 z: W, YTMOD = 0x01; //定时器0工作在方式1
) }& b; u* F: W' X! h1 I' HIE = 0x82;& b+ R/ H* H @# `. C" M/ N
TH0 = 0xfe; u- t: c( ^8 ]
TL0 = 0x33; //11.0592MZ晶振,0.5ms# W% y2 w+ d' i3 ~
TR0=1; //定时器开始6 k, A1 d! v3 [. o* r& L8 p* ^
}; d1 e5 `- J9 k0 R2 X0 X
void Time0_Int() interrupt 1 //中断程序4 q% ^' g- ^$ Z/ f
{
! v9 G& x" j$ K( V6 p+ ?' H3 oTH0 = 0xfe; //重新赋值4 g$ N6 r: a% g1 D. d& z
TL0 = 0x33;% E& E* t7 p) \& K8 Z( r; i5 h
if(count< jd) //判断0.5ms次数是否小于角度标识
6 C& G8 {% v) z pwm=1; //确实小于,PWM输出高电平" ~+ \ `& c) X1 L5 S) b
else" j/ d0 _$ Q$ H
pwm=0; //大于则输出低电平
& B/ V1 ]5 j+ f" ]/ t count=(count+1); //0.5ms次数加1
7 @5 w& X4 h, g0 G( K+ R count=count%40; //次数始终保持为40 即保持周期为20ms
$ ^! T+ [5 c3 f7 q# e0 q' J6 f}
L* j& \% Q6 N4 s1 E! e$ b" N3 U5 N1 O* v" J
void keyscan() //按键扫描
/ O$ E' F5 }, J ~; ?) ^{
e9 A6 f4 G, w4 @- L$ E if(jia==0) //角度增加按键是否按下
4 J, u2 e. I5 {0 ~. i# g {
9 V% r2 ~" d# X0 f* b1 L delay(10); //按下延时,消抖
; C8 [% l5 [& e if(jia==0) //确实按下3 M% b; g; k9 z
{
7 _+ _; I: B1 i! |( ] F( k- p jd++; //角度标识加1
% x; L3 m, j; e& S* G- @ count=0; //按键按下 则20ms周期从新开始
/ m+ F# ~, X6 k6 t( s5 V! Z1 d% _5 x: ] if(jd==6)- z+ e- j9 \% |
jd=5; //已经是180度,则保持
7 h/ |) k( G: C$ ]5 o0 ? while(jia==0); //等待按键放开
4 M9 m' m) g: T0 E) L [% ` }
: F$ s; D2 ?& p: u }
. q* B! q+ ~# ~) N1 x) W if(jan==0) //角度减小按键是否按下; {2 r* V; b0 y: U$ i% r
{
f, W4 O4 ]2 G3 H& c delay(10);* d4 f7 N+ L+ w! U0 E. L2 I. q
if(jan==0)
: J6 N5 W1 _9 Z% [ A {
4 n0 M2 w [9 [7 | jd--; //角度标识减1$ i {- P6 ] }2 L$ o
count=0;! Z% _( [1 p9 p
if(jd==0)
5 K8 J, q" |" W) s jd=1; //已经是0度,则保持/ F2 D- h2 ~7 w% R3 A! E( H
while(jan==0);: O5 F8 o& l5 o! ?' W/ D
}
, r- A# i; u+ F, c3 b- u8 m9 k }! I+ f; m% P% A% w: c% J
} i* ~# y; Q7 N2 ]+ L& H4 @$ ?
void main()
* I( y6 V8 V4 e7 L4 @9 _. j3 T/ s……………………$ j) P) I- B4 f; ?
% x) l8 I4 S( t3 I
…………限于本文篇幅 余下代码请从论坛下载附件…………3 M' }" h, O ]% W" U% q
- j0 }6 H2 D/ X8 a
# |% m5 ^$ q' y& p' e) o# D
. h h) Y" R* j5 c
# Z' v1 y/ h/ {$ W4 v0 w |
|