|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机按键扫描程序 \. S8 ?9 T+ C: L$ I
#include "reg52.h"
- s% |! f0 I9 q% }8 hunsigned char count; //0.5ms次数标识
0 G8 S3 g8 z( R6 y2 g. }sbit pwm =P3^0 ; //PWM信号输出
8 W ]+ p5 l' G/ i9 x7 ~3 O1 Esbit jia =P3^7; //角度增加按键检测IO口/ @6 h! c; W- z9 d: l9 f7 B# e
sbit jan =P3^6; //角度减少按键检测IO口
& V# Y) n+ s$ ]: Q' }unsigned char jd; //角度标识
/ }2 z. {( d3 i* P9 E! E1 {void delay(unsigned char i)//延时! P9 C. {9 O/ g5 Y; X' Y6 |
{1 R9 p1 Z3 [: |
unsigned char j,k;& z7 D. L3 |) g4 L" O' z# x
for(j=i;j>0;j--)$ W9 ]# y* D& `$ [8 T* J% j
for(k=125;k>0;k--);* y- K+ f+ b6 `
}
' q2 r& i z+ C( Q( I6 N% n% t/ dvoid Time0_Init() //定时器初始化
4 o1 V" ~6 Y4 H2 A{
6 _! M* P, @3 k, f. ~( t7 d7 [2 |; dTMOD = 0x01; //定时器0工作在方式1
& \1 f/ `3 T! o4 i7 l5 D; q3 LIE = 0x82;
% _- L+ N D" i- F0 m. d4 G+ WTH0 = 0xfe;5 N7 D U; i7 I* r/ Q
TL0 = 0x33; //11.0592MZ晶振,0.5ms c. T8 f# n. q( O( D
TR0=1; //定时器开始7 e$ f# g- k) @8 c+ {- d
}
/ s, a6 O8 s n! U$ Y3 Z- N% `void Time0_Int() interrupt 1 //中断程序 O m8 f4 c9 q2 p' ]
{
5 F8 F/ z& W0 J- y2 Y6 Z4 rTH0 = 0xfe; //重新赋值8 m- {1 D* C0 N
TL0 = 0x33;
! I# _! _1 h+ l9 a; K; q if(count< jd) //判断0.5ms次数是否小于角度标识% ], A; }9 a% ]5 R3 M
pwm=1; //确实小于,PWM输出高电平: S: u8 Q# h/ Q1 e0 K# Q
else
1 p6 t9 {. f7 i* H) c3 p& Y pwm=0; //大于则输出低电平
. M2 v% e1 B. k& j/ |+ p. Y) P count=(count+1); //0.5ms次数加1 z+ @! Y+ P: ^$ W$ j
count=count%40; //次数始终保持为40 即保持周期为20ms7 W: U5 ?$ A- {
}+ l, {# p2 g9 g9 y8 L
- I/ w4 K8 ^1 F! dvoid keyscan() //按键扫描* y& e$ U6 w+ {8 N! l
{ % b7 M0 {- g* F5 a5 D+ K
if(jia==0) //角度增加按键是否按下
0 ]" Z4 ^ u' r; Y7 [ {. D& m3 i& K; }, Y* z
delay(10); //按下延时,消抖
" S' K2 E3 x) t) X5 \8 M if(jia==0) //确实按下
# w3 `' n* Y+ U% @* w {
( Q0 F! Q& w% }( d; |6 H; l2 h jd++; //角度标识加1
1 A- d8 U/ i; ?) H$ D0 v count=0; //按键按下 则20ms周期从新开始
) ]: \9 Q! ^; w p6 O3 m" N6 w. Y if(jd==6)9 ]3 i" O" b# F+ R* _
jd=5; //已经是180度,则保持
$ k8 j* T* T9 Q4 h! B while(jia==0); //等待按键放开
& h7 j8 t+ q9 B, C( \3 T }" K0 g0 N- t# Y: e
}
( ^( K* D- G7 s4 k/ y if(jan==0) //角度减小按键是否按下7 e" I, G* s7 v/ Z9 J
{& ^1 a) X! z! N% i- R1 t
delay(10);
; S: @3 D% Y, q( y! n if(jan==0) } c/ c7 P: c4 N/ d
{
( g) g, ]4 T8 }2 V jd--; //角度标识减1 D# X9 k0 Z1 S3 s$ ]
count=0;# [" s7 s, k' I$ y C
if(jd==0)$ f, Y, u$ M4 ^* J6 P# E
jd=1; //已经是0度,则保持
: ] S% _% |9 x while(jan==0);' h) F+ d8 H9 Q$ X- t: U
}6 ?" H* {. l" s$ X" O" w
}$ T$ r! o2 z- ?8 C
}3 z3 M R) g \4 N& C1 i" E- c
void main()
9 {" [# x0 L/ ^: j% f1 n……………………- V2 L0 W1 Q6 X. g
4 ?+ T9 r" z7 g+ x* Z…………限于本文篇幅 余下代码请从论坛下载附件…………
# \2 ^. R* ]" e' U# F) s
' H# V( J3 P: U$ S2 Y2 p7 K5 @
5 q+ e( J' u! I, u
1 d! T8 X6 v3 d9 Q L; E6 U7 T+ H( ?, t% O2 f. t0 \+ ] p: a
|
|