实例介绍
【实例简介】1602显示时钟日历,可以对时钟闹钟进行调节并有着报时功能
【实例截图】
【核心代码】#define _MAIN_C
#include "config.h"
#include "Lcd1602.h"
#include "LedBuzzer.h"
#include "keyboard.h"
#include "DS1302.h"
#include "DS18B20.h"
#include "Infrared.h"
#include "Time.h"
#include "main.h"
bit flag2s = 0; //2s定时标志位
bit flag200ms = 0; //200ms定时标志
uint8 T0RH = 0; //T0重载值的高字节
uint8 T0RL = 0; //T0重载值的低字节
enum eStaSystem staSystem = E_NORMAL; //系统运行状态
void main()
{
EA = 1; //开总中断
ConfigTimer0(1); //配置T0定时1ms
InitLed(); //初始化LED模块
InitDS1302(); //初始化实时时钟模块
InitInfrared(); //初始化红外接收模块
InitLcd1602(); //初始化液晶模块
Start18B20(); //启动首次温度转换
while (!flag2s); //上电后延时2秒
flag2s = 0;
RefreshTime(); //刷新当前时间
RefreshDate(1); //立即刷新日期显示
RefreshTemp(1); //立即刷新温度显示
RefreshAlarm(); //闹钟设定值显示
while (1) //进入主循环
{
KeyDriver(); //执行按键驱动
InfraredDriver(); //执行红外接收驱动
if (flag200ms) //每隔200ms执行以下分支
{
flag200ms = 0;
FlowingLight(); //流水灯效果实现
RefreshTime(); //刷新当前时间
AlarmMonitor(); //监控闹钟
if (staSystem == E_NORMAL) //正常运行时刷新日期显示
{
RefreshDate(0);
}
}
if (flag2s) //每隔2s执行以下分支
{
flag2s = 0;
if (staSystem == E_NORMAL) //正常运行时刷新温度显示
{
RefreshTemp(0);
}
}
}
}
/* 温度刷新函数,读取当前温度并根据需要刷新液晶显示,
** ops-刷新选项:为0时只当温度变化才刷新,非0则立即刷新 */
void RefreshTemp(uint8 ops)
{
int16 temp;
uint8 pdata str[8];
static int16 backup = 0;
Get18B20Temp(&temp); //获取当前温度值
Start18B20(); //启动下一次转换
temp >>= 4; //舍弃4bit小数位
if ((backup!=temp) || (ops!=0)) //按需要刷新液晶显示
{
str[0] = (temp/10) '0'; //十位转为ASCII码
str[1] = (temp%10) '0'; //个位转为ASCII码
str[2] = '\''; //用'C代替℃
str[3] = 'C';
str[4] = '\0'; //字符串结束符
LcdShowStr(12, 0, str); //显示到液晶上
backup = temp; //刷新上次温度值
}
}
/* 配置并启动T0,ms-T0定时时间 */
void ConfigTimer0(uint16 ms)
{
uint32 tmp;
tmp = (SYS_MCLK*ms)/1000; //计算所需的计数值
tmp = 65536 - tmp; //计算定时器重载值
tmp = tmp 33; //补偿中断响应延时造成的误差
T0RH = (uint8)(tmp>>8); //定时器重载值拆分为高低字节
T0RL = (uint8)tmp;
TMOD &= 0xF0; //清零T0的控制位
TMOD |= 0x01; //配置T0为模式1
TH0 = T0RH; //加载T0重载值
TL0 = T0RL;
ET0 = 1; //使能T0中断
TR0 = 1; //启动T0
}
/* T0中断服务函数,实现系统定时和按键扫描 */
void InterruptTimer0() interrupt 1
{
static uint8 tmr2s = 0;
static uint8 tmr200ms = 0;
TH0 = T0RH; //重新加载重载值
TL0 = T0RL;
tmr200ms ; //定时200ms
if (tmr200ms >= 200)
{
tmr200ms = 0;
flag200ms = 1;
tmr2s ; //定时2s
if (tmr2s >= 10)
{
tmr2s = 0;
flag2s = 1;
}
}
KeyScan(); //执行按键扫描
}
【实例截图】
【核心代码】#define _MAIN_C
#include "config.h"
#include "Lcd1602.h"
#include "LedBuzzer.h"
#include "keyboard.h"
#include "DS1302.h"
#include "DS18B20.h"
#include "Infrared.h"
#include "Time.h"
#include "main.h"
bit flag2s = 0; //2s定时标志位
bit flag200ms = 0; //200ms定时标志
uint8 T0RH = 0; //T0重载值的高字节
uint8 T0RL = 0; //T0重载值的低字节
enum eStaSystem staSystem = E_NORMAL; //系统运行状态
void main()
{
EA = 1; //开总中断
ConfigTimer0(1); //配置T0定时1ms
InitLed(); //初始化LED模块
InitDS1302(); //初始化实时时钟模块
InitInfrared(); //初始化红外接收模块
InitLcd1602(); //初始化液晶模块
Start18B20(); //启动首次温度转换
while (!flag2s); //上电后延时2秒
flag2s = 0;
RefreshTime(); //刷新当前时间
RefreshDate(1); //立即刷新日期显示
RefreshTemp(1); //立即刷新温度显示
RefreshAlarm(); //闹钟设定值显示
while (1) //进入主循环
{
KeyDriver(); //执行按键驱动
InfraredDriver(); //执行红外接收驱动
if (flag200ms) //每隔200ms执行以下分支
{
flag200ms = 0;
FlowingLight(); //流水灯效果实现
RefreshTime(); //刷新当前时间
AlarmMonitor(); //监控闹钟
if (staSystem == E_NORMAL) //正常运行时刷新日期显示
{
RefreshDate(0);
}
}
if (flag2s) //每隔2s执行以下分支
{
flag2s = 0;
if (staSystem == E_NORMAL) //正常运行时刷新温度显示
{
RefreshTemp(0);
}
}
}
}
/* 温度刷新函数,读取当前温度并根据需要刷新液晶显示,
** ops-刷新选项:为0时只当温度变化才刷新,非0则立即刷新 */
void RefreshTemp(uint8 ops)
{
int16 temp;
uint8 pdata str[8];
static int16 backup = 0;
Get18B20Temp(&temp); //获取当前温度值
Start18B20(); //启动下一次转换
temp >>= 4; //舍弃4bit小数位
if ((backup!=temp) || (ops!=0)) //按需要刷新液晶显示
{
str[0] = (temp/10) '0'; //十位转为ASCII码
str[1] = (temp%10) '0'; //个位转为ASCII码
str[2] = '\''; //用'C代替℃
str[3] = 'C';
str[4] = '\0'; //字符串结束符
LcdShowStr(12, 0, str); //显示到液晶上
backup = temp; //刷新上次温度值
}
}
/* 配置并启动T0,ms-T0定时时间 */
void ConfigTimer0(uint16 ms)
{
uint32 tmp;
tmp = (SYS_MCLK*ms)/1000; //计算所需的计数值
tmp = 65536 - tmp; //计算定时器重载值
tmp = tmp 33; //补偿中断响应延时造成的误差
T0RH = (uint8)(tmp>>8); //定时器重载值拆分为高低字节
T0RL = (uint8)tmp;
TMOD &= 0xF0; //清零T0的控制位
TMOD |= 0x01; //配置T0为模式1
TH0 = T0RH; //加载T0重载值
TL0 = T0RL;
ET0 = 1; //使能T0中断
TR0 = 1; //启动T0
}
/* T0中断服务函数,实现系统定时和按键扫描 */
void InterruptTimer0() interrupt 1
{
static uint8 tmr2s = 0;
static uint8 tmr200ms = 0;
TH0 = T0RH; //重新加载重载值
TL0 = T0RL;
tmr200ms ; //定时200ms
if (tmr200ms >= 200)
{
tmr200ms = 0;
flag200ms = 1;
tmr2s ; //定时2s
if (tmr2s >= 10)
{
tmr2s = 0;
flag2s = 1;
}
}
KeyScan(); //执行按键扫描
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论