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

📄 main.c

📁 用epson时钟芯片rx8025设计的正在生产电子钟程序.
💻 C
字号:
//******************************************************
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */

//extern byte dispflg;

void MCU_init(void); /* Device initialization function declaration */
//*********************
void KeyProcess(void);
void ConvertSeg(void);
void disp(void);
void ShiftOut(byte disp_temp); 

void start(void);
void stop(void);
void sendbyte(byte date);
uchar IICreceivebyte(); 

uchar readtime(void);
uchar rx8025int(void);
void I2c_ack(void);
void I2c_noack(void); 
//*********************
byte hour,minute;

byte flash=0;
byte flashFlg;
byte disp_count=0;
byte dispflg=0;
word Tcount=0; 

byte led_HH;
byte led_HL;
byte led_MH;
byte led_ML;
byte led_DP;

word ad_value;

byte errbit=0;
byte errtime=0; 
byte ackbit;
//**********************
#define I5    PTB_PTB5
#define I4    PTA_PTA4
#define I3    PTA_PTA5
#define I2    PTB_PTB6
#define I1    PTB_PTB7

#define SIN   PTB_PTB4
#define CLK   PTB_PTB3
#define STR   PTA_PTA3
 
#define pmsda DDRB_DDRB0 //数据传输方向
#define sda PTB_PTB0 //数据
#define scl PTB_PTB1 //时钟
//*************************
#define nop_6us() asm(nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;)  

#define SEG_A 0x01
#define SEG_B	0x02
#define SEG_C	0x04
#define SEG_D	0x08
#define SEG_E	0x10
#define SEG_F	0x20
#define SEG_G	0x40

