//主函数main.c
#include<reg51.h>
#include"lcd.h"
u8 Disp[]="i want you yes do a b c";
void Delay10ms(unsigned int c) ;
void main(void)
{
u8 i;
LcdInit();
//--写第二行
LcdWriteCom(0xC0); //设置坐标在第二行 想要在第二行显示数据,必须再次定位指针的位置,即使在lcd.c中进行了指针定位
for(i=0; i<26; i++)
{
LcdWriteData(Disp[ i]);
}
LcdWriteCom(0x07); //设置每写一次整屏右移
while(1)
{
LcdWriteCom(0xC0); //设置坐标在第二行
for(i=0; i<26; i++)
{
LcdWriteData(Disp[ i]);
Delay10ms(100);
}
}
}
void Delay10ms(unsigned int c) //误差 0us
{
unsigned char a, b;
//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
//lcd.c
#include"lcd.h"
void Lcd1602_Delay1ms(u16 c)
{
u8 a, b;
for(; c > 0; c--)
{
for(b = 199; b > 0; b--)
for(a = 1; a > 0; a--);
}
}
#ifndef LCD1602_4PINS
void LcdInit()
{
LcdWriteCom(0x38); //开显示,显示一行
LcdWriteCom(0x0c); //开显示不显示指针
LcdWriteCom(0x06); //写一个指针加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //设置数据指针起点
// LcdWriteCom(0x80+0x40); //将指针放在第二行首位
}
#else
void LcdInit()
{
LcdWriteCom(0x32); //将8位总线转为4位总线
LcdWriteCom(0x2c); //在4位线下的初始化,两行
LcdWriteCom(0x0C); //开显示不显示指针
LcdWriteCom(0x06); //写一个指针加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //设置数据指针起点
// LcdWriteCom(0x80+0x40); //将指针放在第二行首位
}
#endif
#ifndef LCD1602_4PINS
void LcdWriteCom(u8 dat)
{
LCD1602_E = 0; //使能
LCD1602_RS = 0; //选择发送命令
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat; //放入命令
Lcd1602_Delay1ms(1); //等待数据稳定
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
#else
void LcdWriteCom(u8 dat)
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 0; //选择写入命令
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat; //传送高四位
Lcd1602_Delay1ms(1); //等待数据稳定
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
LCD1602_DATAPINS = dat << 4; //传送低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
#endif // LCD1602_4PINS
#ifndef LCD1602_4PINS
void LcdWriteData(u8 dat)
{
LCD1602_E = 0; //使能
LCD1602_RS = 1; //选择输入数据
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat; //写入数据
Lcd1602_Delay1ms(1); //等待数据稳定
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
#else
void LcdWriteData(u8 dat)
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //选择写入数据
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat; //传送高四位
Lcd1602_Delay1ms(1); //等待数据稳定
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
LCD1602_DATAPINS = dat << 4; //传送低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
#endif // LCD1602_4PINS
//lcd.h
#ifndef _lcd_H
#define _lcd_H
#include<reg51.h>
#define u8 unsigned char
#define u16 unsigned int
//#define LCD1602_4PINS
#define LCD1602_DATAPINS P0
sbit LCD1602_E =P2^7;
sbit LCD1602_RS=P2^6;
sbit LCD1602_RW=P2^5;
void LcdWriteData(u8 dat);
void LcdWriteCom(u8 dat);
void LcdInit();
#endif |