📄 main.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 + -