⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 定时打铃控制器
💻 C
字号:
#include "stm8s.h"
#include "1302.h"
#include "1638.h"
#define uchar unsigned char
#define uint  unsigned int

#define LED1_0 GPIO_WriteHigh(GPIOB, GPIO_PIN_6)//PB6
#define LED1_1 GPIO_WriteLow(GPIOB, GPIO_PIN_6)

uchar LED[]  ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0,1,2,3,4,5,6,7,8,9,-
uchar h0=0x00,m0=0x00,s0=0x00;
uchar   a=0,aa=0,q1=0,q2=0,q3=0,q4=0,i,b=0,g=0,v=0,k,t=0,z=0;

void delay_ring()
{
    uint i;
    i=30000;
    while(i--); 
}
uchar Read_Key()     //读按键、、、、、、
{
        uchar i,c[4];
        for(i=0;i<4;i++)   //初始键值均为0
        {
          c[i]=0;
        }
        STB_0;
        TM1638_Write(0x42);
        
        for(i=0;i<4;i++)
        {
          c[i]=TM1638_Read(); 
        }
        STB_1;
        for(i=0;i<4;i++)
        {
          if(c[i]!=0)
            return(i*8+c[i]);
         }
        return 0;
}
void adjust_time()
{
        Write_DATA(0x00,LED[h/16]);  //小时
        Write_DATA(0x02,LED[h%16]); 
        Write_DATA(0x04,LED[10]); 
        Write_DATA(0x06,LED[m/16]);  //分钟
        Write_DATA(0x08,LED[m%16]); 
        Write_DATA(0x0a,LED[10]);
        Write_DATA(0x0c,LED[s/16]);  //秒
        Write_DATA(0x0e,LED[s%16]);
}
void adjust_ring()
{
        Write_DATA(0x00,LED[h0/16]);  //小时
        Write_DATA(0x02,LED[h0%16]); 
        Write_DATA(0x04,LED[10]); 
        Write_DATA(0x06,LED[m0/16]);  //分钟
        Write_DATA(0x08,LED[m0%16]); 
        Write_DATA(0x0a,LED[10]);
        Write_DATA(0x0c,LED[10]);  //秒
        Write_DATA(0x0e,LED[10]);
}
void adjust_date()
{
        Write_DATA(0x00,LED[2]);  //年
        Write_DATA(0x02,LED[0]); 
        Write_DATA(0x04,LED[n/16]); 
        Write_DATA(0x06,LED[n%16]); 
        Write_DATA(0x08,LED[y/16]);  //月
        Write_DATA(0x0a,LED[y%16]);
        Write_DATA(0x0c,LED[r/16]);  //日
        Write_DATA(0x0e,LED[r%16]);
}
void show_time()//显示时间时、分、秒
{
        Write_DATA(0x00,LED[READTIME[4]]);  //小时
        Write_DATA(0x02,LED[READTIME[5]]); 
        Write_DATA(0x04,LED[10]); 
        Write_DATA(0x06,LED[READTIME[2]]);  //分钟
        Write_DATA(0x08,LED[READTIME[3]]); 
        Write_DATA(0x0a,LED[10]);
        Write_DATA(0x0c,LED[READTIME[0]]);  //秒
        Write_DATA(0x0e,LED[READTIME[1]]); 
}
void  show_date()//显示时间年、月、日
{
        Write_DATA(0x00,LED[2]);  //年
        Write_DATA(0x02,LED[0]); 
        Write_DATA(0x04,LED[READTIME[12]]); 
        Write_DATA(0x06,LED[READTIME[13]]); 
        Write_DATA(0x08,LED[READTIME[8]]);  //月
        Write_DATA(0x0a,LED[READTIME[9]]);
        Write_DATA(0x0c,LED[READTIME[6]]);  //日
        Write_DATA(0x0e,LED[READTIME[7]]); 
}
void stop()//熄灭所有灯
{
        for(i=0;i<8;i++)
        Write_DATA(2*i+1,0x00);
}
void Key_program(uchar n)
{ 
     switch(n)
             {
             case 1:while(Read_Key());//切换1:时间/定时 与 日期
                      if(a==0)
                          {
                                g=1;q1=1;a=1;
                                Write_DATA(1,1);
                                Write_DATA(7,0);
                                break;
                          }
                      if(a==1)
                          {
                                g=2;q1=2;a=0;
                                Write_DATA(1,0);
                                Write_DATA(7,0);
                                break;
                          }
             case 9:while(Read_Key());//切换2:.......................
                      if(q2==1)
                          {
                               q2=0;
                               Write_DATA(3,1);
                               Write_DATA(7,0);
                               break;
                          }
                      if(q2==0)
                          {
                               q2=1;
                               Write_DATA(3,0);
                               Write_DATA(7,0);
                               break;
                          }
                       break;
              case 17:while(Read_Key());
                      if(q1==1)
                      {
                        if(q2==0)//时间-时++
                        {
                          h++;
                              if(h==0x0a)
                                h=0x10;
                              if(h==0x1a)
                                h=0x20;
                              if(h==0x24)
                                h=0x00;
                              adjust_time();
                        }
                        else if(q2==1)//时间-分++
                        {
                          m++;
                              if(m==0x0a)
                                m=0x10;
                              if(m==0x1a)
                                m=0x20;
                              if(m==0x2a)
                                m=0x30;
                              if(m==0x3a)
                                m=0x40;
                              if(m==0x4a)
                                m=0x50;
                              if(m==0x5a)
                                m=0x00;
                              adjust_time();
                        }
                      }
                      else if(q1==2)
                      {
                        if(q2==0)//定时-时++
                        {
                          h0++;
                              if(h0==0x0a)
                                h0=0x10;
                              if(h0==0x1a)
                                h0=0x20;
                              if(h0==0x24)
                                h0=0x00;
                                adjust_ring();
                        }
                        else if(q2==1)//定时-分++
                        {
                          m0++;
                              if(m0==0x0a)
                                m0=0x10;
                              if(m0==0x1a)
                                m0=0x20;
                              if(m0==0x2a)
                                m0=0x30;
                              if(m0==0x3a)
                                m0=0x40;
                              if(m0==0x4a)
                                m0=0x50;
                              if(m0==0x5a)
                                m0=0x00;
                              adjust_ring();
                        }
                      }
                      Write_DATA(7,0);
                      break;
              case 25:while(Read_Key());              //调节 月日 
                        if(aa==0)
                          {
                                g=3;q3=1;aa=1;
                                Write_DATA(7,1);
                                break;
                          }
                        if(aa==1)
                          {
                                g=3;q3=1;aa=0;
                                break;
                          }
              case 16:while(Read_Key());               //切换4: 月 与 日
                         if(q4==1)
                          {
                               g=3;q4=0;
                               Write_DATA(9,1);
                               break;
                          }
                        if(q4==0)
                          {
                               g=3;q4=1;
                               Write_DATA(9,0);
                               break;
                          }
                         Write_DATA(7,1);
                      break;
              case 24:while(Read_Key());//调节日期
                      if(q3)
                      {
                        if(q4==0)//月++
                        {
                          y++;
                          if(y==0x13)
                            y=0x01;
                          if(y==0x0a)
                            y=0x10;
                          
                          adjust_date();
                        }
                        else if(q4==1)//日++
                        {
                          r++;
                          if(r==0x31)
                            r=0x01;
                          if(r==0x0a)
                            r=0x10;
                          if(r==0x1a)
                            r=0x20;
                          if(r==0x2a)
                            r=0x30;
                          adjust_date();
                        }
                      }
                       Write_DATA(7,1);
                      break;
              case 32:while(Read_Key());while(Read_Key());stop();Write_DATA(13,1); Write_DATA(7,0);//开始启动并显示日期
                      SETtime1302();b=1;g=4;z=1;
                      break;
              case 40:while(Read_Key());while(Read_Key());stop();Write_DATA(15,1);Write_DATA(7,0);//开始启动并显示时间
                      SETtime1302();b=1;g=5;z=1;
                      break;
              default:break;
             }
}
/******定时打铃******/
void ring() //READTIME[2],READTIME[3]十分,分;;READTIME[4],READTIME[5]十时,时;;READTIME[0],READTIME[1]十秒 秒
{  
        t=0;
         if(READTIME[4]==h0/16&&READTIME[5]==h0%16&&READTIME[2]==m0/16&&READTIME[3]==m0%16&&READTIME[0]==s0/16&&z==1) 
         { 
           t=1;
           if(READTIME[1]>9)
            t=0;
         } //响10秒钟
        if(t==1)
        {  
          LED1_1;
          delay_ring();
         LED1_0;
          delay_ring();
        }
}
void main()
{
      CLK_HSICmd(ENABLE);//启用内部高速振荡器(HSI 16MHz)
      CLK_HSIPrescalerConfig(CLK_PRESCALER_CPUDIV16);//配置内部高速振荡器(HSI)的分频器,CPU时钟 16 分频  
      GPIO_DeInit(GPIOB);//使能PB口
      GPIO_Init(GPIOB, GPIO_PIN_2 , GPIO_MODE_OUT_PP_HIGH_FAST);//初始化PB0,PB1,PB2 
      GPIO_Init(GPIOB, GPIO_PIN_1 , GPIO_MODE_OUT_PP_HIGH_FAST);
      GPIO_Init(GPIOB, GPIO_PIN_0 , GPIO_MODE_OUT_PP_HIGH_FAST);
      GPIO_Init(GPIOB, GPIO_PIN_3 , GPIO_MODE_OUT_PP_HIGH_FAST);//初始化PB3,PB4,PB5 
      GPIO_Init(GPIOB, GPIO_PIN_4 , GPIO_MODE_OUT_PP_HIGH_FAST);
      GPIO_Init(GPIOB, GPIO_PIN_5 , GPIO_MODE_OUT_PP_HIGH_FAST);
      GPIO_Init(GPIOB, GPIO_PIN_6 , GPIO_MODE_OUT_PP_HIGH_FAST);//初始化PB6
      
      init_TM1638();
     
      while(1)
        { k=Read_Key(); 
          if(k!=0)//当读取的键值不为0时,执行相应键值程序
          Key_program(k);   
         
          if(g==1)
          {
           adjust_time(); 
          }
          else if(g==2)
          {
           adjust_ring();
          }
          else if(g==3)
          {
           adjust_date();
          }
          else if(g==4)
            show_date();
          else if(g==5)
            show_time();
          if (b==1)
          {
        READtime1302();
           ring();
        }
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -