欢迎光临散文网 会员登陆 & 注册

51单片机100例实例之14例

2021-01-21 14:27 作者:技术流阿宅  | 我要投稿

//项目名称:按键控制数码管移位显示

//项目再创作者:科技小宅神

//完成时间:2021/01/21

proteus仿真图

#include <reg52.h>//c51头文件

#define uchar unsigned char

#define uint unsigned int

//段码,共阳极数码管0-9的数字

uchar code  duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};

//位码

uchar code  wei[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};

//待显示到个数码管缓冲(开始仅在0位显示0,其他黑屏,10为黑屏)

uchar Display_Buffer[]={0,10,10,10,10,10,10,10};

//1毫秒延时子程序

void DelayMS(uint x)

{

  uchar t;

 while(x--)

 {

   for(t=0;t<120;t++);

 }

}

//刷新显示程序

void Show()

{

  uchar i;//定义一个局部变量i

 for(i=0;i<8;i++)

 {   

  P0=0xff;//消除对P0口的影响

  P0 = duan[Display_Buffer[i]];//发送段码

   P2 = wei[i];//发送位码

  DelayMS(2);//延时

 }

}

//主程序

void main()

{

  uchar i;

 uchar Key1,Keycount=0;//定义局部变量i,key1,keycount(按键计数值)

 P0 = 0xff;//初始值 

 P1 = 0xff;//初始值 

 P2 = 0x00;//初始值 

 while(1)

 {

   Show();

  P1=0xff;//初始值

  Key1=P1;//将P1的状态保存到Key1中

  switch(Key1)//通过P1的状态来决定做什么操作

  {

    case 0xfe: Keycount++; //可以加到按键计数值为8,按下k1时加1计数并增加显示位 

      //当P1=0xfe时,即P1.0=0,即k1按下

      if(Keycount>8)  Keycount=8; 

     //如果按键计数值大于8,那么按键计数值为8,第七位数码管亮

      Display_Buffer[Keycount-1]=Keycount;

      break;


   case 0xfd: //当P1=0xfd时,即P1.1=0,即k2按下

       if(Keycount>0)  //如果按键计数值大于0 

      Display_Buffer[--Keycount]=10;     //按下k2时减1计数并减少显示位

      break;                            //如按键计数值为1,时,大括号里自减减1为Display_Buffer[7]=10,数码管第七位黑屏

                                               

   case 0xfb:  //当P1=0xfb时,即P1.2=0,即k3按下

      Display_Buffer[0]=0;//0位显示0

      for(i=1;i<8;i++)

    Display_Buffer[i]=10;//无论之前计数是多少,只有0位显示0,其他黑屏

      Keycount=0;//按下k3时清零

  }

   while(P1 != 0xff)  Show();

   //查询是否有按键按下,若没有继续判断,若有则继续显示出来相应的结果

 }

}

51单片机100例实例之14例的评论 (共 条)

分享到微博请遵守国家法律