单片机 两个按键分别控制

作者在 2017-04-11 09:14:50 发布以下内容
#include<reg52.h>
typedef unsigned char U8;
typedef unsigned int  U16;
U16 x=0;
sbit S1 =  P3^6;
sbit S2 =  P3^7;
sbit led0=P1^3;
sbit led1=P1^2;
sbit led2=P1^1;
sbit led3=P1^0;
code U8 num[]={0xC0,0xF9,0xA4,0xB0,0x99,
  0x92,0x82,0xF8,0x80,0x90};
U8 shuma[4]={0};
void delay()
{
U16  i=1000;
while(i--);
}
void To_Init()
{
TMOD=0x10;
TH1=0xfc;
TL1=0x17;
TR1=1;
}
  
void refresh()
{   static U8 t=0;
switch (t)
{
case 0 : led0=0;led1=1;led2=1;led3=1;P0=num[shuma[0]];t++;break;
case 1 : led0=1;led1=0;led2=1;led3=1;P0=num[shuma[1]];t++;break;
case 2 : led0=1;led1=1;led2=0;led3=1;P0=num[shuma[2]];t++;break;  //通过对每个端口的赋值,准确控制每个端口的状态 避免干扰
case 3: led0=1;led1=1;led2=1;led3=0;P0=num[shuma[3]];t=0;break;
default : break;
}
}   
void new()     
{   static U8 j=0;
if (1==TF1)
{   
TF1=0;  
TH1  = 0xfc;   // 初始化起点位置
TL1  = 0x17; //0.05s   //
refresh();
j++;
}
if(10==j)
{
           shuma[0]=x%10;
shuma[1]=x/10%10;
shuma[2]=x/100%10;
shuma[3]=x/1000%10;
j=0;
}
}
void main ()
{
new();
P0 = num[0];
led0=0;led1=0;
To_Init();
while(1)
{
if(0==S1)
{
delay();// 键位抖动 不能准确实现 一次按键 数字加一  加延时函数 等待键位的抖动 去除干扰
if(0==S1)
{
x++;
while(0==S1) new(); //while循环扫描速度非常快 一次按键的时间 while会扫描很多次 加此条语句控制 按键状态为低电平时(按键后键位未弹起) while循环在此处等待
}
}
if(0==S2)
{
delay();
if(0==S2)
{
x--;
if(x<0)
x=0;
while(0==S2) new();
}

      new();
}
}
默认分类 | 阅读 778 次
文章评论,共0条
游客请输入验证码
文章分类
文章归档
最新评论