唯倚社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 451|回复: 1

[学习教程] 51单片机按键加减9/99/999/9999

[复制链接]

34

主题

175

帖子

2359

积分

LV3

Rank: 3Rank: 3

积分
2359
发表于 2017-12-25 23:05:58 | 显示全部楼层 |阅读模式

轻松玩转社区

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 fsw 于 2017-12-25 23:07 编辑

通过两个独立按键控制加减,在数码管上显示
[C] 纯文本查看 复制代码
#include<reg52.h>
#define dataport P0

sbit key_add=P3^0;//开始
sbit key_dec=P3^1;//停止
sbit LATCH1=P2^2;
sbit LATCH2=P2^3;

unsigned char code duanma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsigned char tempdata[8];//存储显示值的全局变量
void delay(int t);
void display(unsigned char firstbit,unsigned char Num);

void main(void)
{
    unsigned int num=0;
        key_add=1;
        key_dec=1;//电平置高
    while(1)
    {
        /*------------------
按键低级写法
         if(!key_add)
         {
          delay(10);//延时去抖动
          if(!key_add)//再次确认
          {
           while(!key_add);
           {
            if(num<9999)
            num++;
                }
          }
         }
         if(!key_dec)
         {
          delay(10);
          if(!key_dec)
          {
           while(!key_dec);
           {            
            if(num>0)
                num--;
           }
          }
          -------------*/
//按键高级写法
          static bit flg=0;//按键按下标志
          if(!key_add)//加一
          {
                if(!flg)
                {
                        flg=1;
                        if(num<9999)//如果是累加9/99/999只需要换成相应数字,并分解显示信息
                num++;//执行操作
                }
          }
          else if(!key_dec)// 减一
          {
                if(!flg)
                {
                        flg=1;
                        if(num>0)
                    num--;//执行操作
                }
          }
          else flg=0;
      tempdata[0]=duanma[num/1000];//分解显示信息,根据要显示位数而定,显示第四位
      tempdata[1]=duanma[(num%1000)/100];//显示第三位
      tempdata[2]=duanma[(num%100)/10];//显示第二位
      tempdata[3]=duanma[num%10];//显示个位
      display(4,4);
   }
}

void delay(int t)//1ms延时子程序
{
 int x,y;
 for(x=100;x>0;x--);
 for(y=t;y>0;y--);
}

void display(unsigned char firstbit,unsigned char Num)//显示子程序
{
 unsigned char i;
  for(i=0;i<Num;i++)
  {
   dataport=0;
   LATCH1=1;
   LATCH1=0;

   dataport=weima[i+firstbit];
   LATCH2=1;
   LATCH2=0;

   dataport=tempdata[i];
   LATCH1=1;
   LATCH1=0;
   delay(200);
  }
}

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|weiecn ( 湘ICP备14002058号 )

GMT+8, 2018-9-22 21:01 , Processed in 0.092033 second(s), 14 queries , Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表