📄 使用1602液晶显示ds1302+c51时钟.txt
字号:
/*============================================================
使用1602液晶显示DS1302+c51时钟
功能:
(1) 显示时间 完成时间:2006/03/29
(2) 1302初始设置 完成时间:2006/03/29
(3) 显示日期 完成时间:2006/03/29
(4) 背光灯设置 完成时间:2006/04/1
(5) 闹铃设置 完成时间:2006/04/02
==============================================================
1602接线图:
---------------------------------------------------
|LCM-----51 | LCM-----51 | LCM------51 |
---------------------------------------------|
|DB0-----P0.0 | DB4-----P1.4 | RW-------P2_5 |
|DB1-----P0.1 | DB5-----P0.5 | RS-------P2_7 |
|DB2-----P0.2 | DB6-----P0.6 | E-------P2_6 |
|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的P02 6脚接S51的P01 7接S51的P00
8脚接后备电源可以通过二级管隔离接一个大容量电解电容
按键说明:1. 共三个键,低电平有效
2. P10 端口按键:选择要调整的项目
3. P11 端口按键:增加;
4. P12 端口按键:减少
[注:AT89C51使用12M晶振]
=============================================================*/
#include <AT89X51.H>
#include <STRING.H>
#define LCM_RW P2_1 //定义引脚
#define LCM_RS P2_0
#define LCM_E P2_2
#define LCM_Data P0
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
#define uchar unsigned char
sbit T_CLK=P2^5;
sbit T_IO =P2^7;
sbit T_RST=P2^6;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit LED=P3^7; //背光灯输出
sbit system=P1^0; //模式
sbit TimerUp=P1^1; //时间加
sbit TimerDown=P1^2; //时间减
sbit Speaker=P2^3; //蜂鸣器
void Set(uchar,uchar); //根据选择调整相应项目
void RTInputByte(uchar); //输入 1Byte */
uchar RTOutputByte(void); //输出 1Byte */
void W1302(uchar, uchar); //向DS1302写入一个字节
uchar R1302(uchar); //从DS1302读出一个字节
void Set1302(uchar * ); //设置时间
void KeySound(); //按键音
void ClockSound(); //闹铃蜂鸣声
uchar id,msec,model,LedTime,d;
bit a,b; //闪烁标志位
uchar inittime[7]={0x00,0x10,0x19,0x29,0x03,0x04,0x06}; //初始化后设置为:06年3月29日星期3 19点10分0秒
void Out_LCM(void); //显示屏幕
void model0(void); //显示输出
void model1(void);
void model2(void);
void model3(void);
void model4(void);
void model5(void);
void model6(void);
void id_case1_key(); //项目调整
void Modset(); //模式键处理
void WriteDataLCM(uchar WDLCM);
void WriteCommandLCM(uchar WCLCM,BuysC);
uchar ReadStatusLCM(void);
void LCMInit(void);
void OutputInformation(uchar X, uchar Y, uchar DData);
void DisplayListChar(uchar X, uchar Y, uchar code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
void systemsetup(void); //进入系统设置
uchar code systemp[]={"System.setup"}; //字符串输出(系统设定)
uchar code TIMER[]={"Time"}; //字符串输出(时间)
uchar code DATE[]={"Date"}; //字符串输出(日期)
uchar code alarmclock[]={"Clock"}; //字符串输出(闹铃)
uchar code lamp[]={"Lamp"}; //字符串输出(背光灯)
uchar code reset[]={"Reset"}; //字符串输出(时间归零)
uchar code exit[]={"Exit"}; //字符串输出(退出)
uchar code set[]={"Set"}; //字符串输出(设置)
uchar code sec[]={"sec"}; //字符串输出(秒)
uchar code ClockSet[]={"ClockSet"}; //字符串输出(闹铃设置)
uchar code ClockOn[]={"ON"}; //字符串输出(ON)
uchar code ClockOff[]={"OFF"}; //字符串输出(OFF)
void timesetup(void); //时间设置
void datesetup(void); //日期设置
void alarmclockset(void); //闹铃设置
void lampsetup(void); //背光灯设置
void timereset(void); //时间清零
void main(void)
{
Speaker=1; //关闭蜂鸣器
LED=0; //打开LED ,低电平有效,外接9012驱动
Delay400Ms(); //启动等待,等LCM讲入工作状态
LCMInit(); //LCM初始化
TMOD=0x01; //16位定时
TH0=0x3c; //50ms
TL0=0xb0;
EA=1;
TR0=1;
ET0=1;
while(1)
{
if(TimerDown==0) //左移键按下后把背光灯打开
{Delay5Ms();
if(TimerDown==0)
{KeySound(); //蜂鸣声
LED=0; //打开背光灯
LedTime=R1302(0xc1)/16*10+R1302(0xc1)%16;} //取出背光灯时间并转换为十进制数
}
b=1; //模式键是否动作标志。为1时不动作,为0时动作。
Modset(); //调用模式键处理程序判断按键是否按下。
if(b==0)
{
KeySound(); //蜂鸣声
LED=0; //打开背光灯
systemsetup(); //进入系统设置模式
LedTime=R1302(0xc1)/16*10+R1302(0xc1)%16; //取出背光灯时间并转换为十进制数
}
if((LED==0)&&LedTime==0) //延时间是否到
LED=1; //关闭背光灯
if(R1302(0xc3)==1) //闹铃是否打开,0xc3为读闹铃寄存器地址。
{if((R1302(0x85)==R1302(0xc5))&&(R1302(0x83)==R1302(0xc7))) //判断闹铃时间是否到,
ClockSound(); //发出闹铃蜂鸣声,无按键动作蜂鸣一分钟。
}
model0(); //输出显示屏幕
}
}
void KeySound() //按键音
{
Speaker=0; //开蜂鸣声
Delay5Ms();
Speaker=1; //关蜂鸣声
}
void ClockSound() //闹铃蜂鸣声
{
if(a==0)
{
Speaker=0; //开蜂鸣声
Delay5Ms();
Delay5Ms();
Delay5Ms();
Speaker=1; //关蜂鸣声
}
}
void Modset() //模式键处理
{ if(system==0)
{
Delay5Ms();
if(system==0)
{while(system==0);
KeySound(); //蜂鸣声
a=0;msec=0;b=0; //a、msec为闪烁标志,按键有动作时清零,不闪烁。
} //b为模式键确认动作。其它程判断b是否为零时来确定模式键是否动作。
}
}
void systemsetup(void) //系统设置
{
model=1;
while(model!=0)
{
Out_LCM();
if (TimerUp==0) //设置项目左移
{Delay5Ms();
if(TimerUp==0)
{a=0;msec=0;KeySound();//蜂鸣声
if(model--==1) //6种系统设置项目
model=6;
}
while(TimerUp==0);
}
if (TimerDown==0) //设置项目右移
{
Delay5Ms();
if(TimerDown==0)
{a=0;msec=0;KeySound();//蜂鸣声
if(model++==6)
model=1;
}
while(TimerDown==0);
}
b=1; //模式键是否动作标志。为1时不动作,为0时动作。
Modset(); //调用模式键处理程序判断按键是否按下。
if(b==0)
{KeySound(); //蜂鸣声
switch(model) //进入进个项目设置
{
case 1:
timesetup(); break; //时间设置
case 2:
datesetup();break; //日期设置
case 3:
alarmclockset();break;//闹铃设置
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -