1602液晶显示DS1302+S51时钟+温度显示
使用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 "regx51.h"
#include "string.h"
#include "intrins.h"
#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[]={"Week."};//星期显示
//========================= 主函数 =======================================================
/*****************************************************
函 数 名:main()
功 能:主函数
说 明:
入口参数:无
返 回 值:无
*****************************************************/
void main(void)
{
Delay400Ms(); //启动等待,等LCM讲入工作状态
LCMInit(); //LCM初始化
Delay5Ms(); //延时片刻(可不要)
mychar(); //显示自定义字符
1602液晶DS1302S51时钟温度显 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)