导航:首页 > 文件教程 > 12864液晶屏教程

12864液晶屏教程

发布时间:2023-02-19 12:49:41

A. 怎么编写程序使12864液晶显示

你好:

如果你的12864是带字库的话,只要写好了驱动,直接在写数据函数里版用双引号写一个权汉字就能直接显示。

如果不是带字库的液晶,就是通过绘图的方式,用字模软件画出图形,用液晶显示就行了。

这两种液晶的程序我也有,如果你需要回复我。

希望我的回答能帮助到你。

B. 关于单片机液晶屏LCD12864的程序

/*****************************************************************

*程序名称:带汉字库的12864液晶显示模块驱动

*程序功能:显示字符 、汉字和图片

*开发工具:Kile

* MCU型号:AT89S52-24PU

*时钟频率:11.0592MHZ

*程序作者:yuan

*版权说明:yuan

*****************************************************************/
#include<reg52.h>
#include "lcd.h"
#include "util.h"

sbit E=P1^5;//脉冲使能
sbit RW=P1^6;//读写选择
sbit RS=P1^7;//数据命令选择
sbit rst=P3^6;//12864复位

// 延时ms函数:

// 12864检查状态函数:
void Check12864State(void)
{

P0=0xff;
E=0;//读状态前三控制线的状态
RS=0;
RW=1;
E=1;//拉高,读状态
while((P0&0x80)==0x80);//等待空闲
E=0;//写命令后三控制线的状态
RS=1;
RW=0;

}

// 12864写命令函数:
void Write12864Command( unsigned char com)
{

Check12864State();//检查状态
P0=com;//赋值
E=0;//写命令前三控制线的状态
RS=0;
RW=0;
E=1;//拉高,写命令
E=0;//写命令后三控制线的状态
RS=1;
RW=1;

}

//12864写数据函数:
void Write12864Data( unsigned char dat)
{

Check12864State();//检查状态
P0=dat;//赋值
E=0;//写数据前三控制线的状态
RS=1;
RW=0;
E=1;//拉高,写数据
E=0;//写数据后三控制线的状态
RS=0;
RW=1;

}

//在指定的位置显示字符串(汉字和ASCII码字符)函数:
void LCD12864DisplayString( unsigned char y,unsigned char x, unsigned char *pstr)
//y-行数值0-3,x-列数值0-7,pstr-字符串指针
//12864可以显示32个汉字(四行每行8个),一个地址对应一个汉字
//可以显示64个ASCII码字符(四行每行16个),一个地址对应两个字符
//为了实现自动换行功能,这个函数比较繁琐
{

unsigned char row,n=0;
Write12864Command(0x30);//基本指令
Write12864Command(0x06);//地址计数器自动加以,光标右移
switch(y)//根据行号选择行地址
{

case 0:row=0x80;break;//第一行首地址
case 1:row=0x90;break;//第二行首地址
case 2:row=0x88;break;//第三行首地址
case 3:row=0x98;break;//第四行首地址
default:;

}

Write12864Command(row+x);//写地址
while(*pstr!='\0')
{

Write12864Data(*pstr);//写字符
pstr++;
n++;//计数
if((n+x*2)==16)//如果一行写完 ,继续写第二行
{
if(y==0) Write12864Command(0x90);//写下一行地址
else if(y==1) Write12864Command(0x88);//写下一行地址
else if(y==2) Write12864Command(0x98);//写下一行地址
else ;

}
else if((n+x*2)==32)//如果第二行写完 ,继续写第三行
{

if(y==0) Write12864Command(0x88);//写下一行地址
else if(y==1) Write12864Command(0x98);//写下一行地址
else ;
}

else if((n+x*2)==48)//如果第三行写完 ,继续写第四行
{
if(y==0) Write12864Command(0x98);//写下一行地址
else ;
}
else ;
}

}

//图片模式清屏函数:
void Clear12864Screen()
{

unsigned char i,j;
Write12864Command(0x34);//功能设定:8位控制方式,使用扩充指令
Write12864Command(0x36);//使用扩充指令,绘图显示控制
for(i=0;i<32;i++)

//ST7920可控制256*32点阵(32行256列),而12864液晶实际的行地址只有0-31行,

//12864液晶的32-63行的行是0-31行地址从第128列划分一半出来的,所以分为上下两半屏,

//也就是说第0行和第32行同属一行,行地址相同;第1行和第33行同属一行,以此类推

{

Write12864Command(0x80|i);//写行地址(垂直地址)
Write12864Command(0x80);//写列地址(水平地址)
for(j=0;j<32;j++)
Write12864Data(0x00);//清屏

}

}

//在任意位置显示任意大小的图片函数:

void LCD12864DisplayPictrue(unsigned char y,unsigned char x,

unsigned char px,unsigned char py, unsigned char *pp)

