12864液晶画波形
12864教程画点画线换正弦波(非常完整)有程序

功能:选择 4 行中的任一行作反白显示,并可决定反白与否。第一次设定为反白显示,再次 设定时为正常显示
正常 15. 睡眠模式(15H)
0x04
0x05
0x06/0x07
功能:SL=1:脱离睡眠模式; SL=0:进入睡眠模式(外观上和清屏相同)。 16. 扩充功能设定(16H)
功能:DL=1:8-BIT 控制接口; DL=0:4-BIT 控制接口 RE=1:扩充指令集动作; RE=0:基本指令集动作 G=1:绘图显示 ON; G=0:绘图显示 OFF
10. 写资料到 RAM
功能:写入资料到内部的 RAM(DDRAM/CGRAM/GDRAM),每个 RAM 地址 都要连续写入两个字节的资料。 11. 读出 RAM 的值
功能:从内部 RAM 读取数据(DDRAM/CGRAM/GDRAM),当设定地址指令后,若需 读取数据时需先执行一次空的读数据,才会读取到正确数据,第二次读取时则不需要,除非 又下设定地址指令
//大于100uS 的延时程序
write_com(0x01); //Display Clear
delay(10);
//大于10mS 的延时程序
write_com(0x06); //Enry Mode Set,光标从右向左加1位移动
delay(100);
//大于100uS 的延时程序
}
显示图片的初始化函数:
instruction set, G=0 :graphic display OFF
delay(100);
//大于100uS 的延时程序
write_com(0x30); //Function Set
delay(37);
////大于37uS 的延时程序
12864液晶图像显示图文教程——最全版

