我的LCD1602是带转接板的,DATA 8PIN 同时 也存在 4PIN接口。开始时只写8PIN状态下的程序,液晶显示是错误的,研究好久才发现要把4PIN的存在
同时写进去,用或不用就用#ifndef #else #endif 来解决。
P0口对应数据总线
一下是我写的
#include<reg52.h>
//#ifndef __LCD_H_
//#define __LCD_H_
/**********************************
当使用的是4位数据传输的时候定义,
使用8位取消这个定义
**********************************/
#define LCD1602_4PINS
//---重定义关键词---//
//#ifndef uchar
#define uchar unsigned char
//#endif
//#ifndef uint
#define uint unsigned int
//#endif
uchar code table[]="I LOVE MCU!";
uchar code table1[]="WWW.XTLCU.COM";
sbit lcde=P2^7;
sbit lcdrs=P2^6;
sbit lcdwr=P2^5;
void delay(uint z);
/*******************************************************************************
* 函 数 名 : Write_Com
* 函数功能 : 向LCD写入一个字节的命令
* 输 入 : com
* 输 出 : 无
*******************************************************************************/
#ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时
void write_com(uchar com)
{
lcde=0;
lcdrs=0; //选择发送命令
lcdwr=0;
P0=com; //放入命令
delay(5);
lcde=1; //写入时序
delay(5); //保持时间
lcde=0;
}
#else
void write_com(uchar com)
{
lcde=0;
lcdrs=0; //选择发送命令
lcdwr=0;
P0=com; //放入命令
delay(5);
lcde=1; //写入时序
delay(5); //保持时间
lcde=0;
P0=com << 4; //发送低四位
delay(5);
lcde=1; //写入时序
delay(5);
lcde=0;
}
#endif
/*******************************************************************************
* 函 数 名 : Write_Data
* 函数功能 : 向LCD写入一个字节的数据
* 输 入 : dat
* 输 出 : 无
*******************************************************************************/
#ifndef LCD1602_4PINS
void write_data(uchar date)
{ lcde=0;
lcdrs=1; //选择输入数据
lcdwr=0;
P0=date; //写入数据
delay(5);
lcde=1; //写入时序
delay(5); //保持时间
lcde=0;
}
#else
void write_data(uchar date)
{ lcde=0;
lcdrs=1; //选择输入数据
lcdwr=0;
P0=date; //写入数据
delay(5);
lcde=1; //写入时序
delay(5); //保持时间
lcde=0;
P0=date<<4; //写入低四位
delay(5);
lcde=1; //写入时序
delay(5); //保持时间
lcde=0;
}
#endif
/*******************************************************************************
* 函 数 名 : LcdInit()
* 函数功能 : 初始化LCD屏
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
#ifndef LCD1602_4PINS
void init()
{
lcde=0;
write_com(0x38);//设置16x2显示,5x7点阵,8位数据接口
write_com(0X0c);//开显示,显示光标,光标闪烁
write_com(0X06);//写一个字符后地址针加一,光标加一
write_com(0X01);//数据指针清零,所有显示清零
write_com(0X80);
}
#else
void init()
{
lcde=0;
write_com(0x32);//将8位总线转为4位总线
write_com(0X28); //在四位线下的初始化
write_com(0X0c);
write_com(0X06);
write_com(0X1);
write_com(0X80);
}
#endif
void main()
{ uchar num;
init();
//write_com(0x80);//设置数据地址指针 液晶显示RAM 有 80个字节 00H~27H 40H~67H,第一行第一个字处
for(num=0;num<11;num++)
{
write_data(table[num]);
delay(5);
}
write_com(0x80+0x40);//第二行第一个字处
for(num=0;num<13;num++)
{
write_data(table1[num]);
delay(5);
}
delay(5);
while(1);
}
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
|