#include <at89x51.h>
#include "Struct.h"
#include "LCD_Front.h"
#define uchr unsigned char
#define LCD_CS1 P1_2
#define LCD_CS2 P1_3
#define LCD_RS P3_5
#define LCD_RW P3_6
#define LCD_EN P3_7
#define LCD_DATA P2
#define LCD_DISOPEN 0x3f
#define LCD_COLUMN 0x40
#define LCD_PAGE 0xb8
#define LCD_MAX_PAGE 8
#define LCD_ONECHIPMAXCOLUMN 64
#define LCD_MAX_COLUMN 128
#define TIME_POINT_X_SIZE 38
#define TIME_POINT_Y_SIZE 2
#define FONT_TYPE16X16 1
#define FONT_TYPE16X8 0
code Data2XTable[16] = {0x00,0x03,0x0c,0x0f,0x30,0x33,0x3c,0x3f,0xc0,0xc3,0xcc,0xcf,0xf0,0xf3,0xfc,0xff};
bit Un_Flag; //取反标志;
bit Dis_Flag; //时间显示标志。
uchr LcdPage,LcdColumn; //define page and column;
void LCD_Delay(){
uchr i;
for(i = 0;i < 3;i++);
}
//LCD wite instruction;
void LcdWriteIns(uchr LcdChip,uchr LcdInsturction){
//F_Wate_E1(); //
LCD_DATA = LcdInsturction;
LCD_RW = 0; //
LCD_RS = 0; //
if(LcdChip){
LCD_CS1 = 1; //chip 1
LCD_CS2 = 0;
}else{
LCD_CS1 = 0;
LCD_CS2 = 1;
//chip2
}
LCD_EN = 1; //
LCD_Delay();
LCD_EN = 0;
LCD_Delay();
}
//LCD wite Data;
void LcdWriteIns0(uchr LcdInsturction){
LcdWriteIns(0,LcdInsturction);
}
void LcdWriteIns1(uchr LcdInsturction){
LcdWriteIns(1,LcdInsturction);
}
void LcdWriteData(uchr LcdChip,uchr dat)
{
//F_Wate_E1();
if(Un_Flag)LCD_DATA=dat;
else P2=~dat;
LCD_RW = 0; //
LCD_RS = 1; //write data;
if(LcdChip){
LCD_CS1 = 1; //chip 1
LCD_CS2 = 0;
}else{
LCD_CS1 = 0;
LCD_CS2 = 1;
//chip2
}
LCD_EN = 1; //
LCD_Delay();
LCD_EN = 0;
LCD_Delay();
}
void LcdWriteData0(uchr dat){
LcdWriteData(0,dat);
}
void LcdWriteData1(uchr dat){
LcdWriteData(1,dat);
}
void LcdClearScreen()
{
uchr LcdCount;
for(LcdPage=LCD_PAGE;LcdPage<(LCD_PAGE+LCD_MAX_PAGE);LcdPage++) //10111111;
{
LcdWriteIns0(LcdPage); //设置列地址
LcdWriteIns1(LcdPage);
LcdWriteIns0(LCD_COLUMN); //设置页地址
LcdWriteIns1(LCD_COLUMN);
for(LcdCount=0;LcdCount<LCD_ONECHIPMAXCOLUMN;LcdCount++)
{
LcdWriteData0(0x00); //写0;
LcdWriteData1(0x00);
}
}
}
void LcdINI(void ){
LcdWriteIns0(LCD_DISOPEN);
LcdWriteIns1(LCD_DISOPEN);
LcdWriteIns0(0xC0);
LcdWriteIns1(0xC0);//start H;
Un_Flag = 1;
LcdClearScreen();
}
//write 16X8,or 16X16 chaptr
void LcdWriteFont(uchr FontType,uchr *Charptr)
{
uchr i,column0;
LcdWriteIns0(LcdPage|LCD_PAGE);
LcdWriteIns1(LcdPage|LCD_PAGE); //设置页地址
if(LcdColumn<LCD_ONECHIPMAXCOLUMN)LcdWriteIns0(LcdColumn|LCD_COLUMN);//设置列地址
else LcdWriteIns1((LcdColumn-LCD_ONECHIPMAXCOLUMN)|LCD_COLUMN);
column0=LcdColumn;
for(i=0;i<(8<<FontType);i++)
{
if(column0<LCD_ONECHIPMAXCOLUMN)LcdWriteData0(Charptr[i]);
else if(column0<LCD_MAX_COLUMN) LcdWriteData1(Charptr[i]);
column0+=1;
}
LcdWriteIns0(LcdPage+1|LCD_PAGE);
LcdWriteIns1(LcdPage+1|LCD_PAGE);
if(LcdColumn<LCD_ONECHIPMAXCOLUMN)LcdWriteIns0(LcdColumn|LCD_COLUMN);
else LcdWriteIns1((LcdColumn-LCD_ONECHIPMAXCOLUMN)|LCD_COLUMN);
for(;i<(16<<FontType);i++)
{
if(LcdColumn<LCD_ONECHIPMAXCOLUMN)LcdWriteData0(Charptr[i]);
else if(LcdColumn<LCD_MAX_COLUMN)LcdWriteData1(Charptr[i]);
LcdColumn+=1;
}
}
void LcdWriteFont16X16(uchr *Charptr)
{
LcdWriteFont(FONT_TYPE16X16,Charptr);
}
void LcdWriteFont16X8(uchr *Charptr)
{
LcdWriteFont(FONT_TYPE16X8,Charptr);
}
void LcdWrite2XFont16X8(uchr *number)
{
uchr m , i = 0,j, k = 8, page0;
uchr buffer;
for(m = 0;m < 2;m ++){
page0 = LcdPage+m;
i = 0;k = 8;
for(j=0;j<2;j++)
{
if(LcdColumn<LCD_ONECHIPMAXCOLUMN){
LcdWriteIns0(LcdColumn|LCD_COLUMN);
LcdWriteIns0(page0|LCD_PAGE);
}else {
LcdWriteIns1((LcdColumn-LCD_ONECHIPMAXCOLUMN)|LCD_COLUMN);
LcdWriteIns1(page0|LCD_PAGE);
}
page0 += 2;
for(;i<k;i++)
{
if(m == 0)buffer = Data2XTable[number[i]&0x0f];
else buffer = Data2XTable[(number[i]&0xf0)>>4];
if(LcdColumn<LCD_ONECHIPMAXCOLUMN){
LcdWriteData0(buffer);
LcdWriteData0(buffer);
}
else {
LcdWriteData1(buffer);
LcdWriteData1(buffer);
}
}
k+=8; //k*2;
}
}
LcdColumn+=16;
}
void LcdWrite2Number(uchr number){
uchr buffer;
buffer = number&0xf0;
buffer = buffer >> 4;
if(buffer >9)buffer = 9;
LcdWriteFont16X8(LcdFontNumber[buffer]);
buffer = number&0x0f;
if(buffer >9)buffer = 9;
LcdWriteFont16X8(LcdFontNumber[buffer]);
}
void LcdDisTime(date *CurDate,time *CurTime){
uchr timebuffer;
Un_Flag = 1;
LcdPage = 0;LcdColumn = 0;
timebuffer = CurTime->hour&0xf0;
timebuffer = timebuffer >> 4;
LcdWrite2XFont16X8(LcdFontNumber[timebuffer]);
timebuffer =CurTime->hour&0x0f;
LcdWrite2XFont16X8(LcdFontNumber[timebuffer]);
LcdColumn = 48; LcdPage = 0;//note:
timebuffer = CurTime->minute&0xf0;
timebuffer = timebuffer >> 4;
LcdWrite2XFont16X8(LcdFontNumber[timebuffer]);
timebuffer = CurTime->minute&0x0f;
LcdWrite2XFont16X8(LcdFontNumber[timebuffer]);
LcdWriteIns0(TIME_POINT_X_SIZE|LCD_COLUMN);
LcdWriteIns0(TIME_POINT_Y_SIZE|LCD_PAGE);
//LcdWriteIns1(LcdPage|LCD_PAGE);
LcdWriteData0(LcdFontPoint[0]);
LcdWriteData0(LcdFontPoint[1]);
LcdWriteData0(LcdFontPoint[2]);
LcdPage = 2;LcdColumn = 90;
LcdWrite2Number(CurTime->second);
LcdPage = 5;LcdColumn = 0;
LcdWriteFont16X16(xing);
LcdWriteFont16X16(qi);
LcdWriteFont16X8(LcdFontNumber[CurDate->week]);
LcdColumn = 48;
LcdWrite2Number(CurDate->month);
LcdWriteFont16X16(yue);
LcdWrite2Number(CurDate->day);
LcdWriteFont16X16(ri);
}
void LcdDisTimeSet(time *CurTime,enum UI_UPDATESTATUS_E UiUpdateStatus){
LcdPage = 0;LcdColumn = 0;
LcdWriteFont16X16(shi);
LcdWriteFont16X16(jian);
LcdWriteFont16X16(she);
LcdWriteFont16X16(zhi);
LcdPage = 2;LcdColumn = 0;
if(UiUpdateStatus == UI_UPDATE_HOUR)Un_Flag = 0;
LcdWrite2Number(CurTime->hour);
Un_Flag = 1;
LcdWriteFont16X16(shi);
if(UiUpdateStatus == UI_UPDATE_MINUTE)Un_Flag = 0;
LcdWrite2Number(CurTime->minute);
Un_Flag = 1;
LcdWriteFont16X16(fen);
}
void LcdDisDateSet(date*CurDate,enum UI_UPDATESTATUS_E UiUpdateStatus){
LcdPage = 0;LcdColumn = 0;
LcdWriteFont16X16(ri);
LcdWriteFont16X16(qi);
LcdWriteFont16X16(she);
LcdWriteFont16X16(zhi);
LcdPage = 2;LcdColumn = 0;
LcdWrite2Number(0x20);
if(UiUpdateStatus == UI_UPDATE_YEAR)Un_Flag = 0;
LcdWrite2Number(CurDate->year);
Un_Flag = 1;
LcdWriteFont16X16(nian);
if(UiUpdateStatus == UI_UPDATE_MONTH)Un_Flag = 0;
LcdWrite2Number(CurDate->month);
Un_Flag = 1;
LcdWriteFont16X16(yue);
if(UiUpdateStatus == UI_UPDATE_DATE)Un_Flag = 0;
LcdWrite2Number(CurDate->day);
Un_Flag = 1;
LcdWriteFont16X16(ri);
LcdPage = 4;LcdColumn = 0;
LcdWriteFont16X16(xing);
LcdWriteFont16X16(qi);
if(UiUpdateStatus == UI_UPDATE_WEEK)Un_Flag = 0;
LcdWrite2Number(CurDate->week);
Un_Flag = 1;
}
void LcdDisAlarmSet(time *CurTime,enum UI_UPDATESTATUS_E UiUpdateStatus){
LcdPage = 0;LcdColumn = 0;
LcdWriteFont16X16(nao);
LcdWriteFont16X16(zhong);
LcdWriteFont16X16(she);
LcdWriteFont16X16(zhi);
LcdPage = 2;LcdColumn = 0;
if(UiUpdateStatus == UI_UPDATE_ALHOUR)Un_Flag = 0;
LcdWrite2Number(CurTime->hour);
Un_Flag = 1;
LcdWriteFont16X16(shi);
if(UiUpdateStatus == UI_UPDATE_ALMINUTE)Un_Flag = 0;
LcdWrite2Number(CurTime->minute);
Un_Flag = 1;
LcdWriteFont16X16(fen);
LcdPage = 4;
DS1307驱动+LCD显示
4星 · 超过85%的资源 需积分: 50 120 浏览量
2010-09-19
14:46:39
上传
评论 3
收藏 81KB RAR 举报
wuhai85
- 粉丝: 0
- 资源: 1
- 1
- 2
前往页