搜索
bottom↓
回复: 6

可调时钟8位共阳极数码管显示

[复制链接]

出0入0汤圆

发表于 2012-12-27 19:47:36 | 显示全部楼层 |阅读模式
/***************************************************************************************************************************************
自学一段时间了,这个可调时钟也看了好久,总算自己写出来了一个,只是按自己的想法写的,算法还不简洁,各位提出宝贵意见



******************************************************************************************************************************************/   



                   /*********************************************************************
                    *                   8位共阳极数码管可调时钟显示                      *
            *              KEY_1键选择数码管,选中数码管开始闪烁                         *
            *              KEY_2键对选中数码管做加1处理                                         *
            *              KEY_3键对选中数码管做减1处理                                         *
            *              KEY_4键取消闪烁,正常显示                                         *
            *********************************************************************/                                                                                         


#include<reg52.h>
#include"keyscan.h"
#include"display.h"
int temp;
unsigned char num1,LASTkey,KeyValue;
unsigned long int num2;

void timerinit()                          //中断函数初始化
{
   TMOD=0x01;
   EA=1;
   ET0=1;
   TR0=1;
   TH0=(65536-10000)/256;
   TL0=(65536-10000)%256;
}

main()
{

   timerinit();

   while(1)
   {                                        //把秒数换算成小时,分钟数
                temp=num2/3600;               //时
                  shi1=temp/10;
                  shi2=temp%10;

                  temp=num2%3600;          //分
                  temp=temp/60;
                  fen1=temp/10;
                  fen2=temp%10;
               
                  temp=num2%3600%60;        //秒
                  miao1=temp/10;                 
                  miao2=temp%10;
        lastkey(&KeyValue);
                if(KeyValue==((KEY_VALUE_1)&(KEY_UP))) //按键1控制数码管闪烁位
                  {                                                
                    num++;                                             //num=0正常显示,num=1、2、3、4、5、6
                    if(num==7)                                     //分别是第1、2、4、5、7、8数码管闪烁
                    num=1;  
                  }
                                                                             
                  if(KeyValue==((KEY_VALUE_2)&(KEY_UP)))                   //按键2控制数码加数
                  {
                     
                           if(num==1)
                             {
                                num2=num2+36000;
                                   if(num2>86400)
                           num2=num2-72000;
                                }
                             if(num==2)
                             num2=num2+3600;
                             if(num==3)
                             num2=num2+600;
                             if(num==4)
                             num2=num2+60;
                             if(num==5)
                             num2=num2+10;
                             if(num==6)
                             num2=num2+1;
                             if(num2>86400)
                       num2=num2-86400;
                       
                  }
                  if(KeyValue==((KEY_VALUE_3)&(KEY_UP)))                         //按键3控制数码管减数
                  {
                     
                           if(num==1)
                             {  if(num2>36000)
                                num2=num2-36000;                  
                                }
                             if(num==2)
                             {
                               if(num2>3600)
                               num2=num2-3600;
                             }
                             if(num==3)
                             {
                               if(num2>600)
                               num2=num2-600;
                             }
                             if(num==4)
                             {
                               if(num2>60)
                               num2=num2-60;
                             }
                             if(num==5)
                             {
                               if(num2>10)
                               num2=num2-10;
                             }
                             if(num==6)
                             {
                             if(num2>1)
                             num2=num2-1;
                             }
                            
                       
                  }
                  if(KeyValue==((KEY_VALUE_4)&(KEY_UP)))                            //置num=0,使数码管正常显示
                  {
                    num=0;
                  }
    display();

  }
}
void timer_0() interrupt 1
{
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;
   num1++;
   if(num1%5==0)                //STATE控制数码管闪烁
     STATE=on;
   if(num1%10==0)
    {
    STATE=off;
    }
   if(num1==20)
   {
      num1=0;

     num2++;
       if(num2==86400)
         num2=0;
   }

}




/****************************************************************************************************************************
****************************************************************************************************************************/
/*  键盘扫描函数*/
                //独立键盘接P3口的2、3、4、5端口
#include<reg52.h>
#define KEY_VALUE_1 0xfb    //定义键值
#define KEY_VALUE_2 0xf7
#define KEY_VALUE_3 0xef
#define KEY_VALUE_4 0xdf
#define KEY_NULL 0xff

