C51--Task04 数码管实验

一、显示小数

具体任务:

尝试在数码管上显示带有小数点的数字,例如3.14

代码:

#include<reg52.h>

//位定义数码管
sbit SegmentG1=P2^3;
sbit SegmentG2=P2^2;
sbit SegmentG3=P2^1;
sbit SegmentG4=P2^0;

//定义数码管显示数字
static unsigned char s_arrNumber[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};

//延时函数
static void DelayNms(int nms)
{
	unsigned int i,j;
	for(i=0;i<nms;i++)
	{
	 for(j=0;j<123;j++)
	 {
	 }
	}
}

//主函数
void main()
{
	while(1)
	{
	 P0=s_arrNumber[3]&0x0c;//显示3.
	 SegmentG1=0;           //打开数码管1
	 DelayNms(5);           //延时5ms
	 SegmentG1=1;           //关闭数码管1
	 
	 P0=s_arrNumber[1];     //显示1
	 SegmentG2=0;           //打开数码管2
	 DelayNms(5);           //延时5ms
	 SegmentG2=1;           //关闭数码管2
	 
	 P0=s_arrNumber[4];     //显示4
	 SegmentG3=0;           //打开数码管3
	 DelayNms(5);           //延时5ms
	 SegmentG3=1;           //关闭数码管3
	 
	 P0=s_arrNumber[1];     //显示1
	 SegmentG4=0;           //打开数码管4
	 DelayNms(5);           //延时5ms
	 SegmentG4=1;           //关闭数码管4
	 }
}

二、按键计数器

具体任务:

判断KEY1按下,每次按下按键后记录按动次数加1,并且能在数码管上显示,能够从0计数至99。

代码:

(三种方案)

#include <reg52.h>

//位定义数码管
sbit SegmentG3 = P2^1;
sbit SegmentG4 = P2^0;
//位定义按键
sbit KEY1 = P3^2;
//定义数组0~9
static unsigned char s_arrNumber[] ={0x03, 0x9F, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1F, 0x01, 0x09};

//延时函数
static void DelayNms(int nms)
{
  unsigned int i,j;
  for(i=0;i<nms;i++)
  {
    for(j=0;j<123;j++)
    {
      
    }
  }
}

//主函数
void main()
{
  unsigned int i,j = 0;//定义要用到的变量
  while(1)
  {
    //定义初始显示的数字00
    P0 = s_arrNumber[i];//显示数字0
    SegmentG4 = 0;      //打开数码管4
    DelayNms(5);        //延时5ms
    SegmentG4 = 1;      //关闭数码管4
		P0 = s_arrNumber[j];//显示数字0
    SegmentG3 = 0;      //打开数码管3
    DelayNms(5);        //延时5ms
    SegmentG3 = 1;      //关闭数码管3
		
		//按键检测消抖
    if(0==KEY1)         //若1被按下
    {
      DelayNms(50);     //等5ms
      if(0==KEY1)       //若再次检测到1被按下
      {
			
        //个位增加任务
        i++;
        if(i<10)//个位不超过10
        {
				 //数码管4打开显示不断增加的数字i,持续5ms关闭
				 P0 = s_arrNumber[i];
				 SegmentG4 = 0;
				 DelayNms(5);
				 SegmentG4 = 1;
				 //数码管3打开显示j(初始为0,后续看十位增加任务里是几就保持几),持续5ms关闭
				 P0 = s_arrNumber[j];
				 SegmentG3 = 0;
				 DelayNms(5);
				 SegmentG3 = 1;
        }
        else
        {
				 //十位增加任务
				 i=0;
				 j++;
				 if(j<10)//十位不超过10
          {
					  //数码管4打开显示i=0,持续5ms关闭
            P0 = s_arrNumber[i];
            SegmentG4 = 0;
            DelayNms(5);
            SegmentG4 = 1;
						//数码管3打开将十位数j增加1,持续5ms关闭
            P0 = s_arrNumber[j];
            SegmentG3 = 0;
            DelayNms(5);
            SegmentG3 = 1;
						//十位增加1后跳转至个位增加任务(因为条件符合i<10),如此循环
          }
          else//十位超过10,即超出了99计数范围,则重新执行任务(显示00)
          {
            i,j = 0;
            P0 = s_arrNumber[i];
            SegmentG4 = 0;
            DelayNms(5);
            SegmentG4 = 1;
            P0 = s_arrNumber[j];
            SegmentG3 = 0;
            DelayNms(5);
            SegmentG3 = 1;
          }
        }
        while(0==KEY1)//等待KEY1弹起
        {
          
        }
      }
    }
  }
}

//方案2
void main()
{
  unsigned int n = 0;
  unsigned int m = 0;
  unsigned int l = 0;
  
  while(1)
  {
    if(KEY1 == 0)
    {
      DelayNms(100);
      n++;
    }
    
    m = n % 10;
    l = n / 10;
    
    P0 = s_arrNumber[m];
    SegmentG4 = 0;
    DelayNms(5);
    SegmentG4 = 1;
    
    P0 = s_arrNumber[l];
    SegmentG3 = 0;
    DelayNms(5);
    SegmentG3 = 1;
  }
}

//方案3
  i++;
  if(10==i)
  {
    i=0;
    j++;
  }
  else if(10==j)
  {
    j=0;
    k++;
  }

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值