基于LCD1602和DS1302的时间显示程序

2019-01-03 16:01

/*============================================================

使用1602液晶显示DS1302+S51时钟+温度显示 zhaojun 2007/06/29 ==============================================================

声明:1. 1602驱动程序照搬明皓的,非常好用 2. DS1302驱动程序是参考网友修改而来 NS1602R(16*2)模拟口线接线方式 连接线图:

---------------------------------------------------

| LCM-----51 | LCM-----51 | LCM------51 | | ----------------------------------------------- | | DB0-----P0.0 | DB4-----P0.4 | RS-------P2.0 | | DB1-----P0.1 | DB5-----P0.5 | RW-------P2.1 | | DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 |

| DB3-----P0.3 | DB7-----P0.7 | VLCD接1K电阻到GND | --------------------------------------------------- DS1302 接线图 Vcc2 CLK I/O /RST | | | | --------------- | 8 7 6 5 | | DS1302 | | | | 1 2 3 4 | --------------- | | | | VCC1 GND

1. 脚接+5V 2,3. 脚32768HZ晶振 4. 脚接地 5. 脚接S51的P1.2 6. 脚接S51的P1.1 7. 接S51的P1.0

8. 脚接后备电源,可以接老计算机主板上的3.6V电池,也可以通过二级管隔离接一个大容量电解电容 电压在2.5V以上即可维持

按键说明:1. 共三个键,低电平有效 2. P1.4 和 P1.5 同时按:初始化 3. P1.6 端口按键:选择要调整的项目

4. P1.5 端口按键:增加;P1.4端口按键:减少

[注:AT89S51使用12M晶振] 源代码:

=================定义与申明

=============================================================*/

#include \#include \#include \

#define uchar unsigned char #define uint unsigned int typedef unsigned char byte; typedef unsigned int word; //*********** 1602引脚定义引脚

#define LCM_RS P2_0 // 数据/命令选择信号 #define LCM_RW P2_1 // 读/写选择信号 #define LCM_E P2_2 // 使能信号 //*********** DS1302 时间显示定义部分 sbit T_CLK=P1^0; //串行时钟输入 sbit T_IO =P1^1; //串行数据端口 sbit T_RST=P1^2; //复位端口 //*********** 18B20温度显示定义部分 sbit DQ=P3^3; //18B20 接P33口 sbit ACC0=ACC^0; sbit ACC7=ACC^7;

#define LCM_Data P0 //显示数据端口

#define Busy 0x80 //用于检测LCM状态字中的Busy标识

uchar id,timecount; //全局变量

bit flag,sflag; //flag是时钟冒号闪烁标志,sflag是温度负号显示标志 bit sec,min,hour,year,mon,day,weekk; //闪烁标志位 //*********************函数申明

void Disp_line1(void); // 显示屏幕第一行 void Disp_line2(void); // 显示屏幕第二行 void id_case1_key(); // id为1时的下一级选择 void Set(uchar,uchar); // 根据选择调整相应项目 void RTInputByte(uchar); /* 输入 1Byte */ uchar RTOutputByte(void); /* 输出 1Byte */

void W1302(uchar, uchar); // 向DS1302写入一个字节 uchar R1302(uchar); // 从DS1302读出一个字节 void Set1302(uchar * ); // 设置时间

//******* 1602LCD驱动 ********************************************************** void WriteDataLCM(uchar WDLCM); //写数据

void WriteCommandLCM(uchar WCLCM,BuysC); //写指令 uchar ReadStatusLCM(void); //读状态 void LCMInit(void); //LCM初始化

void DisplayOneChar(uchar X, uchar Y, uchar DData); //按指定位置显示一个字符

void DisplayListChar(uchar X, uchar Y, uchar code *DData); //按指定位置显示一串字符

void Delay5Ms(void); //5ms延时 void Delay400Ms(void); //400ms延时 Read_Temperature(char,char);//温度显示 void mychar(void); //显示自定义字符

void adjust_res(char res); //res 分别等于 0x1f, 0x3f, 0x5f 温度读数分辨率分别对应

// 0.5, 0.25, 0.125

//初始化后设置为:07年07月04日星期3 12点00分00秒 // 12:00:00 XX. C // 07/07/04 Week.3

unsigned char inittime[7]={0x00,0x00,0x12,0x04,0x07,0x03,0x07}; // 秒分钟小时日月星期年

uchar code week[]={\星期显示

//========================= 主函数

======================================================= /***************************************************** 函数名:main() 功能:主函数 说明: 入口参数:无 返回值:无

*****************************************************/ void main(void) {

Delay400Ms(); //启动等待,等LCM讲入工作状态 LCMInit(); //LCM初始化 Delay5Ms(); //延时片刻(可不要) mychar(); //显示自定义字符 TMOD=0x01; //选择定时模式

TH0=(65535-50000)/256;//取定时初值 TL0=(65535-50000)%6; EA=1; //开中断 TR0=1; ET0=1;

W1302(0x90,0xa5); //打开充电二级管一个二级管串联一个2K电阻 W1302(0x8e,0x80); //写保护,禁止写操作

adjust_res(0x5f); //调整18B20的分辨率 0x1f:0.5; 0x3f:0.25; 0x5f:0.125 while(1) {

if ((P1_4|P1_5)==0) // 初始化同时按下P1_4、P1_5 {

Delay5Ms(); // 适当延时,消除抖动

if ((P1_4|P1_5)==0) Set1302(inittime); // 显示初始值 }

if (P1_6==0) // 设置和选择项目键 {

Delay5Ms(); // 适当延时,消除抖动

if(P1_6==0){id++;if(id>7) id=0;} // 7个可调节项目循环调节

while(P1_6==0); }

switch(id) // 跳转到对应的项目进行设置 { case 0: sec=0;

Disp_line1(); Disp_line2(); break;

case 1: //调节年

year=1;//设置年闪烁标志位 Disp_line1(); Disp_line2(); id_case1_key(); break;

case 2: //调节月

year=0;mon=1;//设置月闪烁标志位 Disp_line1(); Disp_line2(); id_case1_key(); break;

case 3: //调节日

mon=0;day=1;//设置日闪烁标志位 Disp_line1(); Disp_line2(); id_case1_key(); break;

case 4: //调节星期

day=0;weekk=1;//设置星期闪烁标志位 Disp_line1(); Disp_line2(); id_case1_key(); break;

case 5: //调节小时

weekk=0;hour=1;//设置小时闪烁标志位 Disp_line1(); Disp_line2(); id_case1_key(); break;

case 6: //调节分钟

hour=0;min=1;//设置分钟闪烁标志位


基于LCD1602和DS1302的时间显示程序.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:经济地理学教案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: