?? main.c
字號(hào):
//-------------------------------------------------------------------------*
//工程名:IIC.prj *
//硬件連接: *
// (1) MCU的串口與PC方的COM相連(參見"SCI.c"文件) *
// (2) MCU的IIC接口與時(shí)鐘芯片的IIC接口相連(參見"IIC.c"文件) *
//功能說明:MCU與時(shí)鐘芯片PCF8563通過IIC總線通信,MCU從PCF8563獲得時(shí)間,并通過 *
// 串口發(fā)給PC.該程序可以與相由VB編寫的配套的顯示程序一起使用 *
//-------------------------------------------------------------------------*
//總頭文件
#include "Includes.h" //頭文件(具體型號(hào)在頭文件的第一行)
INT8U ReBuf[17]; //存放從PC接收的從秒到年的ASCII碼(首字節(jié):幀頭)
INT8U Flag = 0; //接收正確幀標(biāo)志
//主函數(shù)
int main(void)
{
INT8U i,k; //(1) 循環(huán)控制變量
INT8U Sec = 0xff; //(2) 記錄秒值
//(3) 初始寫入PCF8563寄存器的值:CSR1,2, 秒, 分鐘,小時(shí),天, 星期,月,
INT8U WriteData[15] = {0x00,0x00,0x00,0x00,0x14,0x01,0x01,0x06,
// 年, 分鐘報(bào)警,小時(shí)報(bào)警,日期報(bào)警,周報(bào)警,
0x07,0x80, 0x80, 0x80, 0x80,
// CLKOUT頻率,定時(shí)器控制
0x00, 0x00};
INT8U ReadData[7]; //(3) 依次存放秒,分,小時(shí),日,星期,月,年數(shù)值的BCD碼
INT8U SendBuf[17]; //(4) 存放要發(fā)送的從秒到年的ASCII碼(首字節(jié):幀頭)
//(1)關(guān)總中斷
DISABLE_INTERRUPTS;
//(2)芯片初始化
MCUInit();
//(3)模塊初始化
SCIInit(); //(1) 串行口初始化(波特率:9600,查詢方式)
IICInit(); //(2) IIC通信初始化(IIC波特率 = 62.5KHz)
while (IICwriteN(0xA2, 0x00, WriteData, 15));//(3) 初始化時(shí)鐘芯片PCF8563
//初始時(shí)間設(shè)置:2007.06.01 14:00 Mon
//(4)開放各模塊中斷
EnableSCIReInt; //(1) 開放串行接收中斷
//(5)開放總中斷
ENABLE_INTERRUPTS;
//主循環(huán)
while (1)
{
if (Flag == 1) //接收到正確的一幀
{
//處理從秒到年數(shù)據(jù)(2字節(jié)ASCII合為1字節(jié)的壓縮BCD)
for (i = 0;i < 8;i++)//最后一個(gè)字節(jié)為世紀(jì)字節(jié)
{
k = (ReBuf[2*i+1] - '0') << 4;
WriteData[i] = k | (ReBuf[2*i+2] - '0');
}
//按照時(shí)間寄存器格式,進(jìn)一步處理WriteData中的時(shí)間數(shù)據(jù)
WriteData[0] &= 0x7F; //VL位清零
if (WriteData[7] == 0x19) //設(shè)置月寄存器的世紀(jì)位
WriteData[5] |= 0x80;
else
WriteData[5] &= 0x7F;
while(IICwriteN(0xA2, 0x02, WriteData, 7));
Flag = 0;
}
//從PCF8563讀出時(shí)間的BCD碼,存入ReadData
while(IICreadN(0xA3, 0x02, ReadData, 7));
if (Sec != (ReadData[0] & 0x7F))//秒值發(fā)生變化就,轉(zhuǎn)換數(shù)據(jù)格式并發(fā)送
{
//處理ReadData中的7個(gè)時(shí)間數(shù)據(jù)
for (i = 0;i < 7;i++)
{
switch(i)
{
case 0://秒和分?jǐn)?shù)據(jù)的最高位不用,清零
case 1:
ReadData[i] &= 0x7F;
break;
case 2://時(shí)和天數(shù)據(jù)的高兩位不用,清零
case 3:
ReadData[i] &=0x3F;
break;
case 4://星期數(shù)據(jù)的高五位不用,清零
ReadData[i] &= 0x07;
break;
case 5://月數(shù)據(jù)的6、5兩位不用
if ((ReadData[i] &0x80) == 0)
{
SendBuf[15] = '2';
SendBuf[16] = '0';
}
else
{
SendBuf[15] = '1';
SendBuf[16] = '9';
}
ReadData[i] &= 0x1F;
break;
default:
break;
}
//BCD碼轉(zhuǎn)為ASCII碼
SendBuf[2*i+2] = (ReadData[i] & 0x0F) + 0x30;
SendBuf[2*i+1] = ((ReadData[i] & 0xF0) >> 4) + 0x30;
}
SendBuf[0] = '#'; //'#'作為幀頭
Sec = ReadData[0];
SCISendN(17,SendBuf);
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -