|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机按键扫描程序
4 J8 j- X- G" K2 _#include "reg52.h"9 Z( X/ D5 v# V. l' r+ V
unsigned char count; //0.5ms次数标识
9 |9 i4 ^0 y) h( o8 {sbit pwm =P3^0 ; //PWM信号输出2 `( d0 |3 \$ A
sbit jia =P3^7; //角度增加按键检测IO口
% m2 Q% y$ o5 i& j8 @4 msbit jan =P3^6; //角度减少按键检测IO口
x% i( `& q6 V: `) G- @" {" {, A4 V. R% Sunsigned char jd; //角度标识, `& o4 y1 @& G A4 q0 x" w6 r( @
void delay(unsigned char i)//延时
* x9 q- U/ j& I{
$ h* ]: _; I# R k" ~) P; z; Y( f unsigned char j,k;
# i( V; j5 B0 s2 V8 A9 u+ S for(j=i;j>0;j--)
- I4 a/ \8 q) [4 X for(k=125;k>0;k--);
! Z" l% r* G& B2 T% j0 ]' Q}
" h& ~' p2 L8 t2 a( N; F' A- Kvoid Time0_Init() //定时器初始化/ c8 N2 Q6 M0 Q" f# D* N) D
{
6 b' {7 \* D1 F! g- @/ P1 k5 g; ZTMOD = 0x01; //定时器0工作在方式1 & F9 W2 |! i1 s: ^$ \
IE = 0x82;; Q( _7 |" K+ z# |5 K x
TH0 = 0xfe;8 @& c: _+ u( S( n* Q( _( {' N2 z2 `
TL0 = 0x33; //11.0592MZ晶振,0.5ms" u2 h7 d7 W8 f# _: M
TR0=1; //定时器开始- k2 P4 \; f: f9 j5 o' \% \ M
}: t2 p9 f7 N+ q0 ~
void Time0_Int() interrupt 1 //中断程序. G9 B! S4 r8 U3 _
{$ v6 b& Y3 h, j0 ^) \
TH0 = 0xfe; //重新赋值) F# J5 w$ x! M4 j
TL0 = 0x33;
5 P0 z. x& h2 B6 f if(count< jd) //判断0.5ms次数是否小于角度标识 [& R' [( y/ ^+ _8 u4 P d
pwm=1; //确实小于,PWM输出高电平' _- q" {& M8 M7 h& Z; h
else
+ f2 F8 l, }) s: f G pwm=0; //大于则输出低电平" ]3 l4 D' l- t- a. C! ~* s4 p0 y
count=(count+1); //0.5ms次数加1
( I; ~1 p+ l6 c4 {( K" G( R; c7 R/ g count=count%40; //次数始终保持为40 即保持周期为20ms) k4 y# M/ ?) E, Q
}& @8 y. M }% f
: Y, r, [# _/ N7 p4 ~. m) M. v* F
void keyscan() //按键扫描
% I+ P9 o* _" D5 V( M{ # q U5 k( o7 L( k& V. c0 d
if(jia==0) //角度增加按键是否按下
, G0 u4 h: g' `3 T; L9 ] {, i( M4 R0 s6 n/ v( }
delay(10); //按下延时,消抖5 q( r5 Z" U* Q) ^( ]
if(jia==0) //确实按下
- }( T1 D( f [: F8 j! x {
; v; u+ I$ Y* O jd++; //角度标识加1
# L0 f, |3 x) K; ` o count=0; //按键按下 则20ms周期从新开始$ n* \% s+ [9 Q$ H, |
if(jd==6)
5 B0 s' Z* G* n% V7 X. K& m jd=5; //已经是180度,则保持
0 j8 E( E- K- ?! p# p) e0 {" c while(jia==0); //等待按键放开: p9 `0 e2 I: |& X% U0 K" S
}/ U8 A1 P5 w# R4 ]/ [8 [
}
% j4 A8 t$ X$ ]* V4 ]- ` if(jan==0) //角度减小按键是否按下' h W% m! ^* [
{
% Z" I! M& c5 k: |8 t6 a delay(10);
% x$ ~* R0 i6 N; h2 \- O if(jan==0)
0 b3 X6 k u! c+ P {( y! L5 \5 k! r. \4 [
jd--; //角度标识减1
! v# i, S4 A' ^5 ]- C' A8 D) A; v count=0;
8 J- R0 b; @% F$ V/ A0 x if(jd==0)
' c) i. Q( r, ]% ^! u' F jd=1; //已经是0度,则保持
: P2 X; g* b2 F$ w/ b: U: p while(jan==0);% j% j0 \& { x- l2 {1 G
}* d# b$ d7 I; f
}
0 s8 [* C9 u) ~& `- A}
: e8 {# ]1 x' v* Yvoid main()* @8 t7 P1 d3 i" h/ ^
……………………$ g2 A9 f" w" k0 I7 u9 ?7 D" j
$ O- { l+ q, R& L…………限于本文篇幅 余下代码请从论坛下载附件…………
; m, S- V9 j: h; R, O/ s
, y1 z" p* H/ { A. w, I; A6 ?3 M7 R; ~# h( g C8 I
7 ]. R' c( U% `! \( H# G
8 k/ K5 m4 p. E" j8 d |
|