#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);
}
} |