单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 140|回复: 3
收起左侧

捡了一个倒计时单片机板子没事仿了一下他的程序

[复制链接]
天涯无芳 发表于 2019-5-12 22:35 来自手机 | 显示全部楼层 |阅读模式
捡了一个单片机电路板,双倒计时可设置的,带存储,一看stc的单片机,没事仿一个,不是很专业,具体功能是有了,按键这一块处理感觉有点难,感觉挺复杂的,挂上给初学者看看。高手可以略过了。或者指点一下也行
#include "STC8fxx.H"                         //此文件中定义了单片机的一些特殊功能寄存器
#include "intrins.H"
#include "delay.H"
#include "DigDisplay.H"
#include "EEPROM.H"
#include "key.H"
#include "Timer0.H"

#define uint unsigned int               //对数据类型进行声明定义
#define uchar unsigned char           //对数据类型进行声明定义

/*****************************************
* 定义全局变量
**************************************/

uchar code smgduan[12]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f,0x77,0x7c};
uchar temp1,temp2,temp3,temp4;
uchar DisplayData[4];
uchar a,b;
uint hs;
bit s=0,k=0;        

/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{
uchar q;
out=1;

Delay_ms(500);
temp1=IapRead(0x0400);//读取eeprom数据
Delay_ms(5);
temp2=IapRead(0x0401);
Delay_ms(5);
temp3=IapRead(0x0500);
Delay_ms(5);                           
temp4=IapRead(0x0501);
Delay_ms(5);                           

while(k5==0&&k==0)        //模式1
  {
   a=temp1;          //将读取的数据赋值
   b=temp2;
   s=1;
   Timer0();

   while(s)
   {
    DigDisplay();
    datapros();

    if(k1==0)
      {
           DigDisplay();
           DigDisplay();
           if(k1==0)
            {
             k=1;
             TR0=0;
             break;
            }
      }
          if(k5==1)break;
    }
  }
while(k5==1&&k==0)
  {
   a=temp3;
   b=temp4;
   s=1;
   Timer0();

   while(s)
   {
    DigDisplay();
    datapros();

    if(k1==0)
     {
      Delay_ms(2000);
          if(k1==0)
           {
            k=1;
            TR0=0;
            break;
           }
     }
         if(k5==0)break;
    }
  }
  
while(k==1)
  {
    uchar keya=KeyScan();
        out=1;

        DigDisplay();

    if(k1==0)
         {
          Delay_ms(20);
          if(k1==0)
           {
           while(!k1)DigDisplay();
                q=q+1;
                if(q>4)q=0;
           }
         }
   switch(q)
          {                        
            case 0:    break;
            case 1:
                                           DisplayData[0]=0x77;
                       DisplayData[1]=smgduan[1];
                           DisplayData[2]=smgduan[temp1/10];
                           DisplayData[3]=smgduan[temp1%10];
                      switch(keya)
                      {         
                           //case 1:  keynum++;if(keynum==100)keynum=0; break;
                             case 2:  if(temp1>0)temp1--; break;
                             case 3:  if(temp1<99)temp1++;else if(temp1>=99)temp1=99; break;
                            // case 0:   break;
                      }        
                                       break;
            case 2:
                                           DisplayData[0]=0x77;
                       DisplayData[1]=smgduan[2];
                           DisplayData[2]=smgduan[temp2/10];
                           DisplayData[3]=smgduan[temp2%10];
                      switch(keya)
                      {
                           //case 1:  keynum++;if(keynum==100)keynum=0; break;
                             case 2:  if(temp2>0)temp2--; break;
                             case 3:  if(temp2<99)temp2++;else if(temp2>=99)temp2=99; break;
                           //case 4:   break;
                      }        
                                   break;

            case 3:
                                           DisplayData[0]=0x7c;
                       DisplayData[1]=smgduan[1];
                           DisplayData[2]=smgduan[temp3/10];
                           DisplayData[3]=smgduan[temp3%10];
                      switch(keya)
                      {
                           //case 1:  keynum++;if(keynum==100)keynum=0; break;
                             case 2:  if(temp3>0)temp3--; break;
                             case 3:  if(temp3<99)temp3++;else if(temp3>=99)temp3=99; break;
                           //case 4:   break;
                      }
                                           break;
            case 4:
                                           DisplayData[0]=0x7c;
                       DisplayData[1]=smgduan[2];
                           DisplayData[2]=smgduan[temp4/10];
                           DisplayData[3]=smgduan[temp4%10];
                      switch(keya)
                      {
                           //case 1:  keynum++;if(keynum==100)keynum=0; break;
                             case 2:  if(temp4>0)temp4--; break;
                             case 3:  if(temp4<99)temp4++;else if(temp4>=99)temp4=99; break;
                           //case 4:   break;
                      }        
                                           break;
                 }
                if(k4==0)
                {
                Delay_ms(20);
                 if(k4==0)
                 {
                  while(!k4);
                  IapErase(0x400);
                  Delay_ms(50);
                  IapErase(0x500);
                  Delay_ms(50);
                  IapProgram(0x400, temp1);
                  Delay_ms(50);
                  IapProgram(0x401, temp2);
                  Delay_ms(50);
                  IapProgram(0x500, temp3);
                  Delay_ms(50);
                  IapProgram(0x501, temp4);
                  Delay_ms(50);
                  k=0;

                 }
                 }

  }
  }
/*******************************************************************************
* 函 数 名         : 定时器0中断函数
* 函数功能                   :
***********************************************************************************************************
* 函 数 名         : 定时器0中断函数
* 函数功能                   :
*******************************************************************************/
void Timer0Init() interrupt 1
{        
        TH0=0X0FE;        //给定时器赋初值,定时1ms
        TL0=0X0C;
        hs++;
    if(hs==1000)
          {
           if(out==1)
                 {
              a--;
                  hs=0;
                  if(a==0)out=0;
                 }
                else if(out==0)
                  {
                   b--;
                   hs=0;
               if(b==0)
                 {
                  out=1;
                  s=0;
                  TR0=0;
                 }
                   }
      }
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

 楼主| 天涯无芳 发表于 2019-5-12 22:36 来自手机 | 显示全部楼层
不会发附件啊
回复

使用道具 举报

51hei团团 发表于 2019-5-15 01:58 | 显示全部楼层
点高级模式里面有个附件上传的图标
回复

使用道具 举报

bhjyqjs 发表于 2019-5-16 14:57 | 显示全部楼层
挺好的,希望程序适当的写点注释!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛5群 联系QQ:125739409;技术交流QQ群174280738

Powered by 单片机教程网

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