基于单片机的液晶日历时钟
Temp=0;
//设定显示位置为第行4列
LCM_POS(0x03);
Delay_ms(1);
//显示Logo第一行
while(Logo1[Temp]!=\0)
{
LCM_DATA(Logo1[Temp]);
Delay_ms(200);
Temp++;
}
Temp=0;
//设定显示位置为第二行1列
LCM_POS(0x40);
Delay_ms(1);
//显示Logo第二行
while(Logo2[Temp]!=\0)
{
LCM_DATA(Logo2[Temp]);
Delay_ms(200);
Temp++;
}
Delay_ms(2000);
//Logo显示完了之后清屏
LCM_CMD(0x01);
Delay_ms(1);
}
4、时钟显示文件
(1)头文件
#ifndef __SHOW_H__
#define __SHOW_H__
extern unsigned char Show_Mark;
#endif
(2)程序文件
#include "reg51.h"
#include "lcm.h"
#include "clock.h"
#include "delay.h"
#include "adjust.h"
//显示计数
unsigned int Show_Count=0;
unsigned char Show_Mark=0;
//定义时钟显示字符串
char Date[]="2011-04-17 SUN";
char Time[]="12:30:30 ";
//定义二维周字符数组
char Week_Name[7][3]={"SUN","MON","TUE","WED","THU","FRI","SAT"};
char Adjust_Mark[7][2]={" ","YY","MM","DD","WW","HH","MM"};
//LCM显示函数
void LCM_SHOW()
{
unsigned char Temp;
//显示之前转化日期为显示字符
Date[0]=Year/1000+0x30;
Date[1]=Year/100%10+0x30;
Date[2]=Year/10%10+0x30;
Date[3]=Year%10+0x30;
Date[5]=Month/10+0x30;
Date[6]=Month%10+0x30;
Date[8]=Day/10+0x30;
Date[9]=Day%10+0x30;
Date[11]=Week_Name[Week][0];
Date[12]=Week_Name[Week][1];
Date[13]=Week_Name[Week][2];
//显示之前转化时间为显示字符
Time[0]=Hour/10+0x30;
Time[1]=Hour%10+0x30;
Time[3]=Minute/10+0x30;
Time[4]=Minute%10+0x30;
Time[6]=Second/10+0x30;
Time[7]=Second%10+0x30;
//显示设定标记
Time[10]=Adjust_Mark[Show_Mark][0];
Time[11]=Adjust_Mark[Show_Mark][1];
Temp=0;
//设定显示位置为第一行1列
LCM_POS(0x01);
Delay_ms(1);
//显示日期和星期
while(Date[Temp]!=\0)
{
LCM_DATA(Date[Temp]);
Temp++;
}
Temp=0;
//设定显示位置为第二行4列
LCM_POS(0x44);
Delay_ms(1);
//显示时间
while(Time[Temp]!=\0)
{
LCM_DATA(Time[Temp]);
Temp++;
}
}
//中断方式显示LCM
void Timer1_Serve()interrupt 3
{
TH1=0xfc;
TL1=0x18;
Show_Count++;
if(Show_Count>100)
{
Show_Count=0;
LCM_SHOW();
}
}
5、按键扫描文件
(1)头文件
#ifndef __KEY_SCAN_H__
#define __KEY_SCAN_H__
#define Key_M 0x10
#define Key_R 0x00
#define Key_U 0x01
#define Key_D 0x02
extern unsigned char Key_Scan();
#endif
(2)程序文件
#include "reg51.h"
#include "delay.h"
#include "key.h"
//按键端口定义
sbit Key1=P3^4;
sbit Key2=P3^5;
sbit Key3=P3^6;
//键盘扫描程序
unsigned char Key_Scan()
{
//先扫描模式选择按键
if(Key1==0)
{
Delay_ms(500); //延时0.5秒,一则为一次短按的最长时间,另则为延时去抖动
if(Key1==0)//判断长短按键
{
while(!Key1);//等待按键释放
Delay_ms(100);//消去释放抖动
return Key_M;
}
else
{
return Key_R;
}
}
else
if(Key2==0) //扫描加一键,有长按不断调整功能
{
Delay_ms(300);
return Key_U;
}
else
if(Key3==0)
{
Delay_ms(300); //扫描减一键,有长按不断调整功能
return Key_D;
}
else return 0xff;
}
6、时钟调整文件
(1)头文件
#ifndef __ADJUST_H__
#define __ADJUST_H__
extern void Adjust();
#endif
(2)程序文件
#include "reg51.h"
#include "Clock.h"
#include "adjust.h"
#include "show.h"
#include "Key.h"
//调整年函数
void Adjust_Year()
{
unsigned char Key_Code;
while(1)
{
Key_Code=Key_Scan();
switch(Key_Code)
{
case Key_R:return;
case Key_U:Year++;break;
case Key_D:Year--;break;
default :break;
}
}
}
//调整月函数
void Adjust_Month()
{
unsigned char Key_Code;
while(1)
{
Key_Code=Key_Scan();
switch(Key_Code)
{
case Key_R:return;
case Key_U:Month++;if(Month>12)Month=1;break;
case Key_D:Month--;if(Month<1)Month=12;break;
default:break;
}
}
}
//调整日函数
void Adjust_Day()
{
unsigned char Key_Code;
//调整日期之前先根据已经调整的月份修改日期
if(Day>Month_Day[Month-1])
{
if((Month!=2)||(!Leap_Year(Year))||(Day>29))Day=1;
}
while(1)
{
Key_Code=Key_Scan();
switch(Key_Code)
{
case Key_R:return;
case Key_U:Day++;
if(Day>Month_Day[Month-1])
{
if((Month!=2)||(!Leap_Year(Year))||(Day>29))Day=1;
}
break;
case Key_D:Day--;
if(Day<1)
{
if((Month==2)&&(Leap_Year(Year)))Day=29;
else Day = Month_Day[Month-1];
}
break;
default :break;
}
}
}
//调整星期函数
void Adjust_Week()
{
unsigned char Key_Code;
while(1)
{
Key_Code=Key_Scan();
switch(Key_Code)
{
case Key_R:return;
case Key_U:Week++;if(Week>=7)Week=0;break;
case Key_D:Week--;if(Week<0) Week=6;break;
default :break;
}
}
}
//调整小时函数
void Adjust_Hour()
{
unsigned char Key_Code;
while(1)
{
Key_Code=Key_Scan();
switch(Key_Code)
{
case Key_R:return;
case Key_U:Hour++;if(Hour>=24)Hour= 0;break;
case Key_D:Hour--;if(Hour<0) Hour=23;break;
default:break;
}
}
}
单片机液晶日历时 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)