#define KEY_DOWN 0xfe             //定义按键状态
#define KEY_LONG 0xfd
#define KEY_CONTINUE 0xbf
#define KEY_UP 0x7f

#define KEY_STATE_INIT 0        //定义按键过程
#define KEY_STATE_WOBBLE 1
#define KEY_STATE_PRESS 2
#define KEY_STATE_LONG 3
#define KEY_STATE_CONTINUE 4
#define KEY_STATE_RELEASE 5

#define KEY_TICK_LONG 100          //定义LONG、CONTINUE两种状态的tick数(时间)
#define KEY_TICK_CONTINUE 20

sbit KEY_1=P3^2;                          //定义端口
sbit KEY_2=P3^3;
sbit KEY_3=P3^4;
sbit KEY_4=P3^5;

static unsigned char keyscan()          //键盘扫描
{
   if(KEY_1==0)
   return KEY_VALUE_1;

   if(KEY_2==0)
   return KEY_VALUE_2;
  
   if(KEY_3==0)
   return KEY_VALUE_3;
  
   if(KEY_4==0)
   return KEY_VALUE_4;
  
   return KEY_NULL;

}

void lastkey(unsigned char *LASTkey)
{
  static unsigned char KEY_STATE=KEY_STATE_INIT;   //定义键盘状态变量,并赋值为初始状态
  static unsigned char keytemp=KEY_NULL;                   //定义中间变量存取键值
  static unsigned char lastkey=KEY_NULL;
  static unsigned int num=0,num2;

    keytemp=keyscan();                                         //获取键值
    switch(KEY_STATE)
    {
            case KEY_STATE_INIT:
                                  if(keytemp!=KEY_NULL)
                                  KEY_STATE=KEY_STATE_WOBBLE;
                                  break;

        case KEY_STATE_WOBBLE:
                             if(keytemp!=KEY_NULL)
                             KEY_STATE=KEY_STATE_PRESS;
                                   break;
        case KEY_STATE_PRESS:  
                                   {
                                   if(keytemp!=KEY_NULL)
                                      {
                               
                                          lastkey=keytemp;
                                          keytemp&=KEY_DOWN;
                                          KEY_STATE=KEY_STATE_LONG;
                                          
                                         }
                                    else
                                    KEY_STATE=KEY_STATE_INIT;
                                    }
                                    break;
        case KEY_STATE_LONG:
                                  {
                                   if(keytemp!=KEY_NULL)
                                     {
                                    
                                     num++;
                                               if(num==KEY_TICK_LONG)
                                           {
                                          
                                             num=0;
                                             keytemp&=KEY_LONG;
                                             KEY_STATE=KEY_STATE_CONTINUE;
                                           }
                                     }
                                    else
                                    KEY_STATE=KEY_STATE_RELEASE;
                                  }
                                  break;
        case KEY_STATE_CONTINUE:
                                {
                                         if(keytemp!=KEY_NULL)
                                           {
                                           num2++;
                                                if(num2==KEY_TICK_CONTINUE)
                                                  {
                                                    num2=0;
                                                  
                                                    keytemp&=KEY_CONTINUE;
                                                  }
                                           }
                                           else
                                           KEY_STATE=KEY_STATE_RELEASE;
                                        }
                                        break;
     case KEY_STATE_RELEASE:
                            {
                                    lastkey&=KEY_UP;
                                    keytemp=lastkey;
                                    KEY_STATE=KEY_STATE_INIT;
                                    num2=0;
                                    num=0;
                                    }
                                    break;
    default:break;
    }
    *LASTkey=keytemp;
}

/********************************************************************************************
********************************************************************************************/
/*显示函数*/
#include<reg52.h>
#define on 1
#define off 0
unsigned char num=0,STATE,shi1,shi2,fen1,fen2,miao1,miao2;
unsigned char weima[]={0x01,0x02,0x04,0x08,0x010,0x20,0x40,0x80};
unsigned char duanma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

sbit duan=P2^6;
sbit wei=P2^7;
void delayms(unsigned char z)
{
   unsigned char i,j;
   for(i=z;i>0;i--)
   for(j=145;j>0;j--);
   
}