由图可以看到水平坐标一个单位是两字节(即 16 位 D15~D0),X 地址会自动加 1,是直接加一个单位 (即两字节 16 位),比如 0001(也即 0X80+000X80+01),从第一行第一列跳到第一行第二列。 代码: void display_image(uchar *p) { uchar i,j; write_cmd(0x34);//扩充指令集动作 write_cmd(0x34);//关绘图显示功能 /*上半屏显示设置*/ for(i=0;i<32;i++)//上半屏 { write_cmd(0x80+i);//垂直地址 write_cmd(0x80); //水平地址 for(j=0;j<16;j++) { write_data(*p);//连续写入 16 个字节 p++; } } /*下半屏半屏显示设置*/ for(i=0;i<32;i++)//下半屏 { write_cmd(0x80+i);//垂直地址 write_cmd(0x88);//水平地址 for(j=0;j<16;j++)//连续写入 16 个字节 { write_data(*p); p++; } } write_cmd(0x36);//开绘图显示 write_cmd(0x30);//回到基本指令集 } 源程序: #include <reg52.h> #include "12864.h" X 坐标(水平)方向以 2 字节 Byte 为单位,Y 坐标(垂直) 方向以 1 位 Bit 为单位,先连续写入垂直与水平坐标,再写入 两字节数据到 GDRAM。 这里是这样进行的:i=0 时,j=0,1 时,写入两字节到垂直 (0X80+00)水平(0X80+00)这格(D15~D0)里;然后 X 坐标地址自增 1, 地址变为垂直 (0X80+00) , 水平 (0X80+01) 这格,在 j=2,3 时写入两字节,………一直到垂直(0X80+00) 水平(0X80+07)这格,在 j=14,15 时写入两字节,此时循环 for(j=0;j<16;j++)结束跳出,刚好第一行 128 位写完数据;然后 i++,开始写第二行……
12864液晶位图显示制作

12864液晶位图制作
在使用12864液晶的时候,如何将彩色图像处理成黑白位图。
又如何将黑白位图处理成单片机可读写的数据?下面我来简单介绍一下如何处理。
一、图像处理成128x64点阵。
首先将图像剪辑成128x64像素的图形。
可以使用windows自带的画图软件,点击开始--附件--画图,然后打开要处理的图像。
再单击图像,将宽度设置成128 高度设置成64单击确定。
二、将彩色的图像转换成黑白的位图。
还是采用windows自带的画图软件。
单击文件---另存为—12864位图.bmp,如下图
保存类型为单色位图(*bmp)
单击是(Y)。
三、修改图像
然后单击放大图像,使用画笔和橡皮擦修改图像。
最后得到如下图像。
保存好位图后,需要用字模提取软件将位图转换为单片机格式文件。
四、字模提取
然后点击取模方式中得C51格式。
五、数据写入芯片
这样图像就转换成C51可识别的代码了。
图像转换后将代码拷贝到程序中。
然后烧写后如下
烧写后通电效果。
该取模软件可以在免费下载。
该液晶型号为HA12864K-ZK5,ST7920带汉字库/蓝底白字/串口/并口/或5V带背光带对比度调节。
该液晶可以串口显示图形,也可以并口显示图形。
关于液晶硬件和程序将另外介绍。
用LCD点阵JM12864C显示函数动态波形

LCALL M()V LCALL M()V
SEND—BYTE A。#’13 SEND—BYTE A,#7r
;字节发送
LCALL LCALL RET
SEND—BYTE
DELAYl
;调用延时
同样,cI。R清屏命令子程序也是发送命令码CLR的ASCII码,但
CLR命令没有参数,无需发送参数。子程序如下:
()RDER—CLR:JNB P3.0,¥ ;检测模块是否为闲态
5.期刊论文 刘传宝.申立中.雷基林.徐淑亮.LIU Chuanbao.SHEN Lizhong.LEI Jilin.XU Shuliang 单片机
C167CS的 I/O口模拟串口与PC机通信进行数据采集实现方法的研究 -现代电子技术2007,30(3)
在做柴油机电控系统开发的过程中,为解决单片机C167CS与PC机通信问题,利用C167CS的I/O 口模拟串口与PC机进行通信,通过这种方法可以实现多个 串口,而且串口通讯高效、可靠、标准统一.系统包括目标机采集子程序、目标机数据发送子程序、上位机接收子程序等,并给出了硬件原理图.
长江大学学报(自科版) 2004年12月第1卷第4期 Journal of Yangtze University(Natural Science Edition)Dee.2004 V01.1 No.4
·67·
用LCD点阵JMl2864C显示函数动态波形
付润江 (长江大学电子信息学院,湖北荆州434023)
CLR
T。
;Tl必须由软件清0
RET
需要说明的是,上面两段子程序中的延时子程序DELAYl是必要的,可以通过实验确定,延时大
约不小于10ms,否则LCD无法正常显示。
3结 论
液晶显示12864

液晶显示12864事无巨细,LCD12864上次写了1602的使用,这次来写写LCD12864。
作为绝大多数单片机学习板的液晶显示模块之一,LCD12864功能要比LCD1602要强悍许多。
仅仅是1602的两行英文字母,数字和各种符号,严格来说勉强能显示几个中文,是无法满足我们的需求的。
当需要显示一些稍微复杂的图形的时候,12864的用处就显现出来了。
下面是两个正在工作的LCD12864:跟1602一样,各种型号的LCD12864在价格,性能,效率上也都是大同小异。
据我所知,市场上全新的12864价格在50到80不等,感觉有点贵。
不过,如果你要买的话,最好了解清楚它是不是带字库的。
什么是字库呢?就是在12864里的CGROM存储器里存放有可调用显示的绝大部分的中文和各种符号。
这和我们调用GCC-AVR的各种头文件里的子函数有点类似:如果没有这个头文件,那么你只能自己去编写;同样如果12864没有字库,你也需要自己去编一个字库,只是方式上是通过图形取模软件来转换实现的。
建议对自己实力不太自信的朋友购买带字库的LCD12864。
LCD12864,即像素为128*64的显示液晶。
它的每一行横向一共有128个可显示点,每一列纵向有64个,这些“点”其实也都是一个个发光二极管。
它可以在一个16*16的点阵区域上显示一个中文;也可以在一个8*16的点阵区域显示一个非中文字符,一般称为半宽字体。
即一个中文字所占显示面积是一个非中文字符的两倍。
LCD12864其实还有个叫法叫12864图形点阵,看出关键了么?对了,点阵二字。
归根结底,它是一个点阵。
既然是点阵,那么它的工作原理就和我们以前接触的LED点阵类似。
即在要点亮的“点”上赋予正向压降即可。
理解这点,对使用12864的图形显示功能有基础作用。
关于LCD12864的引脚结构和功能,并非全部的LCD12864引脚都是一样的。
在此无法一一叙述。
我们论坛板子的LCD12864接口是20个引脚,并行数据总线的LCD12864。
12864液晶显示器种类识别

12864液晶显示器种类识别12864液晶种类繁多,光常用的控制器就有4种,每一种都有自己的特点。
当然指令也各不相同。
学习者不搞明白液晶类型,肯定是无从下手。
1. 12864液晶的型号通常的型号是XX12864A,XX12864B,XX12864C,XX12864-1,XX12864-2,XX12864-3之类。
前面的XX是厂家的标志,中间的12864指的是12864点阵,后面的A,B,C,-1,-2,-3是液晶的编号。
一个厂家生产的12864液晶有许多种,于是ABCDE或者12345的一路往下排。
比如有的网友给一个型号12864B,这不是一个规范的型号,不能给使用者提供任何信息,这种不规范型号的液晶通常不是正规厂家生产的。
找到规范的型号,用户可以自己搜索到正规厂家的网站,然后下载资料。
2. 12864液晶的控制器上文提到的4种这里介绍一下。
(1)ST7920类这种控制器带中文字库,为用户免除了编制字库的麻烦,该控制器的液晶还支持画图方式。
该类液晶支持68时序8位和4位并口以及串口。
(2)KS0108类这种控制器指令简单,不带字库。
支持68时序8位并口。
(3)T6963C类这种控制器功能强大,带西文字库。
有文本和图形两种显示方式。
有文本和图形两个图层,并且支持两个图层的叠加显示。
支持80时序8位并口。
(4)COG类常见的控制器有S6B0724和ST7565,这两个控制器指令兼容。
支持68时序8位并口,80时序8位并口和串口。
COG类液晶的特点是结构轻便,成本低。
各种控制器的接口定义:接口定义ST7920GNDVCCV0RSR/WEDB0-DB7PSBRESVOUTBLABLKGND VCCV0RSR/WEDB0-DB7 CS1CS2 RES VOUT BLA BLKT6963C FGGND VCCV0WRRDDB0-DB7 RSCSRESFSBLA BLKS6B0724 GND VCCRSWRRDCSDB0-DB7BLABLK其中PSB是ST7920类液晶的标志性引脚;CS1和CS2是KS0108类引脚的标志性引脚;FS是T6963C类液晶的标志性引脚。
12864液晶画点和画任意两点间直线 原理

12864液晶画点和画任意两点间直线原理、算法及程序原码12864液晶画点和画任意直线的原理和算法程序原码经验证可行12864实际上是256x64二维显示空间,整个液晶屏分上下两个半屏。
整个屏一共有256列,64行。
可以把它分成16大列,每一大列包含16列。
图形RAM的起始址址为0x80,设置读或写的地址时,要先写Y坐标,再写X坐标。
要使用画图功能,就要设置扩允指令集。
画点原理:先确定坐标->读出数据->修改数据->数据写回原处。
程序原码://画点函数void Draw_Point(uchar x,uchar y,uchar color){uchar row,tier,row_bit;uchar ReadOldH,ReadOldL;tier=x>>4; //把256列分成16大列,每大列包含16列row_bit=x&0x0f; //计算所给坐标在某一大列中的哪一列if(y<32) //分上下半屏显示row=y; //上半屏else{row=y-32; //下半屏tier+=8;}WriteCommand(0x34); //8Bit扩充指令集,即使是36H也要写两次WriteCommand(0x36); //绘图ON,基本指令集里面36H不能开绘图WriteCommand(0x80+row); // 行位置WriteCommand(0x80+tier); // 列位置ReadData();ReadOldH=ReadData();//某大列的前8列数据,低位在前,高位在后ReadOldL=ReadData();//某大列的后8列数据if( row_bit < 8 ) //修改读出的数据{switch( color){case 0 : ReadOldH &=( ~( 0x01 << ( 7 - row_bit ))) ;break ;case 1 : ReadOldH |= ( 0x01 << ( 7 - row_bit )) ;break ;case 2 : ReadOldH ^= ( 0x01 << ( 7 - row_bit )) ;break ;default : break ;}}else{switch(color){case 0 : ReadOldL &= (~( 0x01 << ( 15 - row_bit ))) ;break ;case 1 : ReadOldL |= ( 0x01 << ( 15 - row_bit )) ;break ;case 2 : ReadOldL ^= ( 0x01 << ( 15 - row_bit )) ;break ;default : break ;}}WriteCommand(0x80+row); // 行位置WriteCommand(0x80+tier); // 列位置WriteData( ReadOldH ) ;//把修改后的数据写回原地址WriteData( ReadOldL ) ;}画任意两点间直线的原理和算法:采用Bresenham画线算法。
LCD点阵12864画曲线

//作为列(Y)地址指针。每读写一次其自动加一,指向下一列DDRAM单元
wcode(x,1,1);
wcode(y,1,1);
}
///////////clear清屏///////////////
/*-- 宽度x高度=128x64 --*/
0x00,0x00,0x00,0x2A,0x2A,0x3E,0x00,0x3E,0x22,0x3E,0x00,0xFF,0x04,0x04,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
{ wcode(0x3f,1,1);//显示开//0x3e关
set_startline(0);//起始行第0行
clear();//清屏
}
///////////////////////
void delay (uint k)//延时
{
while(k--);
}
////////复位///////////
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
12864液晶画波形2009-08-19 19:22:0512864液晶画波形要能画波形,有一点是至关重要重要的,那就是打点,所谓打点,就是能在指定的X,Y的坐标处打上一个小黑点,12864液晶的操作就像大多数16位以上的处理器一样是字节或字或双字操作的,不像51和彩色液晶一样的位操作,所以要在12864上打点,就必须用“与或”的方式。
下面把打点的函数贴上,这是以前做温度波形显示的时候做的/****************打点******************/void point(uchar x,uchar y){uchar y1,hang,lie,msb_data,lsb_data,temp=0x01;if(y1!=y){msb_data=0;lsb_data=0;}y1=y;if(y<32){hang=0x80+y;lie=0x80;}if(y>31){hang=0x80+y-32;lie=0x88;}if(y>63)//return;{lcm_com(0x80);_nop_();hanzi("温度超出显示范围");while(1)flash();}lie=lie+x/16;if(x%16==0){msb_data=0;lsb_data=0;}if(x%16<8){msb_data=msb_data|(temp<<(7-x%16));lsb_data=0x00|lsb_data;}//保留以前的数据,把第x个点亮if(x%16==8){msb_data=msb_data|0x00;lsb_data=lsb_data|0x80;}if(x%16>8){msb_data=msb_data|0x00;lsb_data=lsb_data|(temp<<(15-x%16));}lcm_com(0x34);//扩充指令集lcm_com(hang);lcm_com(lie);lcm_dat(msb_data);lcm_dat(lsb_data);lcm_com(0x36);//绘图显示开}打点完成之后波形就相应的出来了,比如说要记录一个波形随时间变化,x坐标随着时间自动增加,x增加一个单位时相应y的值就得确定,在送个打点函数,波形就出来了。
这是一种实时波形还有一种波形,比如正弦,余弦,等等数学波形,可以添加math.h这个头文件。
然后里面相应的函数得到x,y的关系,就能画出这个波形了,下面把正弦波的函数贴出来/**********正弦波*********/void fsin(){float x,y;uchar x1,y1;for(x=0;x<(4*3.1415);x+=0.1){y=sin(x);x1=10*x;y1=31-(10*y+0.5);point(x1,y1);}}y1=31-(10*y+0.5);这条语句是对y值进行四舍五入!其实波形的显示就是这么简单!带字库12864画点波形显示程序2009-08-10 21:38在网上找了很久都没带字库12864画点波形显示程序,全是不带字库的,于是自己动手修改了一个。
只是在前一个驱动程序上加了俩子函数。
#include <reg52.h>#include <intrins.h>#include <math.h>//------------定义接口-------------//sbit RS=P2^5 ;sbit RW=P2^6 ;sbit E=P2^7 ;sbit RES=P2^1 ;#define Lcd_Bus P1// P1 接 LCM#define uchar unsigned char#define FIRST_ADDR 0//定义字符/汉字显示起始位置/*------------------检查忙位-----------------------------*/void chk_busy(){RS=0 ;RW=1 ;E=1 ;Lcd_Bus=0xff ;while((Lcd_Bus&0x80)==0x80);E=0 ;}/*------------------延时子程序-----------------------------*/void delay(unsigned int t){unsigned int i,j ;for(i=0;i<t;i++)for(j=0;j<10;j++);}/*------------------写命令到LCD------------------------------*/ void write_com(unsigned char cmdcode){chk_busy();RS=0 ;RW=0 ;E=1 ;Lcd_Bus=cmdcode ;delay(5);//------------------在数据写入的时候加入适当的延时E=0 ;delay(5);}/*-------------------写数据到LCD----------------------------*/ void write_data(unsigned char Dispdata){chk_busy();RS=1 ;RW=0 ;E=1 ;Lcd_Bus=Dispdata ;delay(5);//------------------在数据写入的时候加入适当的延时E=0 ;delay(5);}/*------------------初始化LCD屏--------------------------*/ void lcdreset(){delay(2000);write_com(0x30);delay(10);//选择基本指令集write_com(0x30);//选择8bit数据流delay(5);write_com(0x0c);//开显示(无游标、不反白)delay(10);write_com(0x01);//清除显示,并且设定地址指针为00Hdelay(500);write_com(0x06);//指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位 delay(0);}/*------------------显示字符串--------------------------*/void hzkdis(unsigned char code*s){while(*s>0){write_data(*s);s++;delay(50);}}/*------------------首屏显示--------------------------*/void ceshi(){write_com(0x01);//清除显示,并且设定地址指针为00Hdelay(5);write_com(0x80);//第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示)hzkdis("中国计量学院");write_com(0x90);//第二行(如果是地址是:90H,即LCD的第二行的第一个位置显示)hzkdis("光电学院");write_com(0x88);//第三行(如果是地址是:88H,即LCD的第二行的第一个位置显示)hzkdis("06光信2");write_com(0x98);//第四行(如果是地址是:98H,即LCD的第二行的第一个位置显示)hzkdis("测试程序");}//------------------清整个GDRAM空间---------------------------- void clrgdram(){unsigned char x,y ;for(y=0;y<64;y++)for(x=0;x<16;x++){write_com(0x34);write_com(y+0x80);//行地址write_com(x+0x80);//列地址write_com(0x30);write_data(0x00);write_data(0x00);}}//------------------------------------------------------------void clrscreen(){write_com(0x01);delay(10);}unsigned char ReadByte(void){unsigned char byReturnValue ;chk_busy();Lcd_Bus=0xff ;RS=1 ;RW=1 ;E=0 ;E=1 ;byReturnValue=Lcd_Bus ;E=0 ;return byReturnValue ;}//增加画点子程序void DrawPoint(unsigned char X,unsigned char Y,unsigned char Color) {unsigned char Row,Tier,Tier_bit ;unsigned char ReadOldH,ReadOldL ;write_com(0x34);write_com(0x36);Tier=X>>4 ;Tier_bit=X&0x0f ;if(Y<32){Row=Y ;}else{Row=Y-32 ;Tier+=8 ;}write_com(Row+0x80);write_com(Tier+0x80);ReadByte();ReadOldH=ReadByte();ReadOldL=ReadByte();write_com(Row+0x80);write_com(Tier+0x80);if(Tier_bit<8){switch(Color){case 0 :ReadOldH&=(~(0x01<<(7-Tier_bit)));break ;case 1 :ReadOldH|=(0x01<<(7-Tier_bit));break ;case 2 :ReadOldH^=(0x01<<(7-Tier_bit));break ;default :break ;}write_data(ReadOldH);write_data(ReadOldL);}else{switch(Color){case 0 :ReadOldL&=(~(0x01<<(15-Tier_bit)));break ;case 1 :ReadOldL|=(0x01<<(15-Tier_bit));break ;case 2 :ReadOldL^=(0x01<<(15-Tier_bit));break ;default :break ;}write_data(ReadOldH);write_data(ReadOldL);}write_com(0x30);}void main(void){uchar i,j,colour=1 ;// uint ADzhi;RW=0 ;lcdreset();ceshi();clrgdram();delay(5000);clrscreen();for(i=4;i<124;i++){j=35-27*sin((i-4)*3.14/30);//正弦波显示DrawPoint(i,j,colour);}delay(5000);while(1);}。