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

📄 shiz.c

📁 本时钟采用8吋笔段式LED高亮度数码管组装而成
💻 C
📖 第 1 页 / 共 2 页
字号:
 uchar show[6];
 uchar key;
 bit ff;
 uchar jm,*pt,i;
 uchar flag = 1;
 bit nflag,pflag;
 pt = M41T0_Receive();
 for(i = 0;i < 8;i++)day[i] = *(pt+i);
 c_flash = 1;m_flash = 0;s_flash = 0;
 while(1)
      {if(c_flash){if(nflag){switch(day[2]&0x3f)
								    {case 0: day[2] = 35;break;
								     case 16:day[2] = 9;break;
									 case 32:day[2] = 25;break;
									 default:day[2] = day[2] - 1;break;
							         }
                              nflag = 0;
                            }
                   if(pflag){switch(day[2]&0x3f)
								    {case 9: day[2] = 16;break;
					                 case 25:day[2] = 32;break;
									 case 35:day[2] = 0;break;
									 default:day[2] = day[2] + 1;break;
									}
                              pflag = 0;
                            }
				   if(day[2]>35)day[2] = 0;  //防止超阈值数据
                  }          //时
        if(m_flash){if(nflag){switch(day[1]&0x7f)
							     {case 0: day[1] = 89;break;
					              case 16:day[1] = 9;break;
							      case 32:day[1] = 25;break;
							      case 48:day[1] = 41;break;
						          case 64:day[1] = 57;break;
							      case 80:day[1] = 73;break;
							      default:day[1] = day[1] - 1;break;
							     }
                               nflag = 0;
                              }
                    if(pflag){switch(day[1]&0x7f)
								 {case 9: day[1] = 16;break;
								  case 25:day[1] = 32;break;
								  case 41:day[1] = 48;break;
								  case 57:day[1] = 64;break;
								  case 73:day[1] = 80;break;
								  case 89:day[1] = 0;break;
								  default:day[1] = day[1] + 1;break;
								 }
                                pflag = 0;
                               }
					if(day[1]>89)day[1] = 0;  //防止超阈值数据
                   }             //分
                     
         if(s_flash){if(nflag){switch(day[0]&0x7f)
							     {case 0: day[0] = 89;break;
					              case 16:day[0] = 9;break;
							      case 32:day[0] = 25;break;
							      case 48:day[0] = 41;break;
						          case 64:day[0] = 57;break;
							      case 80:day[0] = 73;break;
							      default:day[0] = day[0] - 1;break;
							     }
                               nflag = 0;
                              }
                    if(pflag){switch(day[0]&0x7f)
								 {case 9: day[0] = 16;break;
								  case 25:day[0] = 32;break;
								  case 41:day[0] = 48;break;
								  case 57:day[0] = 64;break;
								  case 73:day[0] = 80;break;
								  case 89:day[0] = 0;break;
								  default:day[0] = day[0] + 1;break;
								 }
                                pflag = 0;
                               }
					if(day[0]>89)day[0] = 0;  //防止超阈值数据
                   }                  
                            //秒
           show[0] = tab[day[0]&0x0f];             //秒个位
           show[1] = tab[(day[0]&0x70)>>4];        //秒十位
           show[2] = tab[day[1]&0x0f];             //分个位
           show[3] = tab[(day[1]&0x70)>>4];        //分十位
           show[4] = tab[day[2]&0x0f];             //时个位
           show[5] = tab[(day[2]&0x30)>>4];        //时十位

		   if(c_flash)
               {if(ff){show[4] = 0x7f;
                       show[5] = 0xff;
                       if(jm++ > 15){ff = 0;jm = 0;}
                      }
	            else if(jm++ > 60){ff = 1; jm = 0;}      //闪烁频率
               }
           if(m_flash)
               {if(ff){show[2] = 0x7f;
                       show[3] = 0xff;
                       if(jm++ > 15){ff = 0;jm = 0;}
                      }
	            else if(jm++ > 60){ff = 1; jm = 0;}      //闪烁频率
               }
           if(s_flash)
               {if(ff){show[0] = 0xff;
                       show[1] = 0xff;
                       if(jm++ > 15){ff = 0;jm = 0;}
                      }
	            else if(jm++ > 60){ff = 1; jm = 0;}      //闪烁频率
               }

           display(show);
     	   key = RMT_SCAN();                      //遥控
  	       switch(key)
	           {case 4:flag = flag + 1;            //SWITCH_KEY,时段切换
                       if(flag > 3)flag = 1;
                       switch(flag){case 1:c_flash = 1;m_flash = 0;s_flash = 0;break;
                                    case 2:c_flash = 0;m_flash = 1;s_flash = 0;break;
                                    case 3:c_flash = 0;m_flash = 0;s_flash = 1;break;
                                    default:break;
                                   }
                       break;
                case 8:pflag = 1;break;            //ADJUST_KEY,数字增加
                case 2:nflag = 1;break;            //TIMER_KEY,数字减小
                case 1: M41T0_Send (day);          //CLOCK_KEY,保存退出
                        goto pre_end;
                default:break;
                }
  }                
  pre_end:
  c_flash = 0;
  m_flash = 0;
  s_flash = 0;               
}