//y-起始行(数值0-63),x-起始列(16位宽,数值0-7),

//px-图片宽度,py-图片高度,pp-指针指向图片数组

//因为上下屏的地址不连续,要在任意位置显示完整的图像,处理起来比较繁琐

{

unsigned char i,j,k;
Clear12864Screen();//清屏
if(y<32)//如果起始行在上半屏
{

k=32-y;//算出上半屏的行数
for(i=0;i<k;i++,y++)//上半屏行数
{
Write12864Command(0x80|y);//写行地址(垂直地址)
Write12864Command(0x80|x);//写列地址(水平地址)
for(j=0;j<px/8;j++)
Write12864Data(pp[i*px/8+j]);//写图片数据

}

y=0;//下半屏起始行,接上半屏继续写数据
for(;i<py;i++,y++)//下半屏剩下的行数
{

Write12864Command(0x80|y);//写行地址(垂直地址)
Write12864Command(0x80|(8+x));//写列地址(水平地址)
for(j=0;j<px/8;j++)
Write12864Data(pp[i*px/8+j]);//写图片数据

}

}

else //如果起始行在下半屏

{

for(i=0;i<py;i++,y++)//行数
{
Write12864Command(0x80|(y-32));//写行地址(垂直地址)
Write12864Command(0x80|(8+x));//写列地址(水平地址)
for(j=0;j<px/8;j++)
Write12864Data(pp[i*px/8+j]);//写图片数据

}

}

}

void Clear12864Text()
{
Write12864Command(0x34);//清屏
DelayMs(5);
Write12864Command(0x30);//清屏
DelayMs(5);
Write12864Command(0x01);//清屏
DelayMs(5);
}

//12864初始化函数:
void Initialize12864()
{

rst=0;//复位12864
DelayMs(30);
rst=1;
DelayMs(20);
Write12864Command(0x30);//功能设定:8位控制方式,使用基本指令
Write12864Command(0x08);//显示关
Write12864Command(0x01);//清屏
Write12864Command(0x06);//地址计数器加一、光标右移
Write12864Command(0x0c);//显示开

}

带字库的驱动

C. 如何用12864液晶屏显示图形程序

12864内部有驱动电路和字库缓存芯片,数据就是按照说明输进去,驱动显示和字库点阵都由12864内部的电路和芯片处理。内部怎么驱动我们使用者不需要管,只要看接口电路和接口输入方法就行。
这个是不能用单片机的串口,LCD的串行的时序跟单片机串口的时序是不同的,(具体参考12864的说明书,上边有LCD的串行时序)。
LCD串行显示的速度比较慢,大约是并行的1/24,但是所需引脚比较少(3个)。
LCD并行显示的速度快,但所需管脚比较多(11个)。
只做简单的游戏机的话,管脚应该是够用的,可以考虑用并行显示。

D. LCD 12864怎样和单片机连接

LCD 12864液晶屏工作电压+3.0V~+5.5V,逻辑电平与单片机兼容,能够直接与单片机的IO口连接。

12864液晶屏的接口方式有并行4位、并行8位、串行2线和串行3线,以适应不同的应用场合。

两个以上的 12864LCD跟单片机连接, 只要选通线 接不同的引脚,及对比度分别控制,其它的如数据线、读写线,都可以共用,读写时分别选需要制的LCD就可以了,来完成所需要的不同内容。

串口控制和I2C不同,串口时只要程序里有这样几句:SBUF=dat;while(!TI);TI=0;就可以输出控制量dat了,而使用I2C控制就不同了,实际应用时要有:确定总模拟线数据传输接口、模拟时钟接口,总线启动、总线应答、总线停止、总线发送单字节、总线发送数据等等许多模拟时序的问题。

(4)12864液晶屏教程扩展阅读:

单片机的选择:

各种单片机都有各自的优缺点,应根据需要选择。选择单片机原则如下:

1、单片机的基本参数例如速度,程序存储器容量,I/O引脚数量。

2、单片机的增强功能,例如看门狗,双指针,双串口,RTC(实时时钟),EEPROM,扩展RAM,CAN接口,I2C接口,SPI接口,USB接口。

3、Flash和OTP(一次性可编程)相比较,最好是Flash。

4、封装IP(双列直插),PLCC(PLCC有对应插座)还是贴片。DIP封装在做实验时可能方便一点。

5、工作温度范围,工业级还是商业机。如果设计户外产品,必须选用工业级。

6、功耗,比如设计并口加密狗,信号线取电只能提供几个mA,用PIC就是因为低功耗,后来出了MSP430也不错。

E. 12864LCD 液晶显示的流程图

带中文字库的128X64是一种具有4位/8 位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块。

其显示分辨率为128×64,内置8192个16*16点汉字,和128个16*8点ASCII字符集,利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字,也可完成图形显示,低电压低功耗是其又一显著特点。

由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。

(5)12864液晶屏教程扩展阅读:

用带中文字库的128X64显示模块时应注意以下几点:

1.欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。

2.显示ASCII字符过程与显示中文字符过程相同。不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。

3.当字符编码为2字节时,应先写入高位字节,再写入低位字节。

4.模块在接收指令前,向处理器必须先确认模块内部处于非忙状态,即读取BF标志时BF需为“0”,方可接受新的指令。

如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。指令执行的时间请参考指令表中的指令执行时间说明。

5.“RE”为基本指令集与扩充指令集的选择控制位。当变更“RE”后,以后的指令集将维持在最后的状态,除非再次变更“RE”位,否则使用相同指令集时,无需每次均重设“RE”位。

F. 怎样用12864液晶显示屏画实时曲线

一. 显示图片

显示图片的要点在于:1.取模 2.利用扩展指令设置液晶.清楚液晶地址的概念
1.1取模
取模软件用的是“字模221”下图是他的参数设置

这里对参数设置先解释一下,所谓横向取模就是,一张图片从图片最左上角的8位开始取模,从左向右,每次取8位二进制数据转化为16进制保存,第一排取完之后,接着到第二排最左边8位开始取模,以此类推。为什么要这样取模呢?因为12864液晶的横纵坐标就是这个取模顺序,这点在之后还会详细提到。
1.2液晶的设置
液晶显示图片必须用扩充指令集,初始化和显示字符的初始化不一样。我用的初始化函数如下:

