|

楼主 |
发表于 2022-11-1 11:34:36
|
显示全部楼层
******************************************/
/************* 本地常量声明 **************/
#define K_SWITCH 0x10
#define K_HOUR 0x20
#define K_MIN_UP 0x40
#define K_MIN_DN 0x80
#define DIS_BLACK 0x10
#define DIS_ 0x11
#define LCD_SET_BAT0 LCD_buff[0] |= 0x01
#define LCD_CLR_BAT0 LCD_buff[0] &= ~0x01
#define LCD_CPL_BAT0 LCD_buff[0] ^= 0x01
#define LCD_SET_BAT1 LCD_buff[0] |= 0x02
#define LCD_CLR_BAT1 LCD_buff[0] &= ~0x02
#define LCD_CPL_BAT1 LCD_buff[0] ^= 0x02
#define LCD_SET_BAT2 LCD_buff[2] |= 0x02
#define LCD_CLR_BAT2 LCD_buff[2] &= ~0x02
#define LCD_CPL_BAT2 LCD_buff[2] ^= 0x02
#define LCD_SET_BAT3 LCD_buff[4] |= 0x02
#define LCD_CLR_BAT3 LCD_buff[4] &= ~0x02
#define LCD_CPL_BAT3 LCD_buff[4] ^= 0x02
#define LCD_SET_BAT4 LCD_buff[6] |= 0x02
#define LCD_CLR_BAT4 LCD_buff[6] &= ~0x02
#define LCD_CPL_BAT4 LCD_buff[6] ^= 0x02
#define LCD_SET_LEFT_UP LCD_buff[6] |= 0x01
#define LCD_CLR_LEFT_UP LCD_buff[6] &= ~0x01
#define LCD_SET_LEFT_DN LCD_buff[0] |= 0x08
#define LCD_CLR_LEFT_DN LCD_buff[0] &= ~0x08
#define LCD_SET_RIGHT_UP LCD_buff[2] |= 0x01
#define LCD_CLR_RIGHT_UP LCD_buff[2] &= ~0x01
/************* 本地IO定义 **************/
/************* 本地变量声明 **************/
u8 year, month, day, week, hour, minute, second; //RTC实时时间
bit B_500mS; // 0.5秒时隙标志
bit B_20ms; // 20ms时隙标志
u8 OpTime; // 此变量非0时, 不睡眠, 连续运行程序(本例串口唤醒后连续运行5秒, 以便正确接收串口数据)
u8 idata LCD_buff[8]; //LCD显存
u8 DisMode; //显示模式, 0: 显示时分, 1:显示分秒, 2:显示月日
u8 KeyState; //键状态
u8 KeyCode; //键码
u8 KeyHoldCnt; //重键计数
/************* 本地函数声明 **************/
u8 SetRTC(void); //设置RTC时间函数
void RTC_config(void); //RTC初始化函数
void RTC_read(void); //读RTC时间函数
void RTC_ShowLCD(void); //显示时间信息
u8 Timer0_Config(u32 reload); //reload值是主时钟周期数
void LCD_config(void);
void LoadToLcd(void);
void LCD_load(u8 n, u8 dat); //n为第几个数字,为1~5,dat为要显示的数字
void ReadKey(void); //50ms call
//========================================================================
// 函数: void main(void)
// 描述: 主函数
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2018-4-2
// 备注:
//========================================================================
void main(void)
{
P0M1 = 0; P0M0 = 0;
P1M1 = 0; P1M0 = 0;
P2M1 = 0; P2M0 = 0;
P3M1 = 0; P3M0 = 0;
P4M1 = 0; P4M0 = 0;
P5M1 = 0; P5M0 = 0;
P6M1 = 0; P6M0 = 0;
P7M1 = 0; P7M0 = 0;
Timer0_Config(MAIN_Fosc / 50); //reload值是主时钟周期数, (中断频率, 50次/秒)
EA = 1;
OpTime = 0;
DisMode = 0;
RTC_config();
LCD_config();
while (1)
{
if(B_20ms)
{
B_20ms = 0;
ReadKey();
}
if(B_500mS) // 1/2秒中断
{
B_500mS = 0;
if(second == RTC_SEC) // RTC的秒计数值, 相等则秒没变化, 0.5秒而已, 闪点
{
if(DisMode <= 1) //显示时分或分秒才闪秒
{
LCD_load(3, DIS_); //秒闪中间一杠
LoadToLcd();
}
}
else //秒有变化
{
RTC_read();
if(OpTime != 0) OpTime--; //连续操作时间
RTC_ShowLCD(); //显示时间信息
}
}
if(KeyCode != 0)
{
if(KeyCode == K_SWITCH) //短按K1键 切换显示
{
if(++DisMode >= 3) DisMode = 0; //0: 显示时分, 1:显示分秒, 2:显示月日
RTC_ShowLCD(); //显示时间信息
}
else if(DisMode == 0) //显示时分时可以调时间
{
if(KeyCode == K_HOUR) //hour键
{
if(++hour >= 24) hour = 0;
SetRTC();
RTC_ShowLCD(); //显示时间信息
}
else if(KeyCode == K_MIN_UP) //MINUTE+键
{
if(++minute >= 60) minute = 0;
second = 0;
SetRTC();
RTC_ShowLCD(); //显示时间信息
}
else if(KeyCode == K_MIN_DN) //MINUTE-键
{
if(--minute >= 60) minute = 59;
second = 0;
SetRTC();
RTC_ShowLCD(); //显示时间信息
}
}
else if(DisMode == 2) //显示月日时可以调日期
{
if(KeyCode == K_HOUR) //hour键
{
if(++month >= 13) month = 1;
SetRTC();
RTC_ShowLCD(); //显示时间信息
}
else if(KeyCode == K_MIN_UP) //MINUTE+键
{
if(++day >= 32) day = 1;
SetRTC();
RTC_ShowLCD(); //显示时间信息
}
else if(KeyCode == K_MIN_DN) //MINUTE-键
{
if(--day == 0) day = 31;
SetRTC();
RTC_ShowLCD(); //显示时间信息
}
}
KeyCode = 0;
}
if(OpTime != 0) // OpTime!=0进入空闲模式
{
PCON |= 0x01; //进入空闲模式
NOP(5);
}
else //if(OpTime == 0) // OpTime==0才进入掉电模式
{
IE0 = 0; //外中断0标志位
IT0 = 1; //下降沿中断
EX0 = 1; //允许中断
P32 = 1; //唤醒脚(也是键扫描脚)
P64 = 0; //按键输入
P65 = 0; //按键输入
P66 = 0; //按键输入
P67 = 0; //按键输入
NOP(5);
PCON |= 0x02; //进入睡眠模式
NOP(5);
EX0 = 0; //禁止中断
P32 = 0;
P64 = 1;
P65 = 1;
P66 = 1;
P67 = 1;
NOP(5);
}
}
} |
|