/*============================================================
使用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;//设置分钟闪烁标志位