|
本帖最后由 king@ 于 2016-12-3 23:08 编辑
#include<reg52.h>
/* ***************************************************** */
// 起别名
/* ***************************************************** */
typedef unsigned char uChar8;
typedef unsigned int uInt16;
/* ***************************************************** */
// 字符串定义
/* ***************************************************** */
uChar8 code TAB1[]=" Hello 王勃 ";
uChar8 code TAB2[]="滕王阁序";
uChar8 code TAB3[]="落霞与孤鹜齐飞;";
uChar8 code TAB4[]="秋水共长天一色。";
/* ***************************************************** */
// 位定义
/* ***************************************************** */
sbit RS = P0^3; //数据/命令选择端(H/L)
sbit RW = P0^2; //数/写选择端(H/L)
sbit EN = P0^1; //使能信号
/* ***************************************************** */
// 函数名称:DelayMS()
// 函数功能:延时毫秒数(ValMS)
// 入口参数:无
// 出口参数:无
/* ***************************************************** */
void DelayMS(uInt16 ValMS)
{
uInt16 uiVal,ujVal;
for(uiVal = 0; uiVal < ValMS; uiVal++)
for(ujVal = 0; ujVal < 121; ujVal++);
}
/* ***************************************************** */
// 函数名称:DectectBusyBit()
// 函数功能:检测状态标志位(判断是忙/闲)
// 入口参数:无
// 出口参数:无
/* ***************************************************** */
void DectectBusyBit(void)
{
P3 = 0xff; // 读状态值时,先赋高电平
RS = 0;
RW = 1;
EN = 1;
DelayMS(1);
while(P0 & 0x80); // 若LCD忙,停止到这里,否则走起
EN = 0; // 之后将EN初始化为低电平
}
/* ***************************************************** */
// 函数名称:WrComLCD()
// 函数功能:LCD写指令
// 入口参数:指令(ComVal)
// 出口参数:无
/* ***************************************************** */
void WrComLCD(uChar8 ComVal)
{
DectectBusyBit();
RS = 0;
RW = 0;
EN = 1;
P3 = ComVal;
DelayMS(1);
EN = 0;
}
/* ***************************************************** */
// 函数名称:WrDatLCD()
// 函数功能:LCD写数据
// 入口参数:数据(DatVal)
// 出口参数:无
/* ***************************************************** */
void WrDatLCD(uChar8 DatVal)
{
DectectBusyBit();
RS = 1;
RW = 0;
EN = 1;
P3 = DatVal;
DelayMS(1);
EN = 0;
}
/* ***************************************************** */
// 函数名称:PosLCD()
// 函数功能:输入定位
// 入口参数:无
// 出口参数:无
/* ***************************************************** */
void PosLCD(uChar8 X,uChar8 Y)
{
uChar8 ucPos;
if(X == 1)
{ X = 0x80; } //第一行
else if(X == 2)
{ X = 0x90; } //第二行
else if(X == 3)
{ X = 0x88; } //第三行
else if(X == 4)
{ X = 0x98; } //第四行
ucPos = X + Y; //计算地址
WrComLCD(ucPos); //显示地址
}
/* ***************************************************** */
// 函数名称:LCD_Init()
// 函数功能:LCD初始化
// 入口参数:无
// 出口参数:无
/* ***************************************************** */
void LCD_Init(void)
{
WrComLCD(0x30); // 8位数据端口、选择基本指令
DelayMS(10);
WrComLCD(0x01); // 显示清屏
DelayMS(10);
WrComLCD(0x0C); // 显示设定:整体显示、游标关、不反白
DelayMS(10);
}
/* ***************************************************** */
// 函数名称:main()
// 函数功能:显示定义字符串
// 入口参数:无
// 出口参数:无
/* ***************************************************** */
void main(void)
{
uChar8 ucVal;
LCD_Init();
DelayMS(5);
PosLCD(1,0); // 选择第一行、第一列
while(TAB1[ucVal] != '\0')
{
WrDatLCD(TAB1[ucVal]);
ucVal++;
}
ucVal = 0;
PosLCD(2,0); // 选择第二行、第一列
while(TAB2[ucVal] != '\0')
{
WrDatLCD(TAB2[ucVal]);
ucVal++;
}
ucVal = 0;
PosLCD(3,0); // 选择第三行、第一列
while(TAB3[ucVal] != '\0')
{
WrDatLCD(TAB3[ucVal]);
ucVal++;
}
ucVal = 0;
PosLCD(4,0); // 选择第四行、第一列
while(TAB4[ucVal] != '\0')
{
WrDatLCD(TAB4[ucVal]);
ucVal++;
}
while(1);
}
|
|