标题:
Arduino驱动LCD1602液晶程序
[打印本页]
作者:
滚去学习
时间:
2021-10-24 20:52
标题:
Arduino驱动LCD1602液晶程序
LCD1602的V0是背光可接Arduino的GND
#define RS_CLR digitalWrite(13,LOW);
#define RS_SET digitalWrite(13,HIGH);
#define RW_CLR digitalWrite(12,LOW);
#define RW_SET digitalWrite(12,HIGH);
#define EN_CLR digitalWrite(11,LOW);
#define EN_SET digitalWrite(11,HIGH);
unsigned char arr[]="Hello Word!"; //16个字符以内
void setup() {
pinMode(2,OUTPUT);//D7
pinMode(3,OUTPUT);//D6
pinMode(4,OUTPUT);//D5
pinMode(5,OUTPUT);//D4
pinMode(6,OUTPUT);//D3
pinMode(7,OUTPUT);//D2
pinMode(8,OUTPUT);//D1
pinMode(9,OUTPUT);//D0
// pinMode(10,OUTPUT);
pinMode(11,OUTPUT);//EN
pinMode(12,OUTPUT);//RW
pinMode(13,OUTPUT);//RS
}
void loop() {
LCD_Init();
LCD_Clear();//清屏
LCD_Write_Char(7,0,'o');
LCD_Write_Char(8,0,'k');
LCD_Write_String(1,1,arr);
delay(1000);
delay(1000);
delay(1000);
delay(1000);
delay(1000);
}
//模拟单片机八位输出
void DataPort(unsigned char data)
{
if(data&0x80)digitalWrite(2,1);
else digitalWrite(2,0);
if(data&0x40)digitalWrite(3,1);
else digitalWrite(3,0);
if(data&0x20)digitalWrite(4,1);
else digitalWrite(4,0);
if(data&0x10)digitalWrite(5,1);
else digitalWrite(5,0);
if(data&0x08)digitalWrite(6,1);
else digitalWrite(6,0);
if(data&0x04)digitalWrite(7,1);
else digitalWrite(7,0);
if(data&0x02)digitalWrite(8,1);
else digitalWrite(8,0);
if(data&0x01)digitalWrite(9,1);
else digitalWrite(9,0);
}
/*------------------------------------------------
判忙函数
------------------------------------------------*/
char LCD_Check_Busy(void)
{
unsigned char x;
DataPort(0xFF);
RS_CLR;
RW_SET;
EN_CLR;
delay(1);
EN_SET;
pinMode(13,INPUT);
x=digitalRead(13);
pinMode(13,OUTPUT);
if(x) return 0;
else return 1;
}
/*------------------------------------------------
写入命令函数
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{
while(LCD_Check_Busy()); //忙则等待
delay(5);
RS_CLR;
RW_CLR;
EN_SET;
DataPort(com);
delay(1);
EN_CLR;
}
/*------------------------------------------------
写入数据函数
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
//while(LCD_Check_Busy()); //忙则等待
delay(5);
RS_SET;
RW_CLR;
EN_SET;
DataPort( Data);
delay(1);
EN_CLR;
}
/*------------------------------------------------
清屏函数
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
delay(5);
}
/*------------------------------------------------
写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{
if (y == 0)
{
LCD_Write_Com(0x80 + x); //表示第一行
}
else
{
LCD_Write_Com(0xC0 + x); //表示第二行
}
while (*s)
{
LCD_Write_Data( *s);
s ++;
}
}
/*------------------------------------------------
写入字符函数
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{
if (y == 0)
{
LCD_Write_Com(0x80 + x);
}
else
{
LCD_Write_Com(0xC0 + x);
}
LCD_Write_Data( Data);
}
/*------------------------------------------------
初始化函数
------------------------------------------------*/
void LCD_Init(void)
{
LCD_Write_Com(0x38); /*显示模式设置*/
delay(5);
LCD_Write_Com(0x38);
delay(5);
LCD_Write_Com(0x38);
delay(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08); /*显示关闭*/
LCD_Write_Com(0x01); /*显示清屏*/
LCD_Write_Com(0x06); /*显示光标移动设置*/
delay(5);
LCD_Write_Com(0x0C); /*显示开及光标设置*/
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1