|
//******************************Write By F H X***********************************//
//****************LCD1602万年历 :显示 年月日、 温度、 时间、 星期****************//
//******************************矩阵按键可调整***********************************//
//*****************************LCD1602界面如下***********************************//
//************************ ■〓〓〓〓〓〓〓〓〓〓〓■ *****************************//
//************************ ■ 2017年03月20日 15°C ■ *****************************//
//************************ ■ 12:30:00 week:1 ■ *****************************//
//************************ ■〓〓〓〓〓〓〓〓〓〓〓■ *****************************//
#include"function.h"
uchar T0RH=0;
uchar T0RL=0;
bit flag200ms=1; //到达200ms标志
uchar mode=0; //设置变量
struct STime bufTime; //日期时间缓冲区
uchar tflag;
void Timer0Init(uint ms);
/**************************************************主函数***********************************************************/
/* */
/*******************************************************************************************************************/
void main()
{
uchar psec = 0xAA; //确保第一次读取时间能刷新显示
EA=1; //打开总中断
Timer0Init(1); //初始化定时器0 定时1ms
RESET_DS18B20(); //复位18B20
InitDS1302(); //初始化DS1302
InitLcd1602(); //初始化LCD1602
LcdShowStr(0,0,"20"); //固定显示内容
Display_user(); //显示自定义字符 年 月 日
LcdShowDat(14,0,0xDF); //显示°
LcdShowStr(15,0,"C");
LcdShowStr(0,1," : : ");
LcdShowStr(9,1,"week:");
while(1)
{
KeyDrive();
if(flag200ms&&(mode==0)) //到达200ms且没有进入设置模式时
{
flag200ms=0;
GetRealTime(&bufTime); //获取当前时间
Display_Tem(); //显示温度
if(psec!=bufTime.sec) //检测时间有变化时刷新时间显示
{
Refresh_TimeShow(); //更新显示
psec=bufTime.sec;
}
}
}
}
/*********************************************定时器0初始化函数***************************************************/
/* 形参ms 当ms=1 定时1毫秒 */
/*****************************************************************************************************************/
void Timer0Init(uint ms)
{
ulong tmp; //16位长整型变量tmp
tmp=12000000/12; //用晶振频率除以12得到定时器计数频率
tmp=(tmp*ms)/1000; //计算出需要多少个机器周期
tmp=65536-tmp; //定时器的初始值
tmp=tmp+27; //补偿中断延时响应造成的误差
T0RH=(uchar)(tmp>>8); //将tmp高8位右移8位 赋值给T0RH
T0RL=(uchar)tmp; //将tmp低8位赋值给T0RL
TMOD&=0xF0; //TMOD高4位不变 低四位清零
TMOD|=0x01; //TMOD低四位变成0001
TH0=T0RH; //装载初值
TL0=T0RL;
ET0=1; //开启定时器0中断
TR0=1; //开启定时器0
}
/*************************************************T0中断服务函数**************************************************/
/* */
/*****************************************************************************************************************/
void InterruptTimer0() interrupt 1
{
static uchar tmr_ms=0;
TH0=T0RH;
TL0=T0RL;
KeyScan();
tmr_ms++;
if(tmr_ms>=200) //定时200ms
{
tmr_ms=0;
flag200ms=1;
}
}
|
|