void display()
{
   wei=1;
   if((num==1)&&(STATE==off))
   {
   
   P0=0x00;
   }
   else
   P0=weima[0];
   wei=0;
   P0=0xff;
   duan=1;
   P0=duanma[shi1];
   duan=0;
   delayms(2);

   wei=1;
   if((num==2)&&(STATE==off))
   {
   P0=0x00;
   }
   else
   P0=weima[1];
   wei=0;
    P0=0xff;
   duan=1;
   P0=duanma[shi2];
   duan=0;
   delayms(2);

   wei=1;
   P0=weima[2];
   wei=0;
    P0=0xff;
   duan=1;
   P0=0xbf;
   duan=0;
   delayms(2);

   wei=1;
   if((num==3)&&(STATE==off))
   {
   P0=0x00;
   }
   else
   P0=weima[3];
   wei=0;
    P0=0xff;
   duan=1;
   P0=duanma[fen1];
   duan=0;
   delayms(2);

   wei=1;
   if((num==4)&&(STATE==off))
   {
   
   P0=0x00;
   }
   else
   P0=weima[4];
   wei=0;
    P0=0xff;
   duan=1;
   P0=duanma[fen2];
   duan=0;
   delayms(2);

   wei=1;
   P0=weima[5];
   wei=0;
    P0=0xff;
   duan=1;
   P0=0xbf;
   duan=0;
   delayms(2);

   wei=1;
   if((num==5)&&(STATE==off))
   {
   P0=0x00;
   }
   else
   P0=weima[6];
   wei=0;
   duan=1;
   P0=duanma[miao1];
   duan=0;
   delayms(2);

   wei=1;
   if((num==6)&&(STATE==off))
   {
   P0=0x00;
   }
   else
   P0=weima[7];
   wei=0;
    P0=0xff;
   duan=1;
   P0=duanma[miao2];
   duan=0;
   delayms(2);
}


/************************************************************************
*************************************************************************/
/*头文件keyscan.h*/


#ifndef _KEYSCAN_H
#define _KEYSCAN_H
#define KEY_VALUE_1 0xfb
#define KEY_VALUE_2 0xf7
#define KEY_VALUE_3 0xef
#define KEY_VALUE_4 0xdf
#define KEY_NULL 0xff

#define KEY_DOWN 0xfe
#define KEY_LONG 0xfd
#define KEY_CONTINUE 0xbf
#define KEY_UP 0x7f
sbit KEY_1=P3^2;
sbit KEY_2=P3^3;
sbit KEY_3=P3^4;
sbit KEY_4=P3^5;
extern void lastkey(unsigned char *LASTkey);

#endif
/*头文件display.h*/
#ifndef _DISPLAY_H
#define _DISPLAY_H
#define on 1
#define off 0
extern void display();
extern unsigned char num,STATE,shi1,shi2,fen1,fen2,miao1,miao2;
#endif

本帖子中包含更多资源

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

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2012-12-28 09:53:40 | 显示全部楼层
楼主,能单独讲讲你的按键程序吗?

出0入0汤圆

发表于 2012-12-28 10:32:26 | 显示全部楼层
这个误差恐怕不小,建议楼主的定时器用自动重装的模式

出0入0汤圆

 楼主| 发表于 2012-12-29 11:24:53 | 显示全部楼层
lmt50211 发表于 2012-12-28 09:53
楼主,能单独讲讲你的按键程序吗?

这个我是在这个帖子里面看到的。。。。。。你可以先看看吧,有什么问题再交流

出0入0汤圆

 楼主| 发表于 2012-12-29 11:25:08 | 显示全部楼层
zcs独裁者 发表于 2012-12-29 11:24
这个我是在这个帖子里面看到的。。。。。。你可以先看看吧,有什么问题再交流 ...

http://www.amobbs.com/thread-3985870-1-1.html

出0入0汤圆

 楼主| 发表于 2012-12-29 11:25:31 | 显示全部楼层
lmt50211 发表于 2012-12-28 09:53
楼主,能单独讲讲你的按键程序吗?

http://www.amobbs.com/thread-3985870-1-1.html

出0入0汤圆

 楼主| 发表于 2012-12-29 11:26:38 | 显示全部楼层
lcw_swust 发表于 2012-12-28 10:32
这个误差恐怕不小,建议楼主的定时器用自动重装的模式

哦   谢谢指教   再去学习学习。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 11:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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