基于C8051F020单片机的液晶显示,LCD1602并口驱动,单片机并口驱动LCD1602
一、前言
LCD1602是一种广泛使用的字符型液晶显示模块,有8根数据线和3根控制线E,RS和R/W,8根数据线与单片机P6连接,3根控制线与使用P1口的P1.4、P1.5、P1.6连接,VO连接了P1.7,通过给P1.7赋值0或1,让LCD最亮或最暗。
二、程序展示
1、头文件部分
#include <c8051f020.h>
sbit LCD_VO=P1^7;
sbit LCD_RS=P1^6;
sbit LCD_RW=P1^5;
sbit LCD_EN=P1^4;
sbit LED=P3^4;
unsigned char code List1[] = "LCD-1602";
unsigned char code List2[] = "C8051F020";
unsigned char ch1,ch2;
2、端口初始化
void PORT_Init (void)
{
XBR2 = 0x40; /*使能交叉开关*/
P1MDOUT =0xff;
P3MDOUT =0xff;
P74OUT |= 0xff; /*推挽输出*/
}
3、延时子程序
void delay(uint s)
{
uint x,y;
for(x=0;x<s;x++)
for(y=0;y<121;y++);
}
4、写命令子程序
void WriteCmdLCD(unsigned char CMD)
{
LCD_RS=0;
LCD_RW=0;
P6=CMD;
LCD_EN=1;
delay(50);
LCD_EN=0;
}
5、写数据子程序
void WriteDataLCD(unsigned char Wdata)
{
LCD_RS=1;
LCD_RW=0;
P6=Wdata;
LCD_EN=1;
delay(50);
LCD_EN=0;
}
6、显示单个字符子程序
void DisplayOneChar(unsigned char M, unsigned char N, unsigned char Data)
{
N &= 0x1;
M &= 0xF; //X不能大于15,Y不能大于1
if (N) M |= 0x40; //显示第二行时地址码 0x40;
M |= 0x80; // 计算指令码
WriteCmdLCD(M); //发送地址码
WriteDataLCD(Data);
}
7、显示字符串子程序
void Lcd_Init()
{
WriteCmdLCD(0x38); //初始化为8位数据,双行显示,5X7字型
WriteCmdLCD(0x08); //
WriteCmdLCD(0x01); //
WriteCmdLCD(0x06); //
WriteCmdLCD(0x0c); //
}
8、显示字符串子程序
void Display_List(unsigned char M, unsigned char N, unsigned char code *Data)
{
unsigned char Length_List;
Length_List = 0;
N &= 0x1;
M &= 0xF; //M不能大于15,N不能大于1
while (Data[Length_List]>0x20) //到达字串尾则退出
{
if (M <= 0xF) //M应小于0xF
{
DisplayOneChar(M, N, Data[Length_List]); //显示单个字符
Length_List++;
M++;
}
}
}
9、主程序
void main (void)
{
WDTCN = 0xde;
WDTCN = 0xad; //关闭看门狗
PORT_Init ();
OSCICN |= 0x01;
delay(5000);
LCD_VO=0;
Lcd_Init ();
ch1=0x41;
for(ch2=0;ch2<26;ch2++)
{
LED=0;
delay(500);
WriteDataLCD(ch1);
ch1++;
if(ch1==0x51)
{
WriteCmdLCD(0xc0);
}
if(ch1==0x5b)
{
break;
}
LED=1;
delay(500);
}
delay(2000);
WriteCmdLCD(0x01);
for(ch2=0;ch2<10;ch2++)
{
LED=0;
delay(500);
Display_List(3, 0, List1);
Display_List(2, 1, List2);
LED=1;
delay(500);
}
delay(5000);
}