📄 main.c
字号:
/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2004-09-16
** Last Version: 1.0
** Descriptions: The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by: Chenmingji
** Created date: 2004-09-16
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by: wgejygah
** Modified date: 2007
** Version:
** Descriptions: RTC万年历实验
**
** 1、时间范围:2000--2099
** 2、可以任意设置日期、时间和闹铃;
** 3、闰年补偿、定时提醒等功能;
** 4、可以通过PC机设置日期时间和定时提醒时刻;
** 5、可以在PC机上显示日期、时间和提醒时刻;
** 6、在串口软件上显示的格式为:(要求显示中文)
** 当前日期:X年X月X日
** 当前时间:X时X分X秒
** 设置提醒:X时X分X秒
**
********************************************************************************************************/
#include "config.h"
#include "ZLG7290.h"
#include "I2CINT.h"
#include "UART0.h"
uint8 DisplayShift; //显示切换
uint8 KeyValue; //键值
uint8 KeySym; //按键标志
uint8 ALSym;
uint16 YearTemp;
uint8 MonthTemp;
uint8 DomTemp;
uint8 DowTemp;
uint8 HourTemp;
uint8 MinTemp;
uint8 SecTemp;
uint8 dom_max; //日的最大值, 范围:28,29,30,31.
uint8 SendSym;
uint32 dly,ii;
uint8 sed_time[32];
uint8 rcv_time[32];
//无奈
uint8 aALHOUR;
uint8 aALHOUR;
uint8 aALMIN;
uint8 aALMIN;
uint8 aALSEC;
uint8 aALSEC;
uint8 aAMR;
void DiplayInit(void) //全局变量
{
YearTemp = 0;
MonthTemp = 0;
DomTemp = 0;
DowTemp = 7;
HourTemp = 24;
MinTemp = 60;
SecTemp = 60;
}
void I2CInit(uint32 Fi2c) //I2C初始化
{
PINSEL0 = (PINSEL0&0xFFFFFF0F)|0x50; //设置I2C连接
/*设定I2C时钟*/
I2SCLH = (Fpclk/Fi2c + 1)/2;
I2SCLL = (Fpclk/Fi2c)/2;
I2CONCLR = 0x2C; /*清除AAC SIC STAC 位*/
I2CONSET = 0x40; // AA=0 主模式 I2EN=1 使能I2C
/*设置I2C中断允许*/
VICIntSelect = 0; //设置所有通道为IRQ中断
VICVectCntl3 = 0x29;
VICVectAddr3 = (uint32)IRQ_I2C; //设置I2C中断向量
VICIntEnClr = 1<<9; //使能I2C中断
}
void __irq IRQ_EXT3(void)
{
KeySym = 1; //置按键标志
ALSym = 1;
EXTINT |= 0x08;
VICVectAddr = 0x00;
}
void EXT3Init(void) //外部中断3初始化
{
PINSEL1 |= 2<<28; //P0.30口为外部中断3
VICIntSelect = 0;
VICVectCntl1 = (0x20 | 17);
VICVectAddr1 = (uint32)IRQ_EXT3;
EXTINT = 0x08;
EXTMODE = 0x08; //下降沿激活
EXTPOLAR = 0x00;
VICIntEnable = (1 << 17); //使能外部中断3
}
void RTCInit (void) //RTC初始化
{
PREINT = Fpclk / 32768 - 1; // 设置基准时钟分频器
PREFRAC = Fpclk - (Fpclk / 32768) * 32768;
CCR = 0x00; // 禁止时间计数器
YEAR = 2007; //2007年5月27日
MONTH = 05;
DOM = 29;
DOW = 2; //星期二
HOUR = 23; //23:59:56
MIN = 59;
SEC = 15;
aALHOUR = 23; //23:59:56
aALMIN = 59;
aALSEC = 55;
aAMR = 0x00;
///CIIR = 0x01; // 设置秒值的增量产生1次中断
ILR = 0x03; // 清除RTC增量和报警中断标志
CCR = 0x01; // 启动RTC
dom_max = 31;
}
void KeySer(void)
{
KeyValue = 0;
if(KeySym)
{
KeyValue = ZLG7290_GetKey(); //读取键值
KeySym = 0;
switch (KeyValue)
{
case 1: //显示切换
if(DisplayShift < 2)
DisplayShift ++;
else
DisplayShift = 0;
DiplayInit(); //更新显示
break;
case 2:
if(DisplayShift == 1) //调整年
{
if(YEAR < 2099)
YEAR ++;
else
YEAR = 2000;
}
else if(DisplayShift == 0) //调整小时
{
if(HOUR < 23)
HOUR ++;
else
HOUR = 0;
}
else if(DisplayShift == 2) //调整闹铃的小时
{
if(aALHOUR < 23)
aALHOUR ++;
else
aALHOUR = 0;
}
break;
case 3:
if(DisplayShift == 1) //调整月
{
if(MONTH < 12)
MONTH ++;
else
MONTH = 1;
}
else if(DisplayShift == 0) //调整分钟
{
if(MIN < 59)
MIN ++;
else
MIN = 0;
}
else if(DisplayShift == 2) //调整闹铃的分钟
{
if(aALMIN < 59)
aALMIN ++;
else
aALMIN = 0;
}
break;
case 4:
if(DisplayShift == 1) //调整日
{
if((MONTH == 1)|(MONTH == 3)|(MONTH == 5)|(MONTH == 7)|(MONTH == 8 )|(MONTH == 10)|(MONTH == 12))
dom_max = 31;
else if((MONTH == 4)|(MONTH == 6)|(MONTH == 9)|(MONTH == 11))
dom_max = 30;
else if((MONTH == 2) & (YEAR % 4))
dom_max = 28;
else
dom_max = 29;
if(DOM < dom_max)
DOM ++;
else
DOM = 1;
}
else if(DisplayShift == 0) //调整秒
{
if(SEC < 59)
SEC ++;
else
SEC = 0;
}
else if(DisplayShift == 2) //调整闹铃的秒
{
if(aALSEC < 59)
aALSEC ++;
else
aALSEC = 0;
}
break;
case 5: //调整星期
if(DOW < 6)
DOW ++;
else
DOW = 0;
break;
case 6:
//ILR = 0x02; //清除报警中断标志
if(aAMR == 1)
{
aAMR = 0;
IO0SET |= 1 << 14;
IO0SET |= 1 << 10;
}
else
{
aAMR = 1; //屏蔽所有报警
IO0CLR |= 1 << 14;
//IO0CLR |= 1 << 10;
}
break;
case 7:
SendSym = 1;
break;
default:
break;
}
}
}
void YearMonthDay (void) //年 月 日
{
if(DOM != DomTemp)
{
ZLG7290_Download(4, 0, 0, DOM / 10);
ZLG7290_Download(5, 1, 0, DOM % 10);
DomTemp = DOM;
}
if(DOW != DowTemp)
{
ZLG7290_Download(6, 0, 0, 0x1F); //清除星期显示
ZLG7290_SegOnOff(DOW + 48, 1); //按星期 日 一 二 三 四 五 六 显示
DowTemp = DOW;
}
if(MONTH != MonthTemp)
{
ZLG7290_Download(2, 0, 0, MONTH / 10);
ZLG7290_Download(3, 1, 0, MONTH % 10);
MonthTemp = MONTH;
}
if(YEAR != YearTemp)
{
ZLG7290_Download(0, 0, 0, (YEAR - YEAR / 100 * 100) / 10);
ZLG7290_Download(1, 1, 0, (YEAR - YEAR / 100 * 100) % 10);
YearTemp = YEAR;
}
}
void HourMinSecWeek (void) //时 分 秒 星期
{
if(SEC != SecTemp)
{
ZLG7290_Download(4, 0, 0, SEC / 10);
ZLG7290_Download(5, 1, 0, SEC % 10);
SecTemp = SEC;
}
if(MIN != MinTemp)
{
ZLG7290_Download(2, 0, 0, MIN / 10);
ZLG7290_Download(3, 1, 0, MIN % 10);
MinTemp = MIN;
}
if(HOUR != HourTemp)
{
ZLG7290_Download(0, 0, 0, HOUR / 10);
ZLG7290_Download(1, 1, 0, HOUR % 10);
HourTemp = HOUR;
}
if(DOW != DowTemp)
{
ZLG7290_Download(6, 0, 0, 0x1F); //清除日期显示
ZLG7290_SegOnOff(DOW + 48, 1); //按星期 日 一 二 三 四 五 六 显示
DowTemp = DOW;
}
}
void ALHourMinSec (void)
{
uint32 i = 10000;
uint8 ALSet[6];
if(ALSym)
{
ALSym = 0;
ALSet[0] = aALHOUR/10;
ALSet[1] = aALHOUR%10 | 0x80;
ALSet[2] = aALMIN/10;
ALSet[3] = aALMIN%10 | 0x80;
ALSet[4] = aALSEC/10;
ALSet[5] = aALSEC%10 | 0x80;
ZLG7290_SendBuf(ALSet,6);
while ( i -- );
}
}
void PCDisplay(void)
{
if(SendSym == 1)
{
SendSym = 0;
if(aAMR == 1)
{
sed_time[0] = aALHOUR / 10 + 48;
sed_time[1] = aALHOUR % 10 + 48;
sed_time[2] = 0xCA;
sed_time[3] = 0xB1;
sed_time[4] = aALMIN / 10 + 48;
sed_time[5] = aALMIN % 10 + 48;
sed_time[6] = 0xB7;
sed_time[7] = 0xD6;
sed_time[8] = aALSEC / 10 + 48;
sed_time[9] = aALSEC % 10 + 48;
sed_time[10] = 0xC3;
sed_time[11] = 0xEB;
sed_time[12] = '\n';
sed_time[13] = '\0';
}
else
{
sed_time[0] = 2+48;
sed_time[1] = 0+48;
sed_time[2] = (uint8) (48 + (YEAR - YEAR / 100 * 100) / 10);
sed_time[3] = (uint8) (48 + (YEAR - YEAR / 100 * 100) % 10);
sed_time[4] = 0xC4;
sed_time[5] = 0xEA;
sed_time[6] = MONTH / 10 + 48;
sed_time[7] = MONTH % 10 + 48;
sed_time[8] = 0xD4;
sed_time[9] = 0xC2;
sed_time[10] = DOM / 10 + 48;
sed_time[11] = DOM % 10 + 48;
sed_time[12] = 0xC8;
sed_time[13] = 0xD5;
sed_time[14] = HOUR / 10 + 48;
sed_time[15] = HOUR % 10 + 48;
sed_time[16] = 0xCA;
sed_time[17] = 0xB1;
sed_time[18] = MIN / 10 + 48;
sed_time[19] = MIN % 10 + 48;
sed_time[20] = 0xB7;
sed_time[21] = 0xD6;
sed_time[22] = SEC / 10 + 48;
sed_time[23] = SEC % 10 + 48;
sed_time[24] = 0xC3;
sed_time[25] = 0xEB;
sed_time[26] = '\n';
sed_time[27] = '\0';
}
UART0_SendStr(sed_time);
for (dly = 10 ; dly>0; dly--)
for (ii=0; ii<500; ii++);
}
}
void PCSet(void)
{
if(U0LSR & 0x01)
{
if(aAMR == 1)
{
UART0_GetStr(rcv_time,8);
aALHOUR = rcv_time[0] * 10 + rcv_time[1] - 16;
aALMIN = rcv_time[3] * 10 + rcv_time[4] - 16;
aALSEC = rcv_time[6] * 10 + rcv_time[7] - 16;
}
else
{
UART0_GetStr(rcv_time,17);
YEAR = 2000 + rcv_time[0] * 10 + rcv_time[1] - 28;
MONTH = rcv_time[3] * 10 + rcv_time[4] - 32;
DOM = rcv_time[6] * 10 + rcv_time[7] - 16;
HOUR = rcv_time[9] * 10 + rcv_time[10] - 16;
MIN = rcv_time[12] * 10 + rcv_time[13] - 16;
SEC = rcv_time[15] * 10 + rcv_time[16] - 16;
}
}
}
/*********************************************
************* **************
************* main( ) **************
************* **************
*********************************************/
int main (void)
{
UART0_Init();
IO0DIR |= 1 << 14;
IO0DIR |= 1 << 10;
IO0SET |= 1 << 14;
IO0SET |= 1 << 10;
DisplayShift = 0; //显示切换
KeyValue = 0; //键值
KeySym = 0; //按键标志
ALSym = 0;
SendSym = 0;
DiplayInit(); //初始化全局变量
I2CInit(5000);
EXT3Init();
RTCInit();
dly = 10000; //延时
while(dly--);
while(1)
{
KeySer();
if(1 == aAMR)
{
if((HOUR == aALHOUR)&&(MIN == aALMIN)&&(SEC == aALSEC))
IO0CLR |= 1 << 10;
//aAMR = 0;
}
PCDisplay();
if(DisplayShift == 1)
YearMonthDay();
else if(DisplayShift == 0)
HourMinSecWeek();
else
ALHourMinSec();
PCSet();
//dly = 10000;
//while(dly --);
}
return 0;
}
/*********************************************************************************************************
** End Of File
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -