基于51单片机的多功能数字时钟设计利用AT89C51为主控,LCD12864为显示器件,使用DS1302作为时间单元,DHT11温湿度传感器获取环境温湿度,蜂鸣器和LED作为提示器件,使用按键进行模式选择等一系列功能。
一、硬件设计
1、LCD12864
本次设计有中文显示的需求,所以普通的LCD1602、LCD1604已经无法再满足需求,目前在仿真中还剩下两个方案,一个是利用OLED,一个是LCD12864,综合考虑51单片机的性能等各方面因素,本次设计使用LCD12864实现中文显示。在Proteus中,LCD12864叫做 AMPIRE128X64。电路如下:
2、DHT11
DHT11是一款经典的温湿度传感器,它利用单总线节省了IO口,在实际使用中大大节省了硬件资源。Proteus中提供有DHT11,如下图:
3、DS1302
DS1302为本次系统的时间单元器件,DS1302由于在仿真系统中,如果不设置其时间,这个DS1302的时间是会和电脑时间同步的,显然会非常方便本次项目的使用,DS1302使用 SPI 的通信协议,在实际使用中我们利用SPI读写寄存器,便可以完成时间的获取。
4、串口终端
由于Proteus并没有语音模块,所以这次决定使用串口终端打印中文来表示语音播报。
二、软件设计
1、硬件驱动设计
(1)DS1302使用 SPI 协议进行驱动,通过对年、月、日、时、分、秒的寄存器的读寄存器进行读操作,便可以方便的获得其值,参考代码如下:
DS1302.c
#include <REGX52.H>
sbit DS1302_SCLK=P1^0;
sbit DS1302_IO=P1^1;
sbit DS1302_CE=P1^2;
//Write:
#define DS1302_SECOND 0x80
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
#define DS1302_DATA 0x86
#define DS1302_MONTH 0x88
#define DS1302_DAY 0x8a
#define DS1302_YEAR 0x8c
#define DS1302_WP 0x8e
char DS1302_Time[]={22,1,24,20,01,40,1};
void DS1302_Init()
{
DS1302_CE=0;
DS1302_SCLK=0;
}
void DS1302_WriteByte(unsigned char Command,Data)
{
unsigned char i;
DS1302_CE=1;
for(i=0;i<8;i++)
{
DS1302_IO=Command&(0x01<<i);
DS1302_SCLK=1;
DS1302_SCLK=0;
}
for(i=0;i<8;i++)
{
DS1302_IO=Data&(0x01<<i);
DS1302_SCLK=1;
DS1302_SCLK=0;
}
DS1302_CE=0;
}
unsigned char DS1302_ReadByte(unsigned char Command)
{
unsigned char i,Data=0x00;
Command|=0x01;
DS1302_CE=1;
for(i=0;i<8;i++)
{
DS1302_IO=Command&(0x01<<i);
DS1302_SCLK=0;
DS1302_SCLK=1;
}
for(i=0;i<8;i++)
{
DS1302_SCLK=1;
DS1302_SCLK=0;
if(DS1302_IO){Data|=(0x01<<i);}
}
DS1302_IO=0;
DS1302_CE=0;
return Data;
}
void DS1302_SetTime()
{
DS1302_WriteByte(DS1302_WP,0x00);
DS1302_WriteByte(DS1302_YEAR,DS1302_Time[0]/10*16+DS1302_Time[0]%10);
DS1302_WriteByte(DS1302_MONTH,DS1302_Time[1]/10*16+DS1302_Time[1]%10);
DS1302_WriteByte(DS1302_DATA,DS1302_Time[2]/10*16+DS1302_Time[2]%10);
DS1302_WriteByte(DS1302_HOUR,DS1302_Time[3]/10*16+DS1302_Time[3]%10);
DS1302_WriteByte(DS1302_MINUTE,DS1302_Time[4]/10*16+DS1302_Time[4]%10);
DS1302_WriteByte(DS1302_SECOND,DS1302_Time[5]/10*16+DS1302_Time[5]%10);
DS1302_WriteByte(DS1302_DAY,DS1302_Time[6]/10*16+DS1302_Time[6]%10);
DS1302_WriteByte(DS1302_WP,0x80);
}
void DS1302_ReadTime()
{
unsigned char temp;
temp=DS1302_ReadByte(DS1302_YEAR);
DS1302_Time[0]=temp/16*10+temp%16;
temp=DS1302_ReadByte(DS1302_MONTH);
DS1302_Time[1]=temp/16*10+temp%16;
temp=DS1302_ReadByte(DS1302_DATA);
DS1302_Time[2]=temp/16*10+temp%16;
temp=DS1302_ReadByte(DS1302_HOUR);
DS1302_Time[3]=temp/16*10+temp%16;
temp=DS1302_ReadByte(DS1302_MINUTE);
DS1302_Time[4]=temp/16*10+temp%16;
temp=DS1302_ReadByte(DS1302_SECOND);
DS1302_Time[5]=temp/16*10+temp%16;
temp=DS1302_ReadByte(DS1302_DAY);
DS1302_Time[6]=temp/16*10+temp%16;
}
DS1302.h
#ifndef __DS1302_H__
#define __DS1302_H__
extern char DS1302_Time[];
void DS1302_Init();
void DS1302_WriteByte(unsigned char Command,Data);
unsigned char DS1302_ReadByte(unsigned char Command);
void DS1302_ReadTime();
void DS1302_SetTime();
#endif
LCD12864有两个CS引脚,分别控制着显示左边、右边两个部分,所以在程序运行时候,也可以看到,LCD1602会左右依次向下显示,直到显示完最后一行。LCD12864代码如下:
LCD12864.c
#include "12864.h"
#include "ziku.h"
void Delay_ms(unsigned int xms) //@11.0592MHz
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=112;j>0;j--);
}
static void LCD12864_Write(bit COM_Data,unsigned char dat) //12864操作函数
{
LCD12864_RS=COM_Data; //指令 0 数据 1
LCDData_Pro=dat; //数据传输至P0扣
LCD12864_EN=1; //置1
_nop_();
LCD12864_EN=0; //置0 产生下降沿
}
void LCD12864_Init(void) //12864初始化
{
Delay_ms(300); //等待系统上电稳定
/******************************************************************************/
LCD12864_EN=1;
LCD12864_RS=1;
LCD12864_CS1=1; //仿真 0 实物 1
LCD12864_CS2=1; //仿真 0 实物 1
Delay_ms(10);
/******************************************************************************/
LCD12864_Write(LCD12864_COM,0x3f); //开显示
/*
LCD12864_Write(LCD12864_COM,0xc0); //这段不写也可以正常显示
LCD12864_Write(LCD12864_COM,0xb8);
LCD12864_Write(LCD12864_COM,0x40);
*/
LCD12864_Write(LCD12864_COM,0x30); //打开基本指令
LCD_Clear(); //清屏
}
/*****************************************************************************
函数功能:清平函数
入口参数:空
说 明:清空整个屏幕数据
版 本:V1.0
时 间:2020年5月9日
*****************************************************************************/
void LCD_Clear(void)
{
unsigned char i,j;
#if LCD_Mode
LCD12864_CS1=1; //选中左半屏
LCD12864_CS2=1; //选中右半屏
#else
LCD12864_CS1=0; //选中左半屏
LCD12864_CS2=0; //选中右半屏
#endif
LCD12864_Write(LCD12864_COM,0xc0); //行
for(i=0;i<8;i++)
{
LCD12864_Write(LCD12864_COM,0xb8+i); //页
for(j=0;j<64;j++)
{
LCD12864_Write(LCD12864_COM,0x40+j); //列
LCD12864_Write(LCD12864_DATA,0x00);
Delay_ms(5); //方便看清屏效果
}
}
}
/*****************************************************************************
函数功能:地址写入函数
入口参数:X,Y
说 明:根据地址自动切换左、右屏
版 本:V1.0
时 间:2020年5月9日
*****************************************************************************/
void LCD12864_X_Y(unsigned char X,unsigned char Y)
{
Y=Y&0x7f; //限定范围,列不能超过127
X=X&0x07; //限定范围,行不能超过7
if(Y<64)
{
#if LCD_Mode
LCD12864_CS1=1; //选中左半屏
LCD12864_CS2=0; //关闭右半屏
#else
LCD12864_CS1=0; //选中左半屏
LCD12864_CS2=1; //关闭右半屏
#endif
LCD12864_Write(LCD12864_COM,0x40+Y); //选择列基地址+Y 一共64行
if(Y==63) Y=64;
}
else
{
#if LCD_Mode
LCD12864_CS1=0; //关闭左半屏
LCD12864_CS2=1; //选中右半屏
#else
LCD12864_CS1=1; //关闭左半屏
LCD12864_CS2=0; //选中右半屏
#endif
Y&=0x3f;
LCD12864_Write(LCD12864_COM,0x40+Y); //选择列基地址+Y 一共64列
}
LCD12864_Write(LCD12864_COM,0xb8+X); //选择页基地址+X 一共7页
}
/*****************************************************************************
函数功能:6*16数值写入函数
入口参数:X,Y,num,*dat
说 明:X_横坐标 Y_纵坐标 num_数组的第num个数 *day_需要显示的数组
版 本:V1.5
修改时间:2022年7月10日
新 增:可实现跨左右屏
*****************************************************************************/
void LCD12864_Write_Number(unsigned char X,unsigned char Y,unsigned char num,unsigned char *dat)
{
unsigned char i;
for(i=0;i<6;i++)
{
LCD12864_X_Y(X,Y+i); //每写一个字节 更新一次Y 防止不能出现跨屏
LCD12864_Write(LCD12864_DATA,dat[num*12+i]); //写上半字 共写6个字节
}
for(i=0;i<6;i++)
{
LCD12864_X_Y(X+1,Y+i); //同上
LCD12864_Write(LCD12864_DATA,dat[num*12+6+i]); //写下半字 共写6个字节
}
}
/*****************************************************************************
函数功能:变量显示函数
入口参数:X,Y,num,len
说 明:在第X行的第Y个位置显示len个num数值
版 本:V1.2
修改时间:2022年7月10日
新 增:自动计算变量长度 最大计数99999
*****************************************************************************/
void LCD12864_Num(unsigned char X,unsigned char Y,unsigned int num)
{
unsigned char i;
unsigned char Len;
unsigned char Dis[5];
unsigned char Buf[5];
sprintf(Buf,"%d",num); //将数值转换成字符串
Len=strlen(Buf); //计算字符串长度
if(Len>4)Dis[Len-5]=num/10000 ; //若数据更大 按照规律写即可
if(Len>3)Dis[Len-4]=num%10000/1000;
if(Len>2)Dis[Len-3]=num%1000/100 ;
if(Len>1)Dis[Len-2]=num%100/10 ;
if(Len>0)Dis[Len-1]=num%10 ;
for(i=0;i<Len;i++) LCD12864_Write_Number(X,Y+(i*6),Dis[i],Num);
}
/*****************************************************************************
函数功能:12*16汉字写入函数
入口参数:X,Y,num,*dat
说 明:X_横坐标 Y_纵坐标 num_数组的第num个数 *day_需要显示的数组
版 本:V1.5
修改时间:2022年7月10日
新 增:左右跨屏
*****************************************************************************/
void LCD12864_Write_Chinese(unsigned char X,unsigned char Y,unsigned char num,unsigned char *dat)
{
unsigned char i;
for(i=0;i<12;i++)
{
LCD12864_X_Y(X,Y+i); //跨屏重要函数 勿删除
LCD12864_Write(LCD12864_DATA,dat[num*24+i]); //写上半字 共写12个字节
}
for(i=0;i<12;i++)
{
LCD12864_X_Y(X+1,Y+i); //同上
LCD12864_Write(LCD12864_DATA,dat[num*24+12+i]); //写下半字 共写12个字节
}
}
/*****************************************************************************
函数功能:英文字母显示函数
入口参数:X,Y,*dat
说 明:X_横坐标 Y_纵坐标 *dat_需要显示的英文字母
版 本:V1.0
修改时间:2022年7月10日
注 明:带字库索引功能
*****************************************************************************/
void LCD12864_Write_English(unsigned char X,unsigned char Y,unsigned char *dat)
{
unsigned char i,j;
unsigned char Len;
Len=strlen(dat); //获取数据长度
for(j=0;j<Len;j++)
{
for(i=0; ;i++) if(English_Buf[i]==*dat) {dat++; break;} //查找字库索引列表
LCD12864_Write_Number(X,Y+(j*6),i,English); //写数据
}
}
///*****************************************************************************
//函数功能:汉字显示函数
//入口参数:X,Y,*dat
//说 明:X_横坐标 Y_纵坐标 *dat_需要显示的汉字
//版 本:V1.0
//修改时间:2022年7月10日
//注 明:带字库索引功能
//注意:存在Bug 暂未修复
//*****************************************************************************/
//void LCD12864_Write_String(unsigned char X,unsigned char Y,unsigned char *dat)
//{
// unsigned char i,j;
// unsigned char Len;
//
// Len=(strlen(dat))/2; //1个汉字2个字节 所以要除以2
//
// for(j=0;j<Len;j++)
// {
// for(i=0; ;i++) if(Chinese_Buf[i]==*dat) {dat++; break;} //存在Bug不能显示第4个汉字
// LCD12864_Write_Chinese(X,Y+(j*12),i,Chinese);
// }
//}
LCD12864.h
#ifndef __12864_H__
#define __12864_H__
#include <REGX52.H>
#include <INTRINS.H>
#include <STRING.H>
#include <STDIO.H>
#define LCD_Mode 0 //0 仿真模式 1 实物模式
#define LCDData_Pro P0 //数据端口
#define LCD12864_COM 0 //指令
#define LCD12864_DATA 1 //数据
/***************************字库名称***********************************/
extern unsigned char code Num[];
extern unsigned char code English[];
extern unsigned char code Chinese[];
extern unsigned char code BMP_Dat[];
/*******************************************************************/
sbit LCD12864_RW =P2^3; //写数据 0 读数据 1 只写数据可以不用这个端口
sbit LCD12864_EN =P2^4; //下降沿时操作有效
sbit LCD12864_RS =P2^5; //指令 0 数据 1
sbit LCD12864_CS2=P2^6; //右半屏
sbit LCD12864_CS1=P2^7; //左半屏
extern void Delay_ms(unsigned int xms);
extern void LCD12864_Init(void);
extern void LCD_Clear(void);
extern void LCD12864_X_Y(unsigned char X,unsigned char Y);
extern void LCD12864_Num(unsigned char X,unsigned char Y,unsigned int num);
extern void LCD12864_Write_Number(unsigned char X,unsigned char Y,unsigned char num,unsigned char *dat);
extern void LCD12864_Write_Chinese(unsigned char X,unsigned char Y,unsigned char num,unsigned char *dat);
extern void LCD12864_Write_English(unsigned char X,unsigned char Y,unsigned char *dat);
//extern void LCD12864_Write_String(unsigned char X,unsigned char Y,unsigned char *dat);
#endif
DHT11使用单总线协议,读出的数据大致有五位,分别是湿度高八位、湿度低八位、温度高八位、温度低八位、校验位,DHT11使用和校验的方式,即前四个字节之后等于第五个字节,若成立,数据正确,若不成立,则数据不正确。
DHT11.c
#include "DHT11.h"
sbit Data=P3^7; //数据线
uchar rec_dat[9]; //储存数据
void DHT11_delay_us(uchar n)
{
while(--n);
}
void DHT11_delay_ms(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
/*
主机(单片机)发送起始信号:
1.主机先拉高data。
2.拉低data延迟18ms。
3.拉高data并延迟等待(通过此操作将单片机引脚设置为输入)。
*/
void DHT11_start()
{
Data=1;
DHT11_delay_us(2);
Data=0;
DHT11_delay_ms(25); //拉低延时18ms以上
Data=1;
DHT11_delay_us(30); //拉高 延时 20~40us,取中间值 30us
}
/*------------------------------------------------
接收八位二进制
------------------------------------------------*/
uchar DHT11_rec_byte() //接收一个字节
{
unsigned char i,dat=0;
for(i=0;i<8;i++) //从高到低依次接收8位数据
{
while(Data); //等待进入低电平
while(!Data); //等待50us低电平过去
DHT11_delay_us(8); //延时60us,如果还为高则数据为1,否则为0
dat<<=1;//移位(低位补零)使正确接收8位数据,数据为0时直接移位
if(Data==1) //数据为1时,使dat加1来接收数据1
dat+=1;
while(Data); //等待数据线拉低
}
return dat;
}
/*------------------------------------------------
接收40bit数据(具体的温湿度)
1.主机先把data线拉高(io设置为输入)。
2.从机把data线拉低,主机读取data线电平,直到低电平结束(大约50us)
从机拉高data线后,延迟40us左右(28~70us之间)主机再次读取data线电平,如果为低电平,则为“0”,如果为高电平,则为“1”。
3.继续重复上述1,2步骤累计40次。
------------------------------------------------*/
uchar T_H;
uchar tem, hum;
void DHT11_receive() //接收40位的数据
{
uchar R_H,R_L,T_L,RH,RL,TH,TL,revise;
DHT11_start();//发送起始信号:
if(Data==0)
{
while(Data==0); //等待拉高
DHT11_delay_us(40); //拉高后延时80us
R_H=DHT11_rec_byte(); //接收湿度高八位
R_L=DHT11_rec_byte(); //接收湿度低八位
T_H=DHT11_rec_byte(); //接收温度高八位
T_L=DHT11_rec_byte(); //接收温度低八位
revise=DHT11_rec_byte(); //接收校正位
DHT11_delay_us(25); //结束
if((R_H+R_L+T_H+T_L)==revise) //最后一字节为校验位,校验是否正确
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
tem = TH;
hum = RH;
/*数据处理,转换为字符,方便显示*/
//湿度
rec_dat[0]=(RH/10);
rec_dat[1]=(RH%10);
rec_dat[2]=' ';
rec_dat[3]=' ';
//温度
rec_dat[4]=(TH/10);
rec_dat[5]=(TH%10);
rec_dat[6]=' ';
}
}
DHT11.h
#ifndef __DHT11_H__
#define __DHT11_H__
#include <REGX52.H>
#define uchar unsigned char
#define uint unsigned int
extern uchar rec_dat[9]; //储存数据
extern uchar tem, hum;
void DHT11_delay_us(uchar n);
void DHT11_delay_ms(uint z);
void DHT11_start();
uchar DHT11_rec_byte();
void DHT11_receive();
#endif
2、设计思路
本次设计采用模式隔离的方式进行运行模式、显示温湿度、调整模式等的隔离,通过按键进行调节,按下模式选择按键,三个模式循环进行切换,实现我们需要的功能。代码如下:
#include <REGX52.H>
#include <stdio.H>
#include "12864.H"
#include "delay.h"
#include "DS1302.h"
#include "KEY.h"
#include "DHT11.h"
#include "UART.h"
sbit led = P1^6;
sbit buz = P1^7;
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
char str[20];
u8 mode=0;
u8 keyNum=0;
char Hour_set1=20, Min_set1=20;
char Hour_set2=9, Min_set2=30;
char Hour_set3=10, Min_set3=30;
u8 n1=0,n2=0,n3=0;
u8 set_cnt=0;
u8 set_pos=0;
char Mon_set=5, Date_set=17;
u8 cnt_flag=0;
u16 cnt=0;
u8 n_flag=0;
u8 tim_flag=0;
u8 temp=0;
void main()
{
led=1;
buz=0;
//DS1302初始化
DS1302_Init();
//LCD初始化
LCD12864_Init();
//串口初始化
UART_Init();
while(1)
{
//获取实时时间
DS1302_ReadTime();
keyNum = KEY();
//按键1翻页
if(keyNum == 1){
mode++;
mode%=3;
LCD_Clear();
set_pos=0;
}
//12/24小时切换
if(keyNum == 7){
tim_flag = !tim_flag;
}
//闹钟提醒
if(n1 == 0){
if(Hour_set1 == DS1302_Time[3] && Min_set1 == DS1302_Time[4] && DS1302_Time[5] == 0){
n_flag=1;
}
}
if(n2 == 0){
if(Hour_set2 == DS1302_Time[3] && Min_set2 == DS1302_Time[4] && DS1302_Time[5] == 0){
n_flag=1;
}
}
if(n3 == 0){
if(Hour_set3 == DS1302_Time[3] && Min_set3 == DS1302_Time[4] && DS1302_Time[5] == 0){
n_flag=1;
}
}
//整点报时
if(DS1302_Time[4] == 0 && DS1302_Time[5] == 0){
cnt_flag=1;
}
//开启闹钟,直到响应按键按下
if(n_flag == 1){
led=0;
buz=1;
if(keyNum == 6){
n_flag=0;
cnt_flag=0;
led=1;
buz=0;
}
}
else if(n_flag==0){
//延时关闭
if(cnt_flag == 1){
led=0;
buz=1;
if(++cnt >= 20){
cnt=0;
cnt_flag=0;
}
}
else{
led=1;
buz=0;
}
}
//模式0
if(mode == 0){
//生日提醒
if(DS1302_Time[1] == Mon_set && DS1302_Time[2] == Date_set){
LCD12864_Write_Chinese(6,0,17,Chinese);
LCD12864_Write_Chinese(6,16,2,Chinese);
LCD12864_Write_Chinese(6,32,21,Chinese);
LCD12864_Write_Chinese(6,48,22,Chinese);
if((DS1302_Time[3] == 6 || DS1302_Time[3] == 12 || DS1302_Time[3] == 18) && (DS1302_Time[4] == 0 && DS1302_Time[5] == 0)){
Serial_SendString("生日快乐\r\n");
}
}
else{
LCD12864_Write_English(6,0," ");
}
//设置位置切换
if(keyNum==3){
set_pos++;
set_pos%=2;
}
//设置生日日期
if(set_pos == 0){
if(keyNum==4){
Date_set--;
if(Date_set<0)Date_set=0;
}
if(keyNum==5){
Date_set++;
}
}
else if(set_pos == 1){
if(keyNum==4){
Mon_set--;
if(Mon_set<0)Mon_set=0;
}
if(keyNum==5){
Mon_set++;
if(Mon_set>12)Mon_set=12;
}
}
//月份设置逻辑
if( Mon_set==1||Mon_set==3||Mon_set==5||Mon_set==7
||Mon_set==8||Mon_set==10||Mon_set==12)
{
if(Date_set>31){Date_set=31;}
}
else if(Mon_set==4||Mon_set==6||Mon_set==9||Mon_set==11)
{
if(Date_set>30){Date_set=30;}
}
else if(Mon_set==2)
{
if(Date_set%4==0)
{
if(Date_set>29){Date_set=29;}
}
else
{
if(Date_set>28){Date_set=28;}
}
}
//显示日期
if(DS1302_Time[0]/10>=1)LCD12864_Num(0,0,DS1302_Time[0]);
else{
LCD12864_Num(0,0,DS1302_Time[0]);
LCD12864_Write_English(0,6," ");
}
LCD12864_Write_Chinese(0,16,0,Chinese);
if(DS1302_Time[1]/10>=1)LCD12864_Num(0,32,DS1302_Time[1]);
else{
LCD12864_Num(0,32,DS1302_Time[1]);
LCD12864_Write_English(0,38," ");
}
LCD12864_Write_Chinese(0,48,1,Chinese);
if(DS1302_Time[2]/10>=1)LCD12864_Num(0,64,DS1302_Time[2]);
else{
LCD12864_Num(0,64,DS1302_Time[2]);
LCD12864_Write_English(0,70," ");
}
LCD12864_Write_Chinese(0,80,2,Chinese);
//24小时制时间
if(tim_flag==0){
//显示时分秒
if(DS1302_Time[3]/10>=1)LCD12864_Num(2,0,DS1302_Time[3]);
else{
LCD12864_Num(2,0,DS1302_Time[3]);
LCD12864_Write_English(0,6," ");
}
LCD12864_Write_English(2,16,":");
if(DS1302_Time[4]/10>=1)LCD12864_Num(2,24,DS1302_Time[4]);
else{
LCD12864_Num(2,24,DS1302_Time[4]);
LCD12864_Write_English(2,30," ");
}
LCD12864_Write_English(2,36,":");
if(DS1302_Time[5]/10>=1)LCD12864_Num(2,44,DS1302_Time[5]);
else{
LCD12864_Num(2,44,DS1302_Time[5]);
LCD12864_Write_English(2,50," ");
}
}
//12小时制时间
else{
//显示时分秒
if((DS1302_Time[3]%12)/10>=1)LCD12864_Num(2,0,DS1302_Time[3]%12);
else{
if(DS1302_Time[3] == 12){
LCD12864_Num(2,0,DS1302_Time[3]);
}else{
LCD12864_Num(2,0,DS1302_Time[3]%12);
LCD12864_Write_English(2,6," ");
}
}
LCD12864_Write_English(2,16,":");
if(DS1302_Time[4]/10>=1)LCD12864_Num(2,24,DS1302_Time[4]);
else{
LCD12864_Num(2,24,DS1302_Time[4]);
LCD12864_Write_English(2,30," ");
}
LCD12864_Write_English(2,36,":");
if(DS1302_Time[5]/10>=1)LCD12864_Num(2,44,DS1302_Time[5]);
else{
LCD12864_Num(2,44,DS1302_Time[5]);
LCD12864_Write_English(2,50," ");
}
}
//显示星期
LCD12864_Write_Chinese(0,96,18,Chinese);
LCD12864_Write_Chinese(0,112,DS1302_Time[6]+4,Chinese);
//显示上午和下午
if(DS1302_Time[3] < 12){
LCD12864_Write_English(2,64,"AM");
}
else{
LCD12864_Write_English(2,64,"PM");
}
//显示生日中文
LCD12864_Write_Chinese(4,0,17,Chinese);
LCD12864_Write_Chinese(4,16,2,Chinese);
LCD12864_Write_English(4,32,":");
//显示生日数据
if(Mon_set >= 10)LCD12864_Num(4,40,Mon_set);
else{
LCD12864_Write_English(4,40," ");
LCD12864_Num(4,44,Mon_set);
}
LCD12864_Write_Chinese(4,56,1,Chinese);
if(Date_set >= 10)LCD12864_Num(4,72,Date_set);
else{
LCD12864_Write_English(4,72," ");
LCD12864_Num(4,78,Date_set);
}
LCD12864_Write_Chinese(4,88,2,Chinese);
}
//显示温度、湿度
else if(mode == 1){
//获取温湿度
DHT11_receive();
//显示温度
LCD12864_Write_Chinese(0,0,12,Chinese);
LCD12864_Write_Chinese(0,16,14,Chinese);
LCD12864_Write_English(0,32,":");
if(tem/10 >= 1){
LCD12864_Num(0,48,tem);
}
else{
LCD12864_Num(0,48,tem);
LCD12864_Write_English(0,54," ");
}
//显示湿度
LCD12864_Write_Chinese(2,0,13,Chinese);
LCD12864_Write_Chinese(2,16,14,Chinese);
LCD12864_Write_English(2,32,":");
if(hum/10 >= 1){
LCD12864_Num(2,48,hum);
}
else{
LCD12864_Num(2,48,hum);
LCD12864_Write_English(2,54," ");
}
}
//显示闹钟、生日
else if(mode==2){
//显示闹钟中文
LCD12864_Write_Chinese(0,0,15,Chinese);
LCD12864_Write_Chinese(0,16,16,Chinese);
LCD12864_Write_English(0,32,":");
//进行多组闹钟的设置
if(keyNum==2){
set_cnt++;
set_cnt%=3;
set_pos=0;
}
//调节设置的时分位置
if(keyNum==3){
set_pos++;
set_pos %= 2;
}
//通过变量进行三个闹钟的设置
if(set_cnt == 0){
if(keyNum==6){
n1 = !n1;
}
//显示提示
LCD12864_Write_English(2,96,"*");
LCD12864_Write_English(4,96," ");
LCD12864_Write_English(6,96," ");
//调节逻辑
if(set_pos == 0){
if(keyNum==4){
Min_set1--;
if(Min_set1<0)Min_set1=59;
}
if(keyNum==5){
Min_set1++;
Min_set1%=60;
}
}
if(set_pos == 1){
if(keyNum==4){
Hour_set1--;
if(Hour_set1<0)Hour_set1=23;
}
if(keyNum==5){
Hour_set1++;
Hour_set1%=24;
}
}
}
//调节闹钟2
if(set_cnt == 1){
if(keyNum==6){
n2 = !n2;
}
LCD12864_Write_English(2,96," ");
LCD12864_Write_English(4,96,"*");
LCD12864_Write_English(6,96," ");
if(set_pos == 0){
if(keyNum==4){
Min_set2--;
if(Min_set2<0)Min_set2=59;
}
if(keyNum==5){
Min_set2++;
Min_set2%=60;
}
}
if(set_pos == 1){
if(keyNum==4){
Hour_set2--;
if(Hour_set2<0)Hour_set2=23;
}
if(keyNum==5){
Hour_set2++;
Hour_set2%=24;
}
}
}
//调节闹钟3
if(set_cnt == 2){
if(keyNum==6){
n3 = !n3;
}
LCD12864_Write_English(2,96," ");
LCD12864_Write_English(4,96," ");
LCD12864_Write_English(6,96,"*");
if(set_pos == 0){
if(keyNum==4){
Min_set3--;
if(Min_set3<0)Min_set3=59;
}
if(keyNum==5){
Min_set3++;
Min_set3%=60;
}
}
if(set_pos == 1){
if(keyNum==4){
Hour_set3--;
if(Hour_set3<0)Hour_set3=23;
}
if(keyNum==5){
Hour_set3++;
Hour_set3%=24;
}
}
}
//判断闹钟1状态
if(n1 == 0){
LCD12864_Write_Chinese(2,64,19,Chinese);
}
else{
LCD12864_Write_Chinese(2,64,20,Chinese);
}
//判断闹钟2状态
if(n2 == 0){
LCD12864_Write_Chinese(4,64,19,Chinese);
}
else{
LCD12864_Write_Chinese(4,64,20,Chinese);
}
//判断闹钟3状态
if(n3 == 0){
LCD12864_Write_Chinese(6,64,19,Chinese);
}
else{
LCD12864_Write_Chinese(6,64,20,Chinese);
}
//显示闹钟数据
if(Hour_set1/10>=1)LCD12864_Num(2,0,Hour_set1);
else{
LCD12864_Num(2,0,Hour_set1);
LCD12864_Write_English(2,6," ");
}
LCD12864_Write_English(2,16,":");
if(Min_set1/10>=1)LCD12864_Num(2,24,Min_set1);
else{
LCD12864_Num(2,24,Min_set1);
LCD12864_Write_English(2,30," ");
}
if(Hour_set2/10>=1)LCD12864_Num(4,0,Hour_set2);
else{
LCD12864_Num(4,0,Hour_set2);
LCD12864_Write_English(4,6," ");
}
LCD12864_Write_English(4,16,":");
if(Min_set2/10>=1)LCD12864_Num(4,24,Min_set2);
else{
LCD12864_Num(4,24,Min_set2);
LCD12864_Write_English(4,30," ");
}
if(Hour_set3/10>=1)LCD12864_Num(6,0,Hour_set3);
else{
LCD12864_Num(6,0,Hour_set3);
LCD12864_Write_English(6,6," ");
}
LCD12864_Write_English(6,16,":");
if(Min_set3/10>=1)LCD12864_Num(6,24,Min_set3);
else{
LCD12864_Num(6,24,Min_set3);
LCD12864_Write_English(6,30," ");
}
}
delay(10);
}
}
另外,对于中文的显示,也需要注意进行取模,一般不带字库的LCD只能显示中文,使用取模软件取得汉字的图形模才可正常显示,以下是正点原子的取模软件:
附上本次项目的取模数据:
#ifndef __ZIKU_H__
#define __ZIKU_H__
unsigned char code Num[]={
0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*-- 文字: 0 --*/
0x00,0x08,0xFC,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x00,/*-- 文字: 1 --*/
0x18,0x84,0x44,0x24,0x18,0x00,0x03,0x02,0x02,0x02,0x02,0x00,/*-- 文字: 2 --*/
0x08,0x04,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*-- 文字: 3 --*/
0xC0,0xA0,0x98,0xFC,0x80,0x00,0x00,0x00,0x02,0x03,0x02,0x00,/*-- 文字: 4 --*/
0x7C,0x24,0x24,0x24,0xC4,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*-- 文字: 5 --*/
0xF0,0x48,0x24,0x24,0xC8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*-- 文字: 6 --*/
0x00,0x04,0xC4,0x34,0x0C,0x00,0x00,0x00,0x03,0x00,0x00,0x00,/*-- 文字: 7 --*/
0xD8,0x24,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*-- 文字: 8 --*/
0x38,0x44,0x44,0x24,0xF8,0x00,0x01,0x02,0x02,0x01,0x00,0x00,/*-- 文字: 9 --*/
0x90,0x60,0xF8,0x60,0x90,0x00,0x00,0x00,0x01,0x00,0x00,0x00,/*-- 文字: * --*/
0x90,0xFC,0x90,0xFC,0x90,0x00,0x00,0x03,0x00,0x03,0x00,0x00,/*-- 文字: # --*/
0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字: - --*/
};
unsigned char code English[]={
0x00,0x40,0xA0,0xA0,0xC0,0x00,0x00,0x01,0x02,0x02,0x03,0x02,/*-- 文字: a 0--*/
0x02,0xFE,0x20,0x20,0xC0,0x00,0x00,0x03,0x02,0x02,0x01,0x00,/*-- 文字: b 1--*/
0x00,0xC0,0x20,0x20,0x60,0x00,0x00,0x01,0x02,0x02,0x01,0x00,/*-- 文字: c 2--*/
0x00,0xC0,0x20,0x22,0xFE,0x00,0x00,0x01,0x02,0x02,0x03,0x02,/*-- 文字: d 3--*/
0x00,0xC0,0xA0,0xA0,0xC0,0x00,0x00,0x01,0x02,0x02,0x02,0x00,/*-- 文字: e 4--*/
0x00,0x20,0xFC,0x22,0x22,0x04,0x00,0x02,0x03,0x02,0x02,0x00,/*-- 文字: f 5--*/
0x00,0x40,0xA0,0xA0,0x60,0x20,0x00,0x05,0x0A,0x0A,0x0A,0x04,/*-- 文字: g 6--*/
0x02,0xFE,0x20,0x20,0xC0,0x00,0x02,0x03,0x02,0x00,0x03,0x02,/*-- 文字: h 7--*/
0x00,0x20,0xE6,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x00,/*-- 文字: i 8--*/
0x00,0x00,0x20,0xE6,0x00,0x00,0x08,0x08,0x08,0x07,0x00,0x00,/*-- 文字: j 9--*/
0x02,0xFE,0x80,0x60,0x20,0x00,0x02,0x03,0x00,0x01,0x02,0x00,/*-- 文字: k 10--*/
0x02,0x02,0xFE,0x00,0x00,0x00,0x02,0x02,0x03,0x02,0x02,0x00,/*-- 文字: l 11--*/
0xE0,0x20,0xE0,0x20,0xC0,0x00,0x03,0x00,0x03,0x00,0x03,0x00,/*-- 文字: m 12--*/
0x20,0xE0,0x20,0x20,0xC0,0x00,0x02,0x03,0x02,0x00,0x03,0x02,/*-- 文字: n 13--*/
0x00,0xC0,0x20,0x20,0xC0,0x00,0x00,0x01,0x02,0x02,0x01,0x00,/*-- 文字: o 14--*/
0x20,0xE0,0x20,0x20,0xC0,0x00,0x08,0x0F,0x0A,0x02,0x01,0x00,/*-- 文字: p 15--*/
0x00,0xC0,0x20,0x20,0xE0,0x00,0x00,0x01,0x02,0x0A,0x0F,0x08,/*-- 文字: q 16--*/
0x20,0xE0,0x40,0x20,0x20,0x00,0x02,0x03,0x02,0x00,0x00,0x00,/*-- 文字: r 17--*/
0x00,0x60,0xA0,0xA0,0x20,0x00,0x00,0x02,0x02,0x02,0x03,0x00,/*-- 文字: s 18--*/
0x00,0x20,0xF8,0x20,0x20,0x00,0x00,0x00,0x03,0x02,0x02,0x00,/*-- 文字: t 19--*/
0x20,0xE0,0x00,0x20,0xE0,0x00,0x00,0x01,0x02,0x02,0x03,0x02,/*-- 文字: u 20--*/
0x20,0xE0,0x00,0xE0,0x20,0x00,0x00,0x00,0x03,0x00,0x00,0x00,/*-- 文字: v 21--*/
0x60,0x80,0xE0,0x80,0x60,0x00,0x00,0x03,0x00,0x03,0x00,0x00,/*-- 文字: w 22--*/
0x20,0x60,0x80,0x60,0x20,0x00,0x02,0x03,0x00,0x03,0x02,0x00,/*-- 文字: x 23--*/
0x20,0xE0,0x00,0x00,0xE0,0x20,0x08,0x08,0x05,0x03,0x00,0x00,/*-- 文字: y 24--*/
0x00,0x20,0xA0,0x60,0x20,0x00,0x00,0x02,0x03,0x02,0x02,0x00,/*-- 文字: z 25--*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字: 52--*/
0x00,0xE0,0x9C,0xF0,0x80,0x00,0x02,0x03,0x00,0x00,0x03,0x02,/*-- 文字: A 26--*/
0x04,0xFC,0x24,0x24,0xD8,0x00,0x02,0x03,0x02,0x02,0x01,0x00,/*-- 文字: B 27--*/
0xF8,0x04,0x04,0x04,0x0C,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*-- 文字: C 28--*/
0x04,0xFC,0x04,0x04,0xF8,0x00,0x02,0x03,0x02,0x02,0x01,0x00,/*-- 文字: D 29--*/
0x04,0xFC,0x24,0x74,0x0C,0x00,0x02,0x03,0x02,0x02,0x03,0x00,/*-- 文字: E 30--*/
0x04,0xFC,0x24,0x74,0x0C,0x00,0x02,0x03,0x02,0x00,0x00,0x00,/*-- 文字: F 31--*/
0xF0,0x08,0x04,0x44,0xCC,0x40,0x00,0x01,0x02,0x02,0x01,0x00,/*-- 文字: G 32--*/
0x04,0xFC,0x20,0x20,0xFC,0x04,0x02,0x03,0x00,0x00,0x03,0x02,/*-- 文字: H 33--*/
0x04,0x04,0xFC,0x04,0x04,0x00,0x02,0x02,0x03,0x02,0x02,0x00,/*-- 文字: I 34--*/
0x00,0x04,0x04,0xFC,0x04,0x04,0x0C,0x08,0x08,0x07,0x00,0x00,/*-- 文字: J 35--*/
0x04,0xFC,0x24,0x50,0x8C,0x04,0x02,0x03,0x02,0x00,0x03,0x02,/*-- 文字: K 36--*/
0x04,0xFC,0x04,0x00,0x00,0x04,0x02,0x03,0x02,0x02,0x02,0x02,/*-- 文字: L 37--*/
0xFC,0x3C,0xC0,0x3C,0xFC,0x04,0x03,0x00,0x03,0x00,0x03,0x02,/*-- 文字: M 38--*/
0x04,0xFC,0x30,0xC4,0xFC,0x04,0x02,0x03,0x02,0x00,0x03,0x00,/*-- 文字: N 39--*/
0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*-- 文字: O 40--*/
0x04,0xFC,0x24,0x24,0x18,0x00,0x02,0x03,0x02,0x00,0x00,0x00,/*-- 文字: P 41--*/
0xF8,0x84,0x84,0x04,0xF8,0x00,0x01,0x02,0x02,0x07,0x05,0x00,/*-- 文字: Q 42--*/
0x04,0xFC,0x24,0x64,0x98,0x00,0x02,0x03,0x02,0x00,0x03,0x02,/*-- 文字: R 43--*/
0x18,0x24,0x24,0x44,0x8C,0x00,0x03,0x02,0x02,0x02,0x01,0x00,/*-- 文字: S 44--*/
0x0C,0x04,0xFC,0x04,0x0C,0x00,0x00,0x02,0x03,0x02,0x00,0x00,/*-- 文字: T 45--*/
0x04,0xFC,0x00,0x00,0xFC,0x04,0x00,0x01,0x02,0x02,0x01,0x00,/*-- 文字: U 46--*/
0x04,0x7C,0x80,0xE0,0x1C,0x04,0x00,0x00,0x03,0x00,0x00,0x00,/*-- 文字: V 47--*/
0x3C,0xC0,0x7C,0xC0,0x3C,0x00,0x00,0x03,0x00,0x03,0x00,0x00,/*-- 文字: W 48--*/
0x04,0x9C,0x60,0x9C,0x04,0x00,0x02,0x03,0x00,0x03,0x02,0x00,/*-- 文字: X 49--*/
0x04,0x3C,0xC0,0x3C,0x04,0x00,0x00,0x02,0x03,0x02,0x00,0x00,/*-- 文字: Y 50--*/
0x0C,0x84,0x64,0x1C,0x04,0x00,0x02,0x03,0x02,0x02,0x03,0x00,/*-- 文字: Z 51--*/
0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*-- 文字: 0 52--*/
0x00,0x08,0xFC,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x00,/*-- 文字: 1 53--*/
0x18,0x84,0x44,0x24,0x18,0x00,0x03,0x02,0x02,0x02,0x02,0x00,/*-- 文字: 2 54--*/
0x08,0x04,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*-- 文字: 3 55--*/
0xC0,0xA0,0x98,0xFC,0x80,0x00,0x00,0x00,0x02,0x03,0x02,0x00,/*-- 文字: 4 56--*/
0x7C,0x24,0x24,0x24,0xC4,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*-- 文字: 5 57--*/
0xF0,0x48,0x24,0x24,0xC8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*-- 文字: 6 58--*/
0x00,0x04,0xC4,0x34,0x0C,0x00,0x00,0x00,0x03,0x00,0x00,0x00,/*-- 文字: 7 59--*/
0xD8,0x24,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*-- 文字: 8 60--*/
0x38,0x44,0x44,0x24,0xF8,0x00,0x01,0x02,0x02,0x01,0x00,0x00,/*-- 文字: 9 61--*/
0x90,0x60,0xF8,0x60,0x90,0x00,0x00,0x00,0x01,0x00,0x00,0x00,/*-- 文字: * 62--*/
0x90,0xFC,0x90,0xFC,0x90,0x00,0x00,0x03,0x00,0x03,0x00,0x00,/*-- 文字: # 63--*/
0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字: - 64--*/
0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,/*-- 文字: : 65--*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,/*-- 文字: . 66--*/
};
unsigned char code English_Buf[]=
{"abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789*#-:.\n"}; //顺序要与字库顺序相同
unsigned char code Chinese[]={
0x00,0x10,0x08,0xCC,0x4A,0x48,0xF8,0x48,0x48,0x48,0x08,0x00,0x02,0x02,0x02,0x03,
0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x02,/*"年",0*/
0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x40,0x60,0x3F,0x04,
0x04,0x04,0x04,0x24,0x64,0x7F,0x00,0x00,/*"月",1*/
0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00,0x3F,0x20,
0x20,0x20,0x20,0x20,0x20,0x3F,0x00,0x00,/*"日",2*/
0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x3E,0x00,0x00,0x02,0x41,0x41,0x49,
0x49,0x49,0x7F,0x49,0x49,0x41,0x41,0x00,/*"星",3*/
0x08,0xFE,0xA8,0xA8,0xFE,0x08,0x00,0xFE,0x22,0x22,0xFE,0x00,0x42,0x33,0x1E,0x02,
0x1F,0x32,0x42,0x1F,0x01,0x41,0x7F,0x00,/*"期",4*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,/*"一",5*/
0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x04,0x04,0x04,0x04,
0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,/*"二",6*/
0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x10,0x11,0x11,
0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x00,/*"三",7*/
0x00,0xF8,0x08,0x08,0xF8,0x08,0xF8,0x88,0x08,0x08,0xF8,0x00,0x00,0x3F,0x24,0x27,
0x21,0x20,0x20,0x21,0x22,0x22,0x3F,0x00,/*"四",8*/
0x00,0x00,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0xC4,0x00,0x00,0x08,0x08,0x08,0x08,
0x08,0x0F,0x08,0x08,0x08,0x0F,0x08,0x08,/*"五",9*/
0x40,0x40,0x40,0x40,0x4C,0x5C,0x58,0x40,0x40,0x40,0x40,0x40,0x00,0x20,0x30,0x0C,
0x07,0x00,0x00,0x03,0x06,0x1C,0x30,0x00,/*"六",10*/
0x40,0x44,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0x44,0x44,0x40,0x20,0x20,0x30,0x1C,
0x07,0x01,0x03,0x06,0x0C,0x38,0x20,0x20,/*"天",11*/
0x44,0xCC,0x98,0x00,0x3E,0x2A,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x10,0x08,0x06,0x20,
0x3F,0x21,0x3F,0x21,0x3F,0x21,0x3F,0x20,/*"温",12*/
0x44,0xCC,0x80,0x7C,0x54,0x54,0x54,0x54,0x54,0x7C,0x00,0x00,0x30,0x1C,0x42,0x58,
0x50,0x7F,0x40,0x7F,0x50,0x4C,0x40,0x00,/*"湿",13*/
0x00,0x00,0xFC,0x04,0x14,0xFC,0x57,0x54,0xFC,0x14,0x04,0x00,0x40,0x60,0x3F,0x00,
0x8C,0x55,0x35,0x35,0x55,0x8C,0x00,0x00,/*"度",14*/
0xF6,0x06,0x20,0xA4,0xA4,0xF4,0xA4,0xA4,0x24,0x04,0xFC,0x00,0x3F,0x00,0x00,0x07,
0x00,0x3F,0x00,0x07,0x20,0x60,0x7F,0x00,/*"闹",15*/
0xA8,0xAC,0xEA,0xA8,0x00,0xF0,0x10,0x10,0xFF,0x10,0x10,0xF0,0x00,0x00,0x7F,0x20,
0x10,0x01,0x01,0x01,0x7F,0x01,0x01,0x01,/*"钟",16*/
0x60,0x10,0x1C,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0x00,0x40,0x42,0x42,0x42,
0x42,0x42,0x7F,0x42,0x42,0x42,0x42,0x40,/*"生",17*/
0x00,0xFE,0x02,0x22,0xAA,0xAA,0xBE,0xAA,0xAA,0x22,0x02,0xFE,0xE0,0x3F,0x00,0x00,
0x07,0x04,0x04,0x04,0x47,0x40,0xC0,0xFF,/*"周",18*/
0x40,0x40,0x44,0x44,0xFC,0x44,0x44,0xFC,0x44,0x44,0x40,0x40,0x00,0x00,0x00,0x00,
0x3F,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,/*"开",19*/
0x00,0x00,0x20,0x24,0x28,0x20,0xF0,0x28,0x24,0x20,0x20,0x00,0x00,0xC1,0x61,0x31,
0x19,0x0D,0x07,0x0D,0x19,0x31,0x61,0xC1,/*"关",20*/
0xF0,0x00,0xFE,0x40,0x10,0x10,0xFF,0x10,0x10,0xF0,0x00,0x00,0x01,0x00,0xFF,0x01,
0xE1,0x31,0x0F,0x09,0x31,0x61,0xC1,0x00,/*"快",21*/
0x00,0xF0,0x08,0x04,0x02,0x01,0xF9,0x01,0x00,0x00,0x00,0x00,0x00,0x31,0x19,0x01,
0x21,0x61,0x7F,0x01,0x09,0x19,0x31,0x00,/*"乐",22*/
};
unsigned char code Chinese_Buf[]=
{"系统初始化测试自动化\n"};
#endif
三、设计演示
程序运行LCD显示时间,生日等信息,如下图:
本次设计生日是9月8日,如果到生日,LCD会显示生日快乐,并且在指定时间段,虚拟终端会打印生日快乐,这里时间并未到,没有打印。
if((DS1302_Time[3] == 6 || DS1302_Time[3] == 12 || DS1302_Time[3] == 18) && (DS1302_Time[4] == 0 && DS1302_Time[5] == 0)){
Serial_SendString("生日快乐\r\n");
}
按下模式切换,进入下一个模式,这是温湿度显示页面,如下:
再次按下模式切换,进入设置闹钟界面,可以设置三个闹钟,并且可以关闭或者开启某个闹钟,如下图,并且都可以使用按键进行调整:
另外,还有一些操作例如12/24小时切换等,这里不做过多演示。
四、项目总结
本次设计,利用LCD12864显示中文,在仿真上设计时钟功能,并且集成了按键,可以进行页面切换,调整等,实现了预期功能,以下是此项目的视频地址,由于录制仓促,效果并不是很好:
参考如下: