LCD1602和LCD12864液晶四位显示
LCD1602和LCD12864是常用的液晶显示器件,与单片机连接有8位、4位和串口方式。8位显示时,首先要选择单片机的一个8位端口与液晶的数据引脚(D7-D0)相连,还需另选一个端口与RS、RW和E三个控制引脚相连,多余5个这个端口引脚与RS、RW和E三个控制引脚构成互斥关系,造成程序编程设计上的难度,如果舍弃这五个引脚,则需占用单片机的两个端口引脚才能完成液晶显示。在复杂电路设计中由于端口受限所以造成设计无法完成,须采用更多端口引脚的单片机才能完成设计。
本文利用LCD1602和LCD12864均具有的四位显示方式,将8位数据分成高四位和低四位分时传输,将单片机的低四位与液晶屏的高四位连接,将单片机的高四位与RS、RW和E三个控制引脚连接,完成了只用单片机一个端口即可完成显示任务,给设计带来极大的方便。
下面的一个例子是使用P0口的低4位连接到LCD1602的高4位数据线。RS、RW、E则分别连接到P0.4、P0.5、P0.6 。只用一个端口即完成了与LCD1602的数据传输。如图2。这里要特别指出LCD1602的低四位虽然不用,但也要如图中所示那样通过1K电阻接高电平,否则LCD1602是无法工作的。
图2 1602四位连接图
源代码:
/*
* 1602.h
* Author: 程静涛
*/
#ifndef _u1602_H_
#define _u1602_H_
#define uchar unsigned char
#define uint unsigned int
sbit RS =P0^4;
sbit RW=P0^5;
sbit EN =P0^6;
//延时程序
void delay1(uint i)
{
uint j;
while(--i!=0)
{
for(j=0;j<255;j++);
}
}
//写指令
Void W_com(uchar com)
{
EN=0;
RS=0;
RW=0;
P0=0x80|((com & 0xf0)>>4);//送高四位数据到P0口,同时保持P0高四位。
EN=1;
delay1(5);
EN=0;
P0=0x80|(com & 0x0f); //送低四位数据到P0口,同时保持P0高四位。
EN=1;
delay1(5);
EN=0;
}
//写数据
void W_datd(uchar dat)
{
EN=0;
RS=1;
RW=0;
P0=0x90|((dat & 0xf0)>>4);//送高四位数据到P0口,同时保持P0高四位。
EN=1;
delay1(5);
EN=0;
P0=0x90|(dat & 0x0f); //送低四位数据到P0口,同时保持P0高四位。
EN=1;
delay1(5);
EN_0;
}
//lcd初始化程序
void lcdinit()
{delay1(30);
W_com(0x02);//光标归位
W_com(0x28);//四位传输
W_com(0x0c);// 显示功能开,无光标、无闪烁。
W_com(0x06);// 写入新数据后光标右移
W_com(0x01);//清屏
delay1(10);
}
//在指定位置显示一个字符,x为行,Y为列;
void displaydat(uchar x,uchar y,uchar one)
{
uchar add;
if (x == 0) add=0x80+y;
else add=0xc0+y;
W_com(add);
W_datd(one);
}
//显示字符串
void displaystr(uchar x,uchar y,uchar *s)
{
y=y&0x0f;
while(*s)
{
displaydat(x,y,*s);
y++;
s++;
}
}
#endif /* 1602_H_ */
主程序
/* Processor: AT89C52
* Compiler: Keil for 8051
*/
#include
#include <stdio.h>
#include "u1602.h"
#define uint unsigned int
#define uchar unsigned char
uchar table[]="LCD1602 Line 4";
uchar table1[]="Welcome to study";
void main(void)
{ lcdinit();
displaystr(0,0,table);
delay1(5);
displaystr(1,0,table1);
// Write your code here
while (1)
;
}
下面的一个例子是使用P0口的低4位连接到LCD12864的高4位数据线。RS、RW、E则分别连接到P0.4、P0.5、P0.6 。只用一个端口即完成了与LCD12864的数据传输。如图3。这里要特别指出LCD12864的低四位虽然不用,但也要如图中所示那样通过1K电阻接高电平,否则LCD12864是无法工作的。如图3
图3 LCD12864四位显示
#include
#include
#include
#define dely(); {_nop_();_nop_();_nop_();_nop_();};
#define uchar unsigned char
#define uint unsigned int
/*12864 端口定义*/
#define LCD_data P0 //数据口
sbit RS = P0^4; //寄存器选择输入
sbitRW = P0^5; //液晶读/写控制
sbitE = P0^6; //液晶使能控制
uchar code str1[] = {"欢迎学习单片机"};
uchar code str2[] = {"字符显示模式"};
uchar code str3[] = {"LCD12864四位 "};
uchar code dis4[] = {"交流QQ:812549630 "};
uchar code table1[]={//自定义字库
0x02,0x00,0x03,0x80,0x03,0x83,0xFF,0xFF,0xFF,0xFF,0xC3,0x83,0xFF,0xFF,0xFF,0xFF,
0xC3,0x83,0xFF,0xFF,0xFF,0xFF,0x03,0x80,0x03,0x82,0x03,0xFE,0x01,0xFC,0x00,0xF8,//电
0x00,0x0C,0x7F,0xFE,0x7F,0xFF,0x00,0x1C,0x00,0x78,0x01,0xE0,0x01,0xC0,0x00,0xC0,
0xFF,0xFF,0x7F,0xFF,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x1F,0xC0,0x0F,0xC0,0x03,0x80,//子
0x03,0x18,0x33,0x1C,0x33,0x1C,0x33,0x18,0x33,0x18,0xFF,0xFF,0xFF,0xFF,0x33,0x18,
0x33,0x18,0x33,0x18,0x33,0xF8,0x33,0xF8,0x30,0x01,0x30,0x03,0x3F,0xFF,0x1F,0xFE,//世
0x30,0x0C,0x3F,0xFE,0x3F,0xFC,0x33,0xCC,0x3F,0xFC,0x3F,0xFC,0x33,0xCC,0x3F,0xFC,
0x3F,0xFC,0x0F,0x60,0x1E,0x30,0x3E,0x3C,0x76,0x3E,0xE6,0x37,0x0E,0x30,0x3C,0x30};//界
unsigned char code Photo1[] = //图形
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,
0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x18,
0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x14,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF2,0xFE,
0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xF2,0x88,
0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xF7,0xE8,
0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF2,0xA8,
0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF3,0xAA,
0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF6,0xEE,
0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xAC,
0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF3,0x8C,
0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x13,
0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x20,
0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0xF0,0x40,
0xF0,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xF0,0x30,
0xF0,0x00,0x00,0x00,0x00,0x0F,0xFE,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xF0,0x00,
0xF0,0x00,0x00,0x00,0x00,0x3F,0xFF,0x80,0x00,0x00,0x3C,0x00,0x00,0x00,0xF7,0xFF,
0xF0,0x00,0x00,0x00,0xFE,0x7F,0x0F,0xC0,0x00,0x00,0x3C,0x00,0x00,0x00,0xF0,0x20,
0xF0,0x00,0x00,0x03,0xFF,0xF8,0x03,0xE0,0x00,0x00,0x3C,0x00,0x00,0x00,0xF3,0xFE,
0xF0,0x00,0x00,0x07,0xFF,0xF0,0x3F,0xFF,0x80,0x00,0x3C,0x00,0x00,0x00,0xF2,0x22,
0xF0,0x00,0x00,0x0F,0x03,0xE0,0x3F,0xFF,0x83,0xFC,0x3C,0x00,0x00,0x00,0xF2,0x22,
0xF0,0x00,0x0F,0xEE,0x01,0xC0,0x3F,0xFF,0x9F,0xFF,0x3C,0x1F,0xC0,0x00,0xF2,0x22,
0xF0,0x00,0x3F,0xFE,0x01,0xE0,0x3B,0xBB,0xFF,0xFF,0xFE,0xFF,0xF8,0x00,0xF2,0x22,
0xF7,0xE0,0xFF,0xFC,0x01,0xE0,0x3B,0xBB,0xF8,0x03,0xFF,0xFF,0xFC,0x00,0xF2,0x22,
0xFF,0xF9,0xF0,0x1C,0x00,0x00,0x3B,0xBB,0xF0,0x00,0xFF,0xE0,0x3E,0x00,0xF0,0x20,
0xFF,0xFF,0xC0,0x00,0x00,0x00,0x3B,0xBB,0xC0,0x03,0xFF,0xC0,0x0F,0x00,0xF0,0x00,
0xF8,0x3F,0xBF,0xFF,0xFF,0xE0,0x3B,0xBB,0x9F,0xFB,0xFF,0xE0,0x07,0xFE,0xF0,0x00,
0xF0,0x0F,0x3F,0xFF,0xFF,0xE0,0x3B,0xBB,0x9F,0xFB,0xFF,0xC0,0x03,0xFE,0xF3,0xFC,
0xF0,0x0E,0x3F,0xFF,0xFF,0xE0,0x3B,0xBB,0x9F,0xFB,0xFF,0xC0,0x07,0xFE,0xF2,0x04,
0xF0,0x1C,0x3C,0x00,0x00,0xE0,0x3B,0xBB,0x9F,0xF9,0xFF,0xC0,0x0F,0x80,0xF3,0x0C,
0xF0,0x1C,0x3F,0xFF,0xFF,0xE0,0x3B,0xBB,0x9F,0xF9,0xFF,0xC0,0x0E,0x00,0xF2,0xB4,
0xF0,0x38,0x3F,0xFF,0xFF,0xE0,0x3B,0xBB,0x9F,0xF8,0xFF,0x80,0x1E,0x00,0xF2,0x64,
0xF0,0x38,0x3F,0xFF,0xFF,0xE0,0x3B,0xBB,0x9F,0xFF,0xFF,0xF0,0x1C,0x00,0xF2,0x94,
0xF0,0x30,0x3F,0xFF,0xFF,0xE0,0x3B,0xBB,0x9F,0xFF,0xFF,0xF0,0x1C,0x00,0xF3,0x0C,
0xF0,0x00,0x3F,0xFF,0xFF,0xE0,0x3B,0xBB,0x9F,0xFF,0xFF,0xF0,0x00,0x00,0xF4,0x04,
0xF0,0x00,0x3F,0xFF,0xFF,0xE0,0x3B,0xBB,0x9F,0xFF,0x6F,0xB0,0x00,0x00,0xF8,0x06,
0xF0,0x00,0x3F,0xFF,0xFF,0xE0,0x3B,0xBB,0x9F,0xFF,0xFF,0xB0,0x00,0x00,0xF0,0x03,
0xF0,0x00,0x3F,0xFF,0xFF,0xEF,0xFB,0xBB,0x9F,0xFF,0xFF,0xB0,0x00,0x00,0xF0,0x00,
0xF7,0xFF,0xFF,0xFF,0xFB,0x6F,0xFB,0xBB,0x9F,0xFF,0x7F,0xF0,0x00,0x00,0xF0,0x00,
0xF7,0xFF,0xFF,0xFF,0xFF,0x6F,0xFB,0xBB,0x9F,0xFF,0x7F,0xF0,0x00,0x00,0xF1,0x0C,
0xF7,0xFF,0xFF,0xFF,0xFF,0x6F,0xFB,0xBB,0x9F,0xFF,0xFF,0xB0,0x00,0x00,0xF2,0x18,
0xF7,0xFF,0xFF,0xFF,0xFF,0x6F,0xFB,0xBB,0x9F,0xFF,0xFF,0xB0,0x00,0x00,0xF7,0xBE,
0xF7,0xFF,0xFF,0xFF,0xFF,0x6F,0xFB,0xBB,0x9F,0xFF,0x7F,0xF0,0x00,0x00,0xFD,0x22,
0xF7,0xFF,0xFF,0xFF,0xFF,0x6F,0xFB,0xBB,0x9F,0xFF,0x7F,0xFF,0xFF,0xFF,0xF3,0x3E,
0xF7,0xFF,0xFC,0x00,0x07,0x6F,0xFB,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFD,0x22,
0xF7,0xFF,0xFC,0x00,0x07,0x6F,0xFB,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xF1,0xBE,
0xF7,0xFF,0xFC,0x00,0x00,0x0F,0xFB,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xF3,0x94,
0xF7,0xFF,0xFD,0xBB,0xF7,0x6F,0xFB,0xFB,0xBB,0xFF,0x7F,0xFF,0xFF,0xFF,0xF7,0x94,
0xF7,0xFF,0xFF,0xBB,0xF7,0x6F,0xFB,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xF9,0x94,
0xF7,0xFF,0xFF,0xBB,0xF7,0x6F,0xFB,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFE,0xF7,0x94,
0xF7,0xFF,0xFD,0xBB,0xF7,0x6F,0xFB,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFE,0xF9,0x14,
0xF7,0xFF,0xFD,0xBB,0xB7,0x6F,0xFB,0xFB,0xBB,0xFF,0x7F,0xFF,0xFF,0xFE,0xF7,0xA4,
0xF7,0xFF,0xFF,0xBB,0xF7,0x6F,0xFB,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFE,0xF9,0x42,
0xF7,0xFF,0xFF,0xBB,0xF7,0x6F,0xFB,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xF6,0x01,
0xF7,0xFF,0xFD,0xBB,0xF7,0x6F,0xFB,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xF0,0x00,
0xF7,0xFF,0xFD,0xBB,0xF7,0x6F,0xFB,0xFB,0xBB,0xFF,0x7F,0xFF,0xFF,0xFF,0xF0,0x00,
0xF7,0xFF,0xFF,0xBB,0xF7,0x6F,0xFB,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFE,0xF0,0x00,
0xF7,0xFF,0xFF,0xBB,0xF7,0x6F,0xFB,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFE,0xF0,0x00,
0xF7,0xFF,0xFD,0xBB,0xB7,0x6F,0xFB,0xFF,0xFF,0xBF,0x7F,0xBF,0xFF,0xFE,0xF0,0x00,
0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xF0,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,
0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,
0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00
};
void Disply(uchar X,uchar Y); //确定显示位置
/*延时子程序*/
void Delay1ms(unsigned int count)
{
unsigned int i,j;
for(i=0;i
for(j=0;j<120;j++);
}
/*******************************************************************/
/*写指令数据到LCD /*RS=L,RW=L,E=高脉冲,D0-D7=指令码 */
/****************************************************************/
void Lcd_com1(uchar cmd)
{
Delay1ms(10);
RS = 0;
RW = 0;
E = 0;
_nop_();
_nop_();
LCD_data=0x80|((cmd & 0xf0)>>4);
dely();
E = 1;
dely();
E = 0;
// LCD_data=(LCD_data&0xf0)|(cmd & 0x0f);
// dely();
//E = 1;
// dely();
// E = 0;
}
/****************************************************************/
写指令数据到LCD *RS=L,RW=L,E=高脉冲,D0-D7=指令码 /****************************************************************/
void Lcd_com(uchar cmd)
{
Delay1ms(10);
RS = 0;
RW = 0;
E = 0;
_nop_();
_nop_();
LCD_data=0x80|((cmd & 0xf0)>>4);
dely();
E = 1;
dely();
E = 0;
LCD_data=0x80|(cmd & 0x0f);
dely();
E = 1;
dely();
E = 0;
}
/****************************************************************/*写显示数据到LCD *RS=H,RW=L,E=高脉冲,D0-D7=数据 /*******************************************************************/
void LCD_Write(uchar dat)
{
Delay1ms(10);
RS = 1;
RW = 0;
E = 0;
LCD_data= 0x90|((dat & 0xf0)>>4);
dely();
E = 1;
dely();
E = 0;
LCD_data=0x90|(dat & 0x0f);
dely();
E = 1;
dely();
E = 0;
}
/***************************************************************/
LCD初始化设定
/**********************************************************/
void lcd_init()
{
Lcd_com1(0x20); //扩充指令操作
Delay1ms(10);
Lcd_com(0x20); //基本指令操作
Delay1ms(10);
Lcd_com(0x0C); //显示开,关光标
Delay1ms(10);
Lcd_com(0x01); //清除LCD的显示内容
Delay1ms(10);
}
/*********************************************************/
/* 设定显示字符位置 ,将字符输出到液晶显示*/
/*********************************************************/
void Disply(uchar X,uchar Y, uchar *str)
{
uchar pos;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y ;
Lcd_com(pos); //显示地址
while(*str!='\0')
{
LCD_Write(*str);
str++;
}
}
/*********************************************************/
/* 显示的自定义字符 */
/*********************************************************/
void Write_CGRAM(unsigned char table[])
{unsigned char i,tmp=0x00;
Lcd_com(0x40); //开始写入你要显示的自定义字符、汉字代码
for(i=0;i<128;i++)
{
LCD_Write(table[i]);//写入点阵数据,四字符共128字节
Delay1ms(5);
}
Lcd_com(0x80); //从第一行第一列开始显示
for(i=0;i<4;i++) //显示自定义字符
{ LCD_Write(tmp); //自定义高位编码
LCD_Write(tmp+2*i); //自定义低位编码
Delay1ms(5);
}
}
/**************************/
图形显示
/***************************/
void DisplayGraphic(unsigned char code *adder)
{
int i,j;
Lcd_com(0x24); //设定扩展指令 RE=1
/*******将图形信息装到GDRAM*****/
for(i=0;i<32;i++)
{ for(j=0;j<8;j++)
{Lcd_com(0x80 + i); //设置显示列地址
Lcd_com(0x80+j); //设置显示行地址
LCD_Write(adder[i*16+j*2]);
LCD_Write(adder[i*16+j*2+1]);
}
}
for(i=32;i<64;i++) //
{for(j=0;j<8;j++)
{Lcd_com(0x80 + i-32); //设置显示列地址
Lcd_com(0x88+j); //设置显示行地址
LCD_Write(adder[i*16+j*2]);
LCD_Write(adder[i*16+j*2+1]);
}
} Lcd_com(0x36); //设定:RE=1: 并打开图形显示
}
/*主函数*/
void main()
{
lcd_init();//初始12864
Disply(0,0 ,str1) ; // "欢迎学习单片机";
Disply(1,0, str2) ; //"字符显示模式"
Disply(2,0, str3) ; //"LCD_12864四位"
Disply(3,0, dis4) ; //"交流QQ:812549630 "
Delay1ms(655) ;
Lcd_com (0x01); //清除显示DDRAM
Delay1ms(10);
Write_CGRAM(table1);//显示"电子世界"自定义字符
Delay1ms(655) ;
Lcd_com (0x01); //清除显示DDRAM
Delay1ms(65) ;
DisplayGraphic(Photo1); //图形显示
while(1)
{;}
}
本文来源:https://www.2haoxitong.net/k/doc/bbdffb1c6aec0975f46527d3240c844768eaa076.html
文档为doc格式