const byte Table[16] =
{
    	SEG_A+SEG_B+SEG_C+SEG_D+SEG_E+SEG_F,		    //'0'
			SEG_B+SEG_C,					                      //'1'
			SEG_A+SEG_B+SEG_G+SEG_E+SEG_D,			        //'2'
			SEG_A+SEG_B+SEG_C+SEG_D+SEG_G,			        //'3'
			SEG_F+SEG_G+SEG_B+SEG_C,				            //'4'
			SEG_A+SEG_F+SEG_G+SEG_C+SEG_D,			        //'5'
			SEG_A+SEG_F+SEG_G+SEG_C+SEG_D+SEG_E,		    //'6'
			SEG_A+SEG_B+SEG_C,				                  //'7'
			SEG_A+SEG_B+SEG_C+SEG_D+SEG_E+SEG_F+SEG_G,	//'8'
			SEG_A+SEG_B+SEG_C+SEG_D+SEG_F+SEG_G,		    //'9'
			SEG_A+SEG_B+SEG_C+SEG_E+SEG_F+SEG_G,		    //'A'
			SEG_C+SEG_D+SEG_E+SEG_F+SEG_G,			        //'b'
			SEG_A+SEG_D+SEG_E+SEG_F,				            //'C'
			SEG_B+SEG_C+SEG_D+SEG_E+SEG_G,			        //'d'
			SEG_A+SEG_D+SEG_E+SEG_F+SEG_G,			        //'E'
			SEG_A+SEG_E+SEG_F+SEG_G				              //'F'
} ;
//******************************************************
void main(void) 
{
      word i,j;
       
      MCU_init(); /* call Device Initialization */    
       
      I5=I4=I3=I2=I1=1;
            
      COPCTL = 0xFF;
        
      for(j=0;j<250;j++)
      {    
        COPCTL = 0xFF;
        for(i=0;i<0x5ff;i++);                              
      }      
            
      errbit=rx8025int();
      if(!errbit) errtime++;      
            
      errbit=readtime();
      if(!errbit) errtime++;            
//**********************  
  for(;;)
  {      
    COPCTL = 0xFF;
    if(Tcount>=150) 
    {                           
      Tcount=0;
      errbit=readtime();
      if(!errbit) errtime++;       
      KeyProcess();            
    }
    disp();
  }    
}
//***********************
void KeyProcess(void) 
{ 
 byte i,j;
 
 ADSCR = 0x01;               
 while(!ADSCR_COCO);
 ad_value = ADRL;
 
 ADSCR = 0x01;               
 while(!ADSCR_COCO);
 ad_value = ADRL; 
    
 if (ad_value<15) //<0.3v(0)
 {   
        if(hour==23)hour=0;  
        else hour ++;
        
        for(j=0;j<100;j++);
        i=((hour/10)<<4)+(hour%10);
        start();     
        sendbyte(0x64);      
        sendbyte(0x20);       
        sendbyte(i);                    
        stop();       
 } 
 else if (ad_value<180 && ad_value>60) //2.4v(120)
 {                
        if(minute==59)minute=0;  
        else minute ++;     
           
        for(j=0;j<100;j++);
        i=((minute/10)<<4)+(minute%10);  
        start();      
        sendbyte(0x64);            
        sendbyte(0x00);//秒地址
        sendbyte(0x00);//秒清零            
        sendbyte(i);//分                
        stop();        
 } 
  
}
//*****************************************************
void ConvertSeg(void)
{
  byte i; 
  
  i=hour%10; 
  led_HL=Table[i&0x0f];
  i=hour/10;
  
  if (i==0) 
  {
   led_HH=0x00;
  }
  else led_HH=Table[i&0x0f];
  
  i=minute%10; 
  led_ML=Table[i&0x0f];
  i=minute/10;
  led_MH=Table[i&0x0f];
  
  if(flashFlg)
     led_DP = 0x01;
  else
     led_DP = 0x00;
}
//****************************************************
void disp(void)
{     
  COPCTL = 0xFF;                       /* Clear WatchDog counter */
  
  if(dispflg)
  {    
    dispflg = 0;     
    
    Tcount++;   
    
    flash++;
    if(flash>=250)       //秒闪
    {
    flash=0;    
    flashFlg = ~flashFlg;
    }    
    
    if(errbit) ConvertSeg();
    
    if(errtime>=5)
    {
     led_DP=0x00;
     led_HH=0x7F;
     led_HL=0x3F;
     led_MH=0x5B;
     led_ML=0x6D;    
    }
     
    disp_count++;  
    I5=I4=I3=I2=I1=1;   
        
    switch (disp_count)
    {
      case 0x01:ShiftOut(led_DP);
                I5=0;                        
                break;              
      case 0x02:ShiftOut(led_HH);              
                I4=0;                                        
                break;             
      case 0x03:ShiftOut(led_HL);
                I3=0;                                                         
                break;              
      case 0x04:ShiftOut(led_MH);
                I2=0;                                                                        
                break;              
      case 0x05:ShiftOut(led_ML);
                I1=0;
                disp_count = 0;                                                                           
                break;  
      default: 
                break;        
    }
  }
}
//******************************************************
void ShiftOut(disp_temp)
{
  byte i;      
    for (i=0;i<8;i++)
    { 
      CLK = 0;
      if((disp_temp&0x80)==0x80)
      {
        SIN=0;
      }
      else
        SIN=1;
      
      disp_temp=disp_temp<<1;
      CLK = 1;                
    }  
STR = 0;
STR = 1; 
}
/////////////////////////////////////////////////
uchar readtime(void) 
{     byte i,j;
  
      for(i=0;i<100;i++); 
      
      start();      
      sendbyte(0x64);
      if(ackbit!=0x55) return(0);            
      sendbyte(0x10);
      if(ackbit!=0x55) return(0);
      start();//restart
      sendbyte(0x65);//
      if(ackbit!=0x55) return(0);
                 
      i=IICreceivebyte();
      I2c_ack();     
      j=IICreceivebyte();
      I2c_noack();
      stop();
      
      minute=(i&0x0f)+((i>>4)*10); //分钟bcd  
      hour=(j&0x0f)+((j>>4)*10); //小时bcd转换     
      
      errtime=0;
      return(1);          
}
///////////////////////////////////////////
uchar rx8025int(void) 
{
      byte i,j;
      start(); 
      sendbyte(0x64);//
      if(ackbit!=0x55) return(0);
      sendbyte(0xF0);
      if(ackbit!=0x55) return(0);
      start();//restart
      sendbyte(0x65);//
      if(ackbit!=0x55) return(0);
      
      i=IICreceivebyte();   //读上电位
      I2c_noack();
      stop();          
      
      if(i&0x10)      
      {
      for(j=0;j<100;j++); 
      start(); 
      sendbyte(0x64);//
      if(ackbit!=0x55) return(0);
      sendbyte(0x00); //秒地址
      if(ackbit!=0x55) return(0);
      sendbyte(0x00); //秒清零
      if(ackbit!=0x55) return(0);      
     
      sendbyte(0x00); //分清零
      if(ackbit!=0x55) return(0);      
      
      sendbyte(0x12); //时清零
      if(ackbit!=0x55) return(0);
      stop();
      
      for(j=0;j<100;j++);
      
      start(); 
      sendbyte(0x64);//
      if(ackbit!=0x55) return(0);
      sendbyte(0xF0); //ctrl2地址
      if(ackbit!=0x55) return(0);
      sendbyte(0x00); //PON 清零
      if(ackbit!=0x55) return(0);      
     
      stop();             
      }
      
      for(j=0;j<100;j++);
      
      start();     
      sendbyte(0x64);//
      if(ackbit!=0x55) return(0);
      sendbyte(0xE0);
      if(ackbit!=0x55) return(0);      
      sendbyte(0x20);
      if(ackbit!=0x55) return(0);            
      stop();
      
      errtime=0;
      return(1);      
}
///////////////////////////////////////////
void start(void)//读写数据启动函数
{
pmsda=1; 
sda=1; // 数据 
scl=1; // 时钟
nop_6us();
sda=0;
nop_6us();
scl=0;
}
//////////////////////////////////////////
void stop(void)//读写数据停止函数
{
pmsda=1; 
sda=0; // 数据
nop_6us();
scl=1; // 时钟
nop_6us(); 
sda=1; 
nop_6us(); 
}
//*****************************************
void sendbyte(byte date)// 发送数据的函数
{
byte i; 
pmsda=1;
COPCTL = 0xFF;                       /* Clear WatchDog counter */ 

for(i=0;i<8;i++) 
{ 
if(date&0x80) sda=1; //判断数据的最高位,为1 sda=1;数据
else sda=0; //否则 sda=0
asm (nop;nop;nop;nop;nop);
scl=1;
nop_6us();
scl=0;
date=date<<1; //数据左移一位 
}
pmsda=0;
nop_6us();
scl=1;
asm (nop;nop;nop); //1us
ackbit=0;
if(sda==0)ackbit=0x55; 
scl=0; // scl=0; PTD_PTD4=0 时钟 
}
//*******************************************
uchar IICreceivebyte()//读数据的函数
{
byte i=8,receivebyte=0;
COPCTL = 0xFF;                       /* Clear WatchDog counter */

pmsda=0;
while(i--) 
{
scl=1;
asm (nop;nop;nop;nop;nop;nop); //2us
receivebyte=(receivebyte<<1)|sda; //receivebyte左移一位与sda相或,
scl=0;
asm (nop;nop;nop); //1us 
}  
return(receivebyte);
 
}
///////////////////////////////
void I2c_ack(void) 
{
pmsda=1; 
sda=0; // 数据
asm (nop;nop;nop;nop;nop;nop); //2us
scl=1;
nop_6us(); //5us
scl=0;
asm (nop;nop;nop;nop;nop;nop); //2us
}
///////////////////////////////
void I2c_noack(void) 
{
pmsda=1; 
sda=1; // 数据
asm (nop;nop;nop;nop;nop;nop); //2us
scl=1;
nop_6us(); //5us
scl=0;
asm (nop;nop;nop;nop;nop;nop); //2us
}
    

⌨️ 快捷键说明

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