void init_picture()//显示图片的初始化函数
{
lcd_wcmd(0x36);//写指令函数,扩充指令集,绘图G=1打开
lcd_wcmd(0x36);
lcd_wcmd(0x3E);
lcd_wcmd(0x01);//清屏
Light= 0;//打开背光
}
1.3将取出的字模写进相应地址
首先应该知道地址究竟是怎样的,结合下图讲清楚。12864液晶分为半屏和下半屏。当你想要点亮某个地方时,必须先写这个地方的垂直地址紧接着写入它的水平地址,水平地址液晶可以自动加1,而垂直地址不会。图中水平坐标从0x80+00到0x80+0F,一共16个,其中0x80+00到0x80+07是上半屏的坐标,其中0x80+08到0x80+0F是下半屏的坐标。水平坐标每个两字节,先写入的数据填充在高字节。垂直坐标只有0x80+00到0x80+1F,图中上半截0x80+00到0x80+1F是上半屏的垂直地址,另外的那部分一样的是下半屏垂直地址。每个垂直地址只确定一排,所以水平和垂直地址不能确定某个点的位置,只能确定某个两字节的位置,通过写进2字节数据确定点亮某个点或几个点。比如我们写入lcd_wcmd(0x81;(垂直地址)lcd_wcmd(0x80)(水平地址); 这就是说我们将在图中水平坐标00,垂直坐标01的位置(红圈处)输入数据。

知道地址的知识之后就明白为什么要横向取模了,接下来只要将取模的数据一个个按取模生成的顺序写进液晶就行了。下面是我用的代码,其中uchar=unsignedchar,uint=unsigned int。
void show_Pic(uchar*address)//显示图片函数
{ //address是是指向数组的指针,用法:show_Pic(XY)当中XY为数组名
uchari,j;
for(i=0;i<32;i++) //上半屏的32排依次先写满
{
lcd_wcmd(0x80+i);//先送垂直地址
lcd_wcmd(0x80); //再送水平地址,水平地址可自加1
for(j=0;j<16;j++)//每排128个点,所以一共要16个两位16进制数(也就是8位二进制数)才能全部控制
{
lcd_wdat(*address);
address++;
}
}
for(i=0;i<32;i++) //下半屏的32排操作原理和上半屏一样
{
lcd_wcmd(0x80+i);
lcd_wcmd(0x88);
for(j=0;j<16;j++)
{
lcd_wdat(*address);
address++;
}
}
}
1.4实际显示结果
下图是我显示的一个坐标系和一条龙

下面的代码是我的主函数,这部分加上上面我上面讲的函数和一些基本设置就是整个代码,XY是这幅坐标图片取模得到的数组

void main()
{
init_picture();
文章原创来于12864:http://www.hzjingxian.com
show_Pic(XY);
while(1) //进入程序主循环
{
}
}
二. 用打点方式显示任意图像
有的同学认为打点只需按照上面的显示图片的方法点亮需要的点就是了,其实这不行。因为你写进去的是八个点的控制,会影响周围的点,很容易出现乱码。比如,你写进去的是0x80,x想的是只点亮左边一个点,其他的都不要影响,但是右边的7个0也是会显示的,如果在要显示0的地方原来显示的是1的话,你现在写进去的0就把1覆盖了,这样就容易产生乱码。所以我建议,你先把液晶的数据读出来,再用data&=(~(0x01<<(7-bit)))(bit是你点亮哪一位,data是读出来的数据)置0,置1也是类似的,最后再把data重新写进去就行了。
我的单片机接口是乱的,所以每一个液晶接口都用了位定义,并且用到了寄存器B,寄存器B的每一个当做一个变量的位来操作。我的具体代码如下:

bit lcd_busy() // 读写判断数据的D7读写位,用于判断1602是否忙
{
bitresult;
D7 =1; //数据口D7置1,为读状态做准备
LCD_RS = 0; // 选择指令寄存
LCD_RW = 1; // 选择读控制线
LCD_EN = 1; // 开使能控制线
delayNOP(); // 时序延时
result = D7; // 读D7的电平
LCD_EN = 0; // 关使能
return(result); // 返回值1:忙,0可以执行操作
}
unsigned charreadData(void) //读取数据函数
{
uchar i;
D0 = 1; D1 = 1; D2 = 1; D3 = 1;
D4 = 1; D5 = 1; D6 = 1; D7 = 1;
lcd_busy();
LCD_RS=1; LCD_RW=1;
LCD_EN=0; LCD_EN=1;
B_0=D0;B_1=D1; B_2=D2; B_3=D3;//B_1=B^1,在程序前段有位定义
B_4=D4;B_5=D5; B_6=D6;B_7=D7;
for(i=1;i<=7;i++)
delayNOP();//这个函数是{_nop_();_nop_();_nop_();_nop_();};
LCD_EN=0;
returnB;
}
uchar DrawDots(uchar x,uchar y,ucharcolor)//打点函数
{
ucharrow,xlabel,xlabel_bit;
uchar Read_H=0,Read_L=0;
lcd_wcmd(0x34); //扩充指令
lcd_wcmd(0x36); //绘图指令
xlabel=x>>4; //去16*16首地址
xlabel_bit=x & 0x0F;
if(y<32) row=y;
else
{
row=y-32;
xlabel+=8;
}
lcd_wcmd(row+0x80);
lcd_wcmd(xlabel+0x80);
readData();
Read_H=readData();
Read_L=readData();

lcd_wcmd(row+0x80);
lcd_wcmd(xlabel+0x80);

if(xlabel_bit<8)
{
switch(color)
{
case 0:Read_H&=(~(0x01<<(7-xlabel_bit))); break; //变暗,看不见
case 1:Read_H |=(0x01<<(7-xlabel_bit));break; //变亮 ,看得见
case 2:Read_H ^=(0x01<<(7-xlabel_bit));break; //反转
default:break;
}
lcd_wdat(Read_H);
lcd_wdat(Read_L);
}
else
{
switch(color)
{
case 0:Read_L&=(~(0x01<<(15-xlabel_bit))); break; //变暗 ,看不见
case 1:Read_L |=(0x01<<(15-xlabel_bit));break; //变亮 ,看得见
case 2:Read_L ^=(0x01<<(15-xlabel_bit));break; //反转
default:break;
}
lcd_wdat(Read_H);
lcd_wdat(Read_L);
}
lcd_wcmd(0x30);//恢复正常模式
}
如果你的单片机和12864接口不是乱的,那可以这样写读取函数
unsigned charreadData(void)
{
uchar i ,data;
P0=0xFF;
lcd_busy();
LCD_RS=1; LCD_RW=1;//
LCD_EN=0; LCD_EN=1;
data=P0;
for(i=1;i<=7;i++)
delayNOP();
LCD_EN=0;
returndata;
}
这样,整个代码就全部讲完了,下面是显示正弦波的图片

阅读全文

与12864液晶屏教程相关的资料

热点内容
怎么提高网络问卷通过率 浏览:656
数控火焰切割半圆弧怎么编程 浏览:501
一加六手机数据备份在哪里 浏览:264
手机app脱壳之后怎么解压 浏览:823
7700用win10 浏览:72
摇摇棒c程序 浏览:837
文件名后缀为svg是什么意思 浏览:446
免费推广的网站有哪些 浏览:271
微信绑定卡但是忘记密码怎么办 浏览:372
资源文件mfc 浏览:519
哪里能接到数据标注 浏览:254
getjson访问本地文件 浏览:935
怎么样激活win10专业版 浏览:202
男运动装备哪个app好 浏览:406
安卓手机投射win10电脑屏幕 浏览:187
给领导看的数据有问题怎么办 浏览:743
directx11测试工具 浏览:946
android混淆so文件 浏览:383
数据怎么传到盘点机 浏览:571
小熊编程怎么样 浏览:195

友情链接