#include<reg51.h>
#include<string.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#include "LCD1602.H"
uchar code mychar[8][8]={
0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02, //年 0x00
0x0F,0x09,0x0F,0x09,0x0F,0x09,0x13,0x00, //月 0x01
0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F,0x00, //日 0x02
0x10,0x06,0x09,0x08,0x08,0x08,0x09,0x06, // ℃ 0x03
0x01,0x03,0x1D,0x11,0x1D,0x03,0x01,0x00, //小喇叭標記 0x04
0x1F,0x0A,0x0A,0x1F,0x0A,0x0A,0x1A,0x00, // 開 0x05
0x11,0x0A,0x1F,0x04,0x1F,0x0A,0x11,0x00, // 關 0x06
0x04,0x0E,0x0E,0x0E,0x1F,0x1F,0x04,0x00, // 鬧鐘標記 0x07
};
///****************延時函數************************/
//void delay(uint i)
//{
// while(--i); //自減 當i為1時,跳出循環
//}
/****************側忙函數************************/
bit ReadStatusLCD()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_E = 1;
delay(50);
result = (bit)(LCD_Data&0x80); //當LCD_DATA&0x80不為0時result=1,否則result=0
LCD_E = 0;
return result;
}
/****************LCD1602寫指令函數************************/
/*
/*寫指令數據到LCD
/*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。
/*
/*********************************************************/
void WriteCommandLCM(uchar WDLCD)
{
while(ReadStatusLCD());
LCD_RS = 0; //表示向LCM寫入指令
LCD_RW = 0; //表示向LCM寫入指令
/****在高脈沖下命令輸入*****/
LCD_E = 0;
delay(50);
LCD_Data = WDLCD; //指令代碼
delay(50);;
LCD_E = 1;
delay(50);
LCD_E = 0;
}
/****************LCD1602寫數據函數************************/
/*
/*寫顯示數據到LCD
/*RS=H,RW=L,E=高脈沖,D0-D7=數據。
/*
/*******************************************************************/
void WriteDataLCM(uchar WDLCD)
{
while(ReadStatusLCD());
LCD_RS = 1;//寫數據使能
LCD_RW = 0;
/****在高脈沖下數據輸入*****/
LCD_E = 0;
LCD_Data = WDLCD; //數據內容
delay(50);
LCD_E = 1;
delay(50);
LCD_E = 0;
}
/****************CGRAM區寫入自定義的字符************************/
void WriteCGRAM(void)
{
uchar x,y;
WriteCommandLCM(0x40);
for(y = 0; y < 8; y++)
{
for(x = 0; x < 8; x++)
{
WriteDataLCM(mychar[y][x]); //寫入自定義漢字字模,作為臨時字庫。掉電會清除。
}
}
}
extern uchar code time0[]; //顯示日期字符串
extern uchar code time1[]; //顯示時間字符串
/****************初始化LCD1602函數************************/
void LCMInit(void)
{
uchar i;
P2&=~0x10;
delay(50);
WriteCommandLCM(0x38);//顯示模式設置
delay(50);
WriteCommandLCM(0x38);
delay(50);
WriteCommandLCM(0x38);
WriteCommandLCM(0x08);//顯示關閉
delay(50);
WriteCommandLCM(0x01);//清除DDRAM的所有單元,光標被移動到屏幕左上角,也就是清除屏幕內容
WriteCommandLCM(0x06);//光標移動設置整屏不移動
WriteCommandLCM(0x0c);//屏幕開、光標不閃(0)不顯示(0)
delay(50);
WriteCommandLCM(0x80); //指定第一行
for(i = 0;i < 16;i++)
{
WriteDataLCM(time0[i]); //顯示字符 日期
delay(5);
switch(i)
{
case 4 : WriteDataLCM(0x00);break; //顯示自定義漢字 年
case 6 : WriteDataLCM(0x01);break; //顯示自定義漢字 月
case 8 : WriteDataLCM(0x02);break; //顯示自定義漢字 日
}
}
WriteCommandLCM(0x80+0x40); //指定第二行
for(i = 0;i < 12;i++)
{
WriteDataLCM(time1[i]); //顯示字符 時間
delay(5);
}
} |