×
单片机 > 单片机程序设计 > 详情

基于stc89c52rc单片机的数字钟设计(数码管显示)

发布时间:2020-05-30 发布时间:
|

事情总是看着简单,做起来没那么容易。
这个程序我开始时是根据教程编的,有些地方不理解就匆匆略过……事实证明这是不可取的……
写了百十来行以后编译,报错!就不会解决了。
这时才体会到基础是多么重要!!!
学习方法要科学,要知其然,更要知其所以然。
就像罗哥说的,从原理入手……
感谢 刘鹏  百忙之中抽出时间指导,真是我的良师和益友。。。。。。。
  *****************************************************
把程序贴出来。大家学习学习。千万不要ctrl c,ctrl v。
全部代码下载地址:http://www.51hei.com/f/ssz.rar
********************************************

我已经加了部分注释……

*************************************************************
P1口接4*4矩阵键盘
P2口作为数码管的片选控制端
P0口送给数码管数据
1:实现时分秒的显示
2:通过S1调节秒,S2调节分钟,S3调节小时,S4退出调节模式。
3:按键松手有效

*************************************************************
矩阵键盘的扫描
定时器的应用
*****************************************
c语言函数调用
形参
实参
******************************************************************

#include
#define uchar unsigned char
#define uint unsigned int
uchar code table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x40};//共阴数码管字模
uchar code table2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};
//P2口位选8个数码管
uchar key_code[] =
{0xb7,0xbb,0xbd,0xbe};
uchar key;
uchar hour,min,sec;
uchar k;
void delay(uchar z)  //延时函数
{
 uchar x,y;
 for(x=z;x>0;x--)
   for(y=100;y>0;y--);
}

void display() //显示函数
{
   if(k==20)//定时器定时50ms,20次就是1秒
   {
     k=0;
  sec++;
 }
   if(sec>59)
  {
    sec=0;
    min++;
   }
 if(min>59)
    {
       min=0;
    hour++;
  }
 if(hour>23)
 {
    hour=0;
  }
     P2=table2[5];  //片选
  P0=table1[hour/10];//送数据,十位
  delay(10);
  P2=table2[4];  //片选
  P0=table1[hour%10];//个位
  delay(10);

  P2=table2[3]; 
  P0=table1[min/10];
  delay(10);
  P2=table2[2]; 
  P0=table1[min%10];
  delay(10);


  P2=table2[1]; 
  P0=table1[sec/10];
  delay(10);
  P2=table2[0]; 
  P0=table1[sec%10];
  delay(10);

  
}

unsigned char keyscan()//键盘扫描程序
{
  unsigned char scan1, scan2, keycode, j;

  P1 = 0xf0;
  scan1 = P1;
  if (scan1 != 0xf0)
  //判键是否按下
  {
    delay(10); //延时10ms
    scan1 = P1;
    if (scan1 != 0xf0)
    //二次判键是否按下
    {
   TR0=0;
      P1 = 0x0f;
      scan2 = P1;
      keycode = scan1 | scan2; //组合成键扫描编码

      for (j = 0; j < 4; j++)
      {
        if (keycode == key_code[j])
        //查表得键值
        {
          key = j;
    while(P1!= 0x0f)
    display();
          return (key); //返回有效键值   
        }
      }
    }
 
  }
  else
    P1 = 0xff;

 
  return (key = 4); //返回无效码
}
void system_Ini() //定时器初始化
{
    TMOD= 0x01;
    TH0=(65535-50000)/256; 
    TL0=(65535-50000)%256; 
 ET0 = 1; 
    TR0  = 1;
  EA=1;

}
void timer0 () interrupt 1 //中断程序
{
   TH0=(65535-50000)/256; 
   TL0=(65535-50000)%256;
   k++;
}
void contral(uchar key) //调整时间
{
   if(key==0||key==1||key==2)
   {
     
   if(key==0)
    {
       sec++;
    if(sec>59)
    {
   sec=0;
    }
    }
    else if(key==1)
    {
    min++;
    if(min>59)
    {
       min=0;
    }
    }
       else if(key==2)
    {
     hour++;
     if(hour>23)
     {
        hour=0;
     }
    }

    
   }
   else if(key==3)
   {
   TR0=1;
   }
}

 


 void main()
 {
  uchar a;
 
 system_Ini();//函数调用,初始化
 while(1)
 {
 a=keyscan();
 contral(a);
 display();
 }


 }


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义