微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 第一个单片机实验:数码时钟显示

第一个单片机实验:数码时钟显示

时间:10-02 整理:3721RD 点击:
显示效果仿真图程序:
#include<reg52.h>
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
sbit LATCH2=P2^3;//                 位锁存
sbit KEY_ONE=P3^0;
sbit KEY_TWO=P3^1;
sbit KEY_THR=P3^2;
sbit KEY_FOR=P3^3;//四个控制按键的定义
unsigned int dig;
bit dp;
unsigned char code dofly_DuanMa[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};// 显示段码值0~9
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsigned char TempData[8]; //存储显示值的全局变量
void Delay(unsigned int t); //函数声明
void DelayMs(unsigned int t);
void Display(unsigned char FirstBit,unsigned char Num);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
main()
{
unsigned char num,fig,dig;
unsigned int j;
fig=55;dig=17;//fig代表分钟,dig代表时钟
/////////////////////////////////////////////                 
while(1)
     {
          if(!KEY_ONE)//第一个按键为时钟的增加
           {
           DelayMs(28);
            if(!KEY_ONE)
            {
             if(dig<=22)
             {
              dig=dig+1;
              }
             }
           }
////////////////////////////////////////////
          if(!KEY_TWO)//第二个按键代表分钟的增加
           {
            DelayMs(28);
             if(!KEY_TWO)
             {
              if(fig<=58)
              {        
                fig=fig+1;
               }
              }
            }
////////////////////////////////////////////
          if(!KEY_THR)//第三个按键代表时钟的减少
           {
            DelayMs(28);
             if(!KEY_THR)
             {
              if(dig>=1)
              {
               dig=dig-1;
               }
              }
            }
////////////////////////////////////////////
          if(!KEY_FOR)//第四个按键代表分钟的减少
           {
            DelayMs(28);
             if(!KEY_FOR)
             {
              if(fig>=1)
              {        
               fig=fig-1;
               }
              }
            }
////////////////////////////////////////////////////////////////////////////////////////////
            j++;dp=0;
            if(j==76)  //检测当前数值显示了一小段时间后,
              //需要显示的数值加1,实现数据显示的变化
             {
                  j=0;
                  num++;
                  dp=!dp;
                  if(num==60)//用于显示0~59
                    {
                     num=0;
                     fig++;
                       if(fig==60)
                        {
                         fig=0;dig++;
                         if(dig==24)
                         dig=0;
                         }
                     }
                  
              }
       TempData[0]=dofly_DuanMa[dig/10];//分解显示信息,
                      //如要显示68,则68/10=6  68%10=8  
       TempData[1]=dofly_DuanMa[dig%10];
           if(dp)
            {
              TempData[2]=0x40; //显示"-"
             }
           else
            {
             TempData[2]=0;
             }
       TempData[3]=dofly_DuanMa[fig/10];//分解显示信息,
       TempData[4]=dofly_DuanMa[fig%10];
           if(dp)
            {
             TempData[5]=0x40; //显示"-"
             }
           else
            {
             TempData[5]=0;
             }
        TempData[6]=dofly_DuanMa[num/10];//分解显示信息,
        TempData[7]=dofly_DuanMa[num%10];
        Display(0,8);
      }
}
//////////////////////////////////////////////////////////
void Delay(unsigned int t)
{
while(--t);
}
///////////////////////////////////////////////////////////
void DelayMs(unsigned char t)
{
while(t--)
{
     //大致延时1mS
     Delay(245);
         Delay(245);
}
}
//////////////////////////////////////////////////////////
void Display(unsigned char FirstBit,unsigned char Num)
{
      unsigned char i;
          
      for(i=0;i<Num;i++)
      {
       DataPort=0;   //清空数据,防止有交替重影
       LATCH1=1;     //段锁存
       LATCH1=0;
       DataPort=dofly_WeiMa[i+FirstBit]; //取位码
       LATCH2=1;     //位锁存
       LATCH2=0;
       DataPort=TempData; //取显示数据,段码
       LATCH1=1;     //段锁存
       LATCH1=0;
       Delay(200); // 扫描间隙延时,时间太长会闪烁,
                   //太短会造成重影
       }
}

仿真图


             ··

怎么啦?                        

我也想做一个还有其他资料没?

我也是刚刚开始学着动手做做的,刚刚先把程序编好了,然后电路画好了,准备买材料做做呢,动动手

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top