void start(void)
{SDA=1;
 SCL=1;
 nop(1);
 SDA=0;
 nop(1);
 SCL=0;
}

void stop(void)
{SDA=0;
 SCL=1;
 nop(1);
 SDA=1;
 nop(1);
 SCL=0;
}


void ack(bit a)
{ if(a){SDA=1;
        SCL=1;
        nop(1);
        SCL=0;
        SDA=0;
        }
  else {SDA=0;
        SCL=1;
        nop(1);
        SCL=0;
        SDA=1;
       }
}
 
void wrbyt(uchar j)
{ uchar i,con;
  con = 0;
  for (i=0;i<8;i++)
  {if (j&0x80)
    {SDA=1;
	 SCL=1;
	 nop(1);
     SCL=0;
	 SDA=0;
    }
    else
    {SDA=0;
	 SCL=1;
     nop(1);
	 SCL=0;
    }
    j<<=1;
  }
  SDA=1;
  SCL=1;
  nop(1);
  if(SDA)ibflag=1;
  else   ibflag=0;
  nop(1);
  SCL=0;
}
 
uchar rdbyt(void)
{ uchar i;
  uchar dat = 0;
  for(i=0;i<8;i++)
   {SDA=1;              //输入方式
   	SCL=1;
	nop(1);
	dat<<=1;
    if(SDA) dat|=0x01;
	nop(1);
    SCL=0;
   }
  return(dat);
}


//时钟芯片写入程序
//参数:3字节数组
void M41T0_Send (uchar *p)
{uchar i;
 aa:;
 start();
 wrbyt(0xd0);
 if(ibflag){stop();goto aa;}
 wrbyt(0x00);
 if(ibflag){stop();goto aa;}
 for(i = 0;i < 8;i++)
    {wrbyt(p[i]);
     if(ibflag){stop();goto aa;}
	}
 stop();
}

 
//时钟芯片读出程序
//参数:返回3字节数组
	
uchar *M41T0_Receive (void)
{uchar pt[8];
 uchar i;
 aa:;
 start();
 wrbyt(0xd0);
 if(ibflag){stop();goto aa;}
 wrbyt(0x00);
 if(ibflag){stop();goto aa;}
 ab:;
 start();
 wrbyt(0xd1);
 if(ibflag){stop();goto ab;}
 for(i=0;i<7;i++)
  {pt[i]=rdbyt();
   ack(0);
  }
 pt[7]=rdbyt();
 ack(1);
 stop();
 return(pt); 
}




⌨️ 快捷键说明

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