//主函數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 |