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,
玩转12864液晶显示图片
玩转12864液晶显示图片,画点,画任意直线2009-10-30 01:24通过上一篇的实验,相信大家都掌握了显示字符的基本用法。
下面我们来看一下12864液晶更高级的用法。
首先是它的绘图功能。
让我们先来显示一整副的图片吧,也就是128x64大小。
在使用绘图功能时,先要打开扩充指令集,然后再打开绘图功能。
接着就是送数据显示了。
这里我们首先要弄明白ST7920的显示坐标关系。
其显示坐标如下。
从图中可以看出,X方向共有8个字(16个字节)Y方向共有0~31 行分为上下两个屏。
弄懂了之后我们就可以依照此坐标来显示一整屏的图片了。
随便用一个图片的提取转换软件,讲一副126X64大小的图片转换成字节数据,总共字节大小为128*64/8 = 1024个字节。
下面我们来看看这个显示整屏图像的函数void v_Lcd12864DrawPicture_f( unsigned char code *pPicture ){unsigned char i, j, k ;for( i = 0 ; i < 2 ; i++ )//分上下两屏写{for( j = 0 ; j < 32 ; j++ ){v_Lcd12864SendCmd_f( 0x80 + j ) ;//写Y坐标if( i == 0 ) //写X坐标{v_Lcd12864SendCmd_f( 0x80 ) ;}else{v_Lcd12864SendCmd_f( 0x88 ) ;}for( k = 0 ; k < 16 ; k++ ) //写一整行数据{v_Lcd12864SendData_f( *pPicture++ ) ;}}}v_Lcd12864SendCmd_f( 0x30 ) ;}看看效果图片如下:显示一个人的图像下面来看看如何在任意一个位置显示或者是擦除一个点对于12864这种二值显示屏来说,其显示状态无外乎显示和不显示一个点这两种状态。
(完整word版)单片机12864动态波形显示
/****************************************************************************** ** 描述: ** 12864标准字库液晶演示数据p0,控制p2 ******************************************************************************** */#include <reg51.h>#include <math.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/************* 12864LCD引脚定义*************/#define LCD_data P0 //数据口sbit LCD_RS = P2^6; //寄存器选择输入sbit LCD_RW = P2^5; //液晶读/写控制sbit LCD_EN = P2^7; //液晶使能控制sbit LCD_PSB = P3^2; //串/并方式控制sbit LCD_RST = P3^7; //液晶复位端口#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};/*********************************************************/uchar code DIS1[] = {"Vpp:"};uchar code DIS2[] = {"F:"};uchar DIS3[] = {"5V"};uchar DIS4[] = {"12Hz"};uchar D1[]={"0123456789"};/*********************************************************///正弦波代码uchar code tab[]={126,100,80,70,65,62,65,70,80,100,126,152,172,182,187,190,187,182,172,152};//背景图片uchar code Photo1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00};/****************************************************************************** //*******************************************************************//* *//* 延时函数*//* *//*******************************************************************/void delay(int ms){while(ms--){uchar i;for(i=0;i<150;i++){_nop_();_nop_();_nop_();_nop_();}}}/*******************************************************************//* *//* 延时函数*//* *//*******************************************************************/void delay1(int ms){while(ms--){uchar y;for(y=0;y<100;y++) ;}}/*******************************************************************//* *//*检查LCD忙状态*/ /*lcd_busy为1时,忙,等待。
带子库12864绘图说明
带字库12864绘图说明一、用带字库12864LCD屏绘图首先要对其绘图寄存器GDRAM地址了解清楚。
如图所示绘图寄存器GDRAM地址由水平地址(LCD_X)和垂直地址(LCD_Y)组成;如上图所示,水平地址共有16个(0x80~0x8f),其中上半屏起始地址为0X80,下半屏起始地址为0X88每个水平地址对应16列,上下半屏各有8个水平地址,所以一屏总共有128列.垂直地址共有32个(0x80~0x9f),因为上下半屏的垂直地址一样所以实际上一屏总共有64行。
特别注意:虽然一屏有128列,但并不是每列都有它的地址。
其实,从左往右每16列为一“大列”,有一个水平地址。
送数据时只要将该“大列”的水平地址和垂直地址送入12864,然后紧接这写如两个字节的内容,就可将这两个字节的内容显示在这一“大列”的16位上(先送高位,再送低位;显示时左面8位为高位)。
二、写入绘图RAM的步骤按照上面的步骤写了一个绘图地址的函数void wr_address( void)//送地址函数{write_com(0x34);//附加功能使能write_com(LCD_Y);//送入垂直地址write_com(LCD_X);//送入水平地址write_com(0x30);//禁止附加功能}下面是一个清屏函数(注意:绘图的清屏与显示汉字的清屏不同,手册中的清屏指令只能清楚DDRAM的内容,但无法清楚GDRAM的内容。
绘图清屏其实就是向GDRAM中写如0x00)void show3(void)//绘图清屏{uchar i,j,k;LCD_X=0X80;for(i=0;i<2;i++){LCD_Y=0X80;for(j=0;j<32;j++){wr_address();//写入起始地址for(k=0;k<16;k++)//连续写入16个字节(一行写满),每写入两个字节LCD_X会自动加1write_data(0x00);LCD_Y++;//垂直地址不会自动加1,写完一行后要程序换行}LCD_X=0X88;}write_com(0x36);write_com(0x30);}三、用带字库的LCD屏显示波形实例A、大致步骤1、绘图清屏2、AD转换器对波形采样,并将采样值定义在0~63之间,依次存入容量为128字节的一个数组中3、从数组中依次取出数据,送入GDRAMB、设计难点1、如何在屏上显示高低不同的点2、如何将不规则、无规律的点用字节的形式送显示3、怎样用AD转换的结果来控制显示的波形C、解决方案1、本次设计的核心思想就是将LCD屏看作一个128*64的点阵屏,从左往右循环送入uint code tab2[]={0x8000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100,0x0080,0x0040,0x0020,0x0010,0x0008,0x0004,0x0002,0x000 1};的内容,这些点的高低由它们的垂直坐标LCD_Y决定;我们用AD 转换结果的128个字节的内容与128列一一对应,这写结果作为它们对应列上点的垂直坐标(注意,这些结果还要少做处理后才能作为垂直坐标,具体见下面程序)2、上面的做法会出现一个问题,那就是在一个“大列”中(一个水平坐标内)的16个点如果在同一行上出现两个以上的点,那么前面的点将不会显示(例如,在水平地址为0x80的这一“大列”中,第一列和第三列同在第三行,那么在显示第一列的点时地址为(0x80,0x82)的GDRAM中送入的数据是0x8000,而在显示第三列时,该GDRAM要送入的数据为0x2000;最终该GDRAM为0x2000,所以第一列的点在屏上就显示不出来了)。
12864液晶绘图,12864
{
LCD12864_IfBusy();
LCD12864_WriteRom( 0x80 + j ) ;//写 Y 坐标
Delay_50us(1);
if( i == 0 )
//写 X 坐标
{
LCD12864_WriteRom( 0x80 ) ;
Delay_50us(1);
}
else
//写下半屏
{
LCD12864_WriteRom( 0x88 ) ;
25 else
26 {
27
lcd_write_data(0x00);
//高字节全部填 0
28
lcd_write_data(0x01 << (15 - x_bit));
29 }
30 lcd_write_cmd(DRAW_ON);
//打开绘图显示
31 lcd_write_cmd(BASIC_SET);
怎样在点阵屏上绘图——基于 LCD12864【二】
— 从“壁画”记事到“甲骨文” 不得不承认,到目前为止,似乎如果我们要想做一个电话号码记事本之类的电子助手已经万事俱备
了,但真正开始做的时候才发现,我们还没有教会 AVR 如何去写字。如果说,我们前面已经能在 LCD 上画出“壁画”的话,那么要想让别人看懂你记录的到底是什么鬼画符还需要一点点关于“甲骨文” 的扫盲。事实上,大家约定俗成的固定大小的图片集或其子集就是一个被尊称为字库的神圣典籍。在 这个圣经里面记录的是一种被称之为“字模码”的东西,对于我们,这种信息可能相当抽象,但是借 助 LCD,那么字模码就是一个我们能看懂的字符在显存中存在的模式。
在西方,埃尼阿克的故乡,一群依靠技术侵略世界的疯子根据自己半通不同的习惯制定了一个由 128 个字符组成的交换标准称之为 ASCII 码,由于技术大潮的冲击,世界妥协了。
12864显示波形
Lcd12864.c:#include "lcd12864.h"void LCDDelay (char t){char i,j;for(i=0;i<t;i++)for(j=0;j<10;j++);}void CheckState(){char dat;LCDRs = 0;LCDRw = 1;do{dat = 0x00;LCDEn = 1;LCDDelay(2);LCDEn=0;dat=0x80&dat;}while(!(dat==0x00));}void write_com (char cmdcode) {CheckState ( );LCDRs = 0;LCDRw = 0;LCDData = cmdcode;LCDDelay (2);LCDEn = 1;LCDDelay (2);LCDEn = 0;}void write_data (char LCDDispdata) {CheckState ( );LCDRs=1;LCDRw=0;LCDData=LCDDispdata;LCDDelay(2);LCDEn=1;LCDDelay(2);}void LCDInit ( ){LCDDelay(100);LCDCs1=1;LCDCs2=1;LCDDelay(100);write_com(LCDDispOff);write_com(PageAdd+0);write_com(StartLine+0);write_com(LCDColAdd+0);write_com(LCDDispOn);}void LCDClear(){char k,j;LCDCs1=0;LCDCs2=0;write_com(PageAdd+0);write_com(LCDColAdd+0);for(k=0;k<8;k++){write_com(PageAdd+k);for(j=0;j<64;j++){write_com(LCDColAdd+j);write_data(0x00);}}}void LCDWriteChinese (char leftright, char page, char column,char chinese[]) {char i = 0,j=0;if(leftright=='L'){LCDCs1=0;LCDCs2=1;}else if (leftright == 'R'){LCDCs1 = 1;LCDCs2=0;}write_com(PageAdd+page+i);write_com(LCDColAdd+column);for(j=0;j<16;j++){write_data(chinese[16*i+j]);}}}void LCDWriteChineseBlack(char leftright,char page,char column,char chinese[]) {char i = 0, j =0;if(leftright=='L'){LCDCs1=0;LCDCs2=1;}else if(leftright=='R'){LCDCs1=1;LCDCs2=0;}for(i=0;i<2;i++){write_com(PageAdd+page+i);write_com(LCDColAdd+column);for(j=0;j<16;j++){write_data(~chinese[16*i+j]);}}}void LCDWriteNum (char leftright,char page,char column, char num[]){char i =0,j=0;if(leftright=='L'){LCDCs1=0;LCDCs2=1;}else if (leftright=='R'){LCDCs1=1;LCDCs2=0;}write_com(PageAdd+page+i);write_com(LCDColAdd+column);for(j=0;j<8;j++){write_data(num[8*i+j]);}}}void LCDWriteNumBlack(char leftright,char page,char column,char num[]) {char i=0,j=0;if(leftright=='L'){LCDCs1=0;LCDCs2=1;}else if(leftright=='R'){LCDCs1=1;LCDCs2=0;}for(i=0;i<2;i++){write_com(PageAdd+page+i);write_com(LCDColAdd+column);for(j=0;j<8;j++){write_data(~num[8*i+j]);}}}Lcd12864.h#ifndef __LCD12864_H#define __LCD12864_H#include <reg51.h>#define LCDDispOff 0x3e#define LCDDispOn 0x3f#define PageAdd 0xb8 // 页地址#define LCDColAdd 0x40// 列地址#define StartLine 0xc0 // 行地址#define LCDData P0sbit LCDCs1 =P2^0; //?片选?1?sbit LCDCs2 =P2^1; //?片选?2?sbit LCDRet =P2^2; //?复位端?sbit LCDRw =P2^3; //?“数据/指令”?选择?sbit LCDRs =P2^4; //?“读/写”?选择?sbit LCDEn = P2^5; //?“读/写”?使能??/*函数声明,供模块内部使用*/static void LCDDelay (char t);//?延时函数?static void CheckState ( );//?检测忙标志?static void write_com (char cmdcode);//?写指定??static void write_data (char LCDDispdata); //?写数据??/*函数声明,外部调用*/void LCDInit ( );//?12864?初始化?void LCDClear ( );//?12864?清屏??void LCDWriteChinese (char leftright, char page, char column, char chinese[]);//12864指定页指定列显示一个汉字?void LCDWriteChineseBlack (char leftright, char page,char column ,char chinese[]);//12864?指定页指定列显示一个汉字,以黑色背景白色文本显示?void LCDWriteNum (char leftright, char page,char column, char num[]);//12864?指定屏指定页指定列显示一个数字?void LCDWriteNumBlack (char leftright, char page, char column,char num[]);//?12864?指定屏指定页指定列显示一个数字,以黑色背景白色文本显示?#endifMain.c#include "lcd12864.h"char code san1[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; char code san2[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };char code sin1[]={0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x01,0x01,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0xE0,0x1C,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x1C,0xE0}; char code sin2[]={0x07,0x38,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x38,0x07,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x80,0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00}; char code rec[]={0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFF};void delay (int t){int i, j;for(i=t;i>0;i--)for(j=125;j>0;j--);}void main(void){LCDInit ( );LCDClear();while(1){LCDWriteChinese('L',0,0,san1);LCDWriteChinese('L',0,16,san2);LCDWriteChinese('L',0,48,san2);LCDWriteChinese('R',0,0,san1);LCDWriteChinese('R',0,16,san2);LCDWriteChinese('R',0,32,san1);LCDWriteChinese('R',0,48,san2);LCDWriteChinese('L',2,0,rec);LCDWriteChinese('L',2,16,rec);LCDWriteChinese('L',2,32,rec);LCDWriteChinese('L',2,48,rec);LCDWriteChinese('R',2,0,rec);LCDWriteChinese('R',2,16,rec);LCDWriteChinese('R',2,32,rec);LCDWriteChinese('R',2,48,rec);LCDWriteChinese('L',4,0,sin1);LCDWriteChinese('L',6,16,sin2);LCDWriteChinese('L',4,32,sin1);LCDWriteChinese('L',6,48,sin2);LCDWriteChinese('R',4,0,sin1);LCDWriteChinese('R',6,16,sin2);LCDWriteChinese('R',4,32,sin1);LCDWriteChinese('R',6,48,sin2);delay(1000);LCDClear();}}。
基于12864液晶模块的动态波形显示实现方法
Th v f r d s l y o h y a c e wa eo m ip a ft e d n mi meho a e n t db sdo l LCD o u e m d l
u e t 2 6 hpwi B01 8c t due ao d dgt s he1 8 4 c i t S6 h 0 onr mo l f an lgan il ol or al
d na cwa e om s a eh . y mi v f r diply m tod Ke y wors:L d CD dul Mo e;d n y ami v f r dipa c wa e o m s ly;m lr c n rl r c o o tol e
旦经验童逾日
d i1 . 9 9 j i n 1 7 —0 1 2 1 . 5 0 9 o :0 3 6 / .s . 6 1 1 4 . 0 0 0 . 2 s
墨 麦旦
基 于 184液 晶模 块 的 动态 波 形显 示 实现 方 法 26
辛阿 阿, 厉善 亨
( 上海 海事大 学 ,上海 203 ) 0 15
鼎
XI A- N a。LI S a - e g h nh n
( h n h i r i nv ri S a g a S a g a MaimeU iesy, h n h i t t
2 0 3 C i a 0 1 5, h n )
Absrc :Thspa erds u s h y amisofa 1 8 CD v ta t i p ic s est e d n c 2 6 L 4 wa e— f m ipay mpe e tt s. De cies t e ipty i ut o te 0r ds l i lm na i on sr b h ds a cr i f h c
12864LCD液晶显示原理及使用方法
12864LCD液晶显示原理及使用方法液晶简介液晶是一种在一定温度范围内呈现既不同于固态液态又不同于气态的特殊物质态,它既具有各向异性的晶体所特有的双折射性又具有液体的流动性液晶显示器件(英文的简写为LCD)就是利用液晶态物质的液晶分子排列状态在电场中改变而调制外界光的被动型显示器件。
点阵式图形液晶显示屏是 LCD 的一种能够动态显示图形汉字以及各种符号信息为各种电子产品提供了友好的人机界面点阵式图形液晶显示屏的主要特点如下(这些特点也就是LCD 的特点):工作电压低、微功耗、体积小、可视面积大、无电磁辐射、数字接口、寿命长等特点。
12864LCD是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64 全点阵液晶显示器组成。
可完成图形显示,也可以显示8×4 个(16×16 点阵)汉字或者显示16×4个(8×16 点阵)ASCII码。
分为两种,带字库的和不带字库的。
不带字库的LCD需要自己提供字库字模,此时可以根据个人喜好设置各种字体显示风格,设计上较为灵活。
带字库的LCD提供字库字模,但是只能显示GB2312的宋体。
各有优缺点,根据不同应用场景灵活选择。
其液晶模块原理图如下所示。
12864LCD点阵图形液晶模块原理框图下面给出了其应用连接电路,分别介绍其各引脚的功能和作用。
如下表所示:12864LCD 的引脚说明管脚号管脚名称LEVER 管脚功能描述1GND 0 电源地2VCC+5.0V 电源电压3VLCD - 液晶显示器驱动电压4RS (D/I) H/LD/I=“H”,表示DB7∽DB0 为显示数据D/I=“L”,表示DB7∽DB0 为显示指令数据5R/W H/L R/W=“H”,E=“H”数据被读到DB7∽DB0R/W=“L”,E=“H→L”数据被写到IR 或DR 6EN H/L R/W=“L”,E 信号下降沿锁存DB7∽DB0R/W=“H”,E=“H”DDRAM 数据读到DB7∽DB0 7DB0 H/L 数据线8DB1 H/L数据线9DB2 H/L 数据线10DB3 H/L 数据线11DB4 H/L数据线12DB5 H/L数据线13DB6 H/L数据线14DB7 H/L数据线15CS1 H/L H:选择芯片(右半屏)信号16CS2 H/L H:选择芯片(左半屏)信号17RET H/L复位信号,低电平复位18VEE -10VLCD 驱动负电压19LED+ - LED 背光板电源20LED- - LED 背光板电源12864LCD点阵图形液晶模块应用连接电路液晶驱动设置在理解12864LCD硬件原理和管脚功能之后,可以针对LCD进行驱动的编写,分两种情况:仿真环境下和实物开发板编程。
94单片机示波器--12864
94单片机示波器–12864简介本文档介绍了使用94单片机和12864液晶屏制作示波器的方法。
示波器是一种用于查看电信号波形的仪器,它可以帮助我们理解电路的工作原理以及检测电路中的故障。
在本项目中,我们将使用94单片机和12864液晶屏来制作一个简易的示波器。
通过采集输入信号并在液晶屏上显示波形,我们可以实时观察信号的变化,并进行分析。
所需材料在开始之前,我们需要准备以下材料:•94单片机开发板•12864液晶屏•面包板和跳线•电阻、电容等元件(根据电路设计需要)硬件连接首先,我们需要将94单片机开发板和12864液晶屏进行连接。
具体的连接方式可以参考开发板和液晶屏的产品手册。
一般来说,我们需要将94单片机的引脚通过跳线连接到液晶屏的引脚上。
连接的方式可能包括并行连接、串行连接等方式,具体使用哪种连接方式可以根据液晶屏的型号进行选择。
连接完成后,我们可以将94单片机开发板上的程序下载到开发板上,并进行相应的设置。
软件设计接下来,我们需要进行软件设计。
本示波器的软件设计主要包括以下几个方面:输入信号采集我们需要使用94单片机的ADC模块来采集输入信号。
通过设置合适的引脚和参数,我们可以将输入信号通过ADC转换为数字信号,方便后续处理。
数据处理和显示采集到的数字信号需要进行处理和显示。
我们可以使用94单片机的计算能力和12864液晶屏的显示能力来进行数据处理和图形显示。
具体的数据处理方式可以根据需求进行选择。
通常可以使用FFT算法进行频谱分析,或者使用差值和滤波算法进行波形插值和滤波处理。
用户界面设计为了方便用户操作和观察,我们需要设计一个简洁明了的用户界面。
通过液晶屏上的菜单和按键,用户可以选择不同的参数和功能。
控制逻辑设计示波器的控制逻辑需要根据用户的操作来进行相应的响应和处理。
我们可以使用94单片机的中断和定时器功能来实现控制逻辑。
程序实现根据上述软件设计的要求,我们可以编写相应的程序来实现示波器的功能。
12864波形显示程序
12864显示波形实例#include <reg52.H>#include<intrins.h>#include<math.h>sbit RS=P0^0; //并行的指令/数据选择信号, H数据, L命令sbit RW=P0^1; //并行读写选择信号, H读, L写sbit E=P0^2; //并行使能端, H有效, L无效sbit PSB=P0^3; //并/串接口选择, H并,L串sbit led=P0^4;sbit jiakey=P1^0;sbit jiankey=P1^1;sbit ledkey=P1^2;#define LcdData P2unsigned char dati=0;unsigned char dat[100];unsigned char over=0;unsigned int temp=0;unsigned char mode=0;unsigned int delnop=0;//////////////////////////////////////unsigned char Lcd_CheckBusy(void){unsigned char Busy;LcdData=0xff;RS=0;RW=1;E=1;_nop_();Busy=LcdData&0x80;E=0;return Busy;}/*********************************向LCD写入字节数据**********************************/void Lcd_WriteData(unsigned char Data){while(Lcd_CheckBusy());RS=1;RW=0;E=0;_nop_();_nop_();LcdData=Data;E=1;_nop_();_nop_();E=0;}/***********************************从LCD中读出数据************************************/unsigned char Lcd_ReadData(void){unsigned char Temp;while(Lcd_CheckBusy());LcdData=0xff;RS=1;RW=1;E=1;_nop_();Temp=LcdData;E=0;return Temp;}/*************************************想LCD中写入指令代码**************************************/void Lcd_WriteCmd(unsigned char CmdCode){while(Lcd_CheckBusy());RS=0;RW=0;E=0;_nop_();_nop_();LcdData=CmdCode;_nop_();_nop_();E=1;_nop_();_nop_();E=0;}/**************************************为加速逻辑运算而设置的掩码表,这是以牺牲空间而换取时间的办法***************************************/code unsigned intLcdMaskTab[]={0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,0x0100,0x0200, 0x0400,0x0800,0x1000,0x2000,0x4000,0x8000};/***************************************向LCD指定坐标写入一个象素,象素颜色有两种,0代表白(无显示),1代表黑(有显示)****************************************/void Lcd_PutPixel(unsigned char x,unsigned char y,unsigned char Color){unsigned char z,w;unsigned int Temp;if(x>=128||y>=64)return;Color=Color%2;w=15-x%16;//确定对这个字的第多少位进行操作x=x/16;//确定为一行上的第几字if(y<32) //如果为上页z=0x80;else //否则如果为下页z=0x88;y=y%32;//EA=0;Lcd_WriteCmd(0x36);Lcd_WriteCmd(y+0x80); //行地址Lcd_WriteCmd(x+z); //列地址Temp=Lcd_ReadData();//先空读一次Temp=(unsigned int)Lcd_ReadData()<<8;//再读出高8位Temp|=(unsigned int)Lcd_ReadData();//再读出低8位//EA=1;if(Color==1) //如果写入颜色为1Temp|=LcdMaskTab[w];//在此处查表实现加速else //如果写入颜色为0Temp&=~LcdMaskTab[w];//在此处查表实现加速//EA=0;Lcd_WriteCmd(y+0x80); //行地址Lcd_WriteCmd(x+z); //列地址Lcd_WriteData(Temp>>8);//先写入高8位,再写入低8位Lcd_WriteData(Temp&0x00ff);Lcd_WriteCmd(0x30);//EA=1;}/*****************************************清除Lcd全屏,如果清除模式Mode为0,则为全屏清除为颜色0(无任何显示)否则为全屏清除为颜色1(全屏填充显示)******************************************/void Lcd_Clear(unsigned char Mode){unsigned char x,y,ii;unsigned char Temp;if(Mode%2==0)Temp=0x00;elseTemp=0xff;Lcd_WriteCmd(0x36);//扩充指令绘图显示for(ii=0;ii<9;ii+=8)for(y=0;y<0x20;y++)for(x=0;x<8;x++){//EA=0;Lcd_WriteCmd(y+0x80); //行地址Lcd_WriteCmd(x+0x80+ii); //列地址Lcd_WriteData(Temp); //写数据D15-D8Lcd_WriteData(Temp); //写数据D7-D0//EA=1;}Lcd_WriteCmd(0x30);}/****************************************LCD初始化*****************************************/void Lcd_Reset(){PSB=1;Lcd_WriteCmd(0x30); //选择基本指令集Lcd_WriteCmd(0x0c); //开显示(无游标、不反白)Lcd_WriteCmd(0x01); //清除显示,并且设定地址指针为00HLcd_WriteCmd(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位}//////////////////////////////////////void InitADC(){P1ASF=0X80;ADC_RES=0;ADC_CONTR=0xef;EADC=1;}void adc_isr() interrupt 5 using 1{ADC_CONTR=0xef;if(over==0){temp=delnop;while(temp){temp--;}dat[dati]=ADC_RES;dati++;if(dati>100){dati=0;over=1;}}}//////////////////////////////////////void disp_0(unsigned char x,unsigned char y) {Lcd_PutPixel(x+1,y+1,1);Lcd_PutPixel(x+1,y+2,1);Lcd_PutPixel(x+1,y+3,1);Lcd_PutPixel(x+2,y+0,1);Lcd_PutPixel(x+2,y+4,1);Lcd_PutPixel(x+3,y+1,1);Lcd_PutPixel(x+3,y+2,1);Lcd_PutPixel(x+3,y+3,1);}void disp_1(unsigned char x,unsigned char y) {Lcd_PutPixel(x+1,y+1,1);Lcd_PutPixel(x+1,y+4,1);Lcd_PutPixel(x+2,y+0,1);Lcd_PutPixel(x+2,y+1,1);Lcd_PutPixel(x+2,y+2,1);Lcd_PutPixel(x+2,y+3,1);Lcd_PutPixel(x+2,y+4,1);Lcd_PutPixel(x+3,y+4,1);}void disp_2(unsigned char x,unsigned char y) {Lcd_PutPixel(x+1,y+0,1);Lcd_PutPixel(x+1,y+3,1);Lcd_PutPixel(x+1,y+4,1);Lcd_PutPixel(x+2,y+0,1);Lcd_PutPixel(x+2,y+2,1);Lcd_PutPixel(x+2,y+4,1);Lcd_PutPixel(x+3,y+0,1);Lcd_PutPixel(x+3,y+1,1);Lcd_PutPixel(x+3,y+2,1);Lcd_PutPixel(x+3,y+4,1);}void disp_3(unsigned char x,unsigned char y) {Lcd_PutPixel(x+1,y+0,1);Lcd_PutPixel(x+1,y+2,1);Lcd_PutPixel(x+1,y+4,1);Lcd_PutPixel(x+2,y+0,1);Lcd_PutPixel(x+2,y+2,1);Lcd_PutPixel(x+2,y+4,1);Lcd_PutPixel(x+3,y+0,1);Lcd_PutPixel(x+3,y+1,1);Lcd_PutPixel(x+3,y+2,1);Lcd_PutPixel(x+3,y+3,1);Lcd_PutPixel(x+3,y+4,1);}void disp_4(unsigned char x,unsigned char y) {Lcd_PutPixel(x+1,y+0,1);Lcd_PutPixel(x+1,y+1,1);Lcd_PutPixel(x+1,y+2,1);Lcd_PutPixel(x+2,y+2,1);Lcd_PutPixel(x+3,y+0,1);Lcd_PutPixel(x+3,y+1,1);Lcd_PutPixel(x+3,y+2,1);Lcd_PutPixel(x+3,y+3,1);Lcd_PutPixel(x+3,y+4,1);}void disp_5(unsigned char x,unsigned char y) {Lcd_PutPixel(x+1,y+0,1);Lcd_PutPixel(x+1,y+1,1);Lcd_PutPixel(x+1,y+2,1);Lcd_PutPixel(x+1,y+4,1);Lcd_PutPixel(x+2,y+0,1);Lcd_PutPixel(x+2,y+4,1);Lcd_PutPixel(x+3,y+0,1);Lcd_PutPixel(x+3,y+2,1);Lcd_PutPixel(x+3,y+3,1);Lcd_PutPixel(x+3,y+4,1);}disp_p(unsigned char x,unsigned char y){Lcd_PutPixel(x+0,y+0,1);Lcd_PutPixel(x+1,y+0,1);Lcd_PutPixel(x+1,y+1,1);Lcd_PutPixel(x+2,y+0,1);Lcd_PutPixel(x+2,y+1,1);Lcd_PutPixel(x+2,y+2,1);Lcd_PutPixel(x+3,y+0,1);Lcd_PutPixel(x+3,y+1,1);Lcd_PutPixel(x+4,y+0,1);}disp_k(unsigned char x,unsigned char y){Lcd_PutPixel(x+0,y+0,1);Lcd_PutPixel(x+0,y+1,1);Lcd_PutPixel(x+0,y+2,1);Lcd_PutPixel(x+0,y+3,1);Lcd_PutPixel(x+0,y+4,1);Lcd_PutPixel(x+1,y+2,1);Lcd_PutPixel(x+2,y+1,1);Lcd_PutPixel(x+2,y+3,1);Lcd_PutPixel(x+3,y+0,1);Lcd_PutPixel(x+3,y+4,1);}void disp_hz(unsigned char x,unsigned char y) {Lcd_PutPixel(x+0,y+0,1);Lcd_PutPixel(x+0,y+1,1);Lcd_PutPixel(x+0,y+2,1);Lcd_PutPixel(x+0,y+3,1);Lcd_PutPixel(x+0,y+4,1);Lcd_PutPixel(x+1,y+2,1);Lcd_PutPixel(x+2,y+0,1);Lcd_PutPixel(x+2,y+1,1);Lcd_PutPixel(x+2,y+2,1);Lcd_PutPixel(x+2,y+3,1);Lcd_PutPixel(x+4,y+1,1);Lcd_PutPixel(x+4,y+3,1);Lcd_PutPixel(x+4,y+4,1);Lcd_PutPixel(x+5,y+1,1);Lcd_PutPixel(x+5,y+2,1);Lcd_PutPixel(x+5,y+4,1);}void disp_ledon(unsigned char x,unsigned char y){Lcd_PutPixel(x+1,y+0,1);Lcd_PutPixel(x+1,y+1,1);Lcd_PutPixel(x+1,y+2,1);Lcd_PutPixel(x+1,y+3,1);Lcd_PutPixel(x+1,y+4,1);Lcd_PutPixel(x+2,y+1,1);Lcd_PutPixel(x+2,y+2,1);Lcd_PutPixel(x+2,y+3,1);Lcd_PutPixel(x+3,y+0,1);Lcd_PutPixel(x+3,y+4,1);Lcd_PutPixel(x+4,y+2,1);}void disp_ledoff(unsigned char x,unsigned char y){Lcd_PutPixel(x+1,y+0,1);Lcd_PutPixel(x+1,y+1,1);Lcd_PutPixel(x+1,y+2,1);Lcd_PutPixel(x+1,y+3,1);Lcd_PutPixel(x+1,y+4,1);Lcd_PutPixel(x+2,y+1,1);Lcd_PutPixel(x+2,y+2,1);Lcd_PutPixel(x+2,y+3,1);}void clr(unsigned char starx,unsigned char stary,unsigned char endx,unsigned char endy) {char x=0;char y=0;for(x=starx;x<endx;x++){for(y=stary;y<endy;y++){Lcd_PutPixel(x,y,0);}}}void disp_bj(void){unsigned char x=0; unsigned char y=0;for(x=13;x<114;x++) {Lcd_PutPixel(x,52,1); }for(y=0;y<52;y++) {Lcd_PutPixel(13,y,1); }for(y=0;y<52;y++) {Lcd_PutPixel(114,y,1); }Lcd_PutPixel(13,51,0); Lcd_PutPixel(13,41,0); Lcd_PutPixel(13,31,0); Lcd_PutPixel(13,21,0); Lcd_PutPixel(13,11,0); Lcd_PutPixel(13,1,0); Lcd_PutPixel(114,51,0); Lcd_PutPixel(114,41,0); Lcd_PutPixel(114,31,0); Lcd_PutPixel(114,21,0); Lcd_PutPixel(114,11,0); Lcd_PutPixel(114,1,0);disp_0(5,50);disp_1(5,40);disp_2(5,30);disp_3(5,20);disp_4(5,10);disp_5(5,0);disp_0(117,50);disp_1(117,40);disp_2(117,30);disp_3(117,20);disp_4(117,10);disp_5(117,0);disp_2(13,58);disp_hz(18,58);disp_2(38,58);disp_0(43,58);disp_hz(48,58);disp_2(63,58);disp_0(68,58);disp_0(73,58);disp_hz(78,58);disp_2(88,58);disp_k(93,58);disp_hz(98,58);}line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1) {int i,dx,dy,e,x,y;Lcd_PutPixel(x0,y0,1);Lcd_PutPixel(x1,y1,1);dx=x1-x0;dy=y1-y0;x=x0;y=y0;if(dx>0&&dy>0){if(dx>dy){e=-dx;for(i=0;i<dx;i++){Lcd_PutPixel(x,y,1);x++;e=e+2*dy;if(e>=0){y++;e=e-2*dx;}}}else{e=-dy;x=x0;y=y0;for(i=0;i<dy;i++){Lcd_PutPixel(x,y,1);y++;e=e+2*dx;if(e>=0){x++;e=e-2*dy;}}}}if(dx<0&&dy<0){dx=x0-x1;dy=y0-y1;if(dx>dy){e=-dx;for(i=0;i<dx;i++){Lcd_PutPixel(x,y,1);x--;e=e+2*dy;if(e>=0){y--;e=e-2*dx;}}}else{e=-dy;for(i=0;i<dy;i++){Lcd_PutPixel(x,y,1);y--;e=e+2*dx;if(e>=0){x--;e=e-2*dy;}}}}if(dx>0&&dy<0){dy=y0-y1;if(dx>dy){e=-dx;for(i=0;i<dx;i++){Lcd_PutPixel(x,y,1);x++;e=e+2*dy;if(e>=0){y--;e=e-2*dx;}}}else{e=-dy;for(i=0;i<dy;i++){Lcd_PutPixel(x,y,1);y--;e=e+2*dx;if(e>=0){x++;e=e-2*dy;}}}}if(dx<0&&dy>0){dx=x0-x1;if(dx>dy){e=-dx;for(i=0;i<dx;i++){Lcd_PutPixel(x,y,1);x--;e=e+2*dy;if(e>=0){y++;e=e-2*dx;}}}else{e=-dy;for(i=0;i<dy;i++){Lcd_PutPixel(x,y,1);y++;e=e+2*dx;if(e>=0){x--;e=e-2*dy;}}}}if(dx!=0&&dy==0){if(dx>0){for(i=0;i<dx;i++){Lcd_PutPixel(x,y,1);x++;}}else{dx=x0-x1;for(i=0;i<dx;i++){Lcd_PutPixel(x,y,1);}}}if(dx==0&&dy!=0){if(dy>0){for(i=0;i<dy;i++){Lcd_PutPixel(x,y,1);y++;}}else{dy=y0-y1;for(i=0;i<dy;i++){Lcd_PutPixel(x,y,1);y--;}}}}disp_ware(){unsigned char x=0;unsigned char y=0;clr(14,0,15,52);for(x=1;x<100;x++){clr(x+14,0,x+15,52);line(x+13,51-(dat[x-1]/5),x+14,51-(dat[x]/5));}}//////////////////////////////////////main(){Lcd_Reset();Lcd_Clear(0);InitADC();disp_bj();EA=1;{if(over){disp_ware();if(ledkey==0){led=~led;}if(jiakey==0){if(mode<3){mode++;}}if(jiankey==0){if(mode>0){mode--;}}if(led){clr(5,58,10,63);disp_ledon(5,58);}else{clr(5,58,10,63);disp_ledoff(5,58);}switch(mode){case 0:delnop=1;disp_p(91,54);clr(66,54,71,57);clr(41,54,46,57);clr(16,54,21,57);break;case 1:delnop=40;disp_p(66,54);clr(91,54,96,57);clr(41,54,46,57);clr(16,54,21,57);break;case 2:delnop=440;disp_p(41,54);clr(91,54,96,57);clr(66,54,71,57);clr(16,54,21,57);break;case 3:delnop=4440;disp_p(16,54);clr(91,54,96,57);clr(41,54,46,57);clr(66,54,71,57);break;default:break;}over=0;}}}。
液晶模块12864点阵图形共29页
11、战争满足了,或曾经满足过人的 好斗的 本能, 但它同 时还满 足了人 对掠夺 ,破坏 以及残 酷的纪 律和专 制力的 欲望。 ——查·埃利奥 特 12、不应把纪律仅仅看成教育的手段 。纪律 是教育 过程的 结果, 首先是 学生集 体表现 在一切 生活领 域—— 生产、 日常生 活、学 校、文 化等领 域中努 力的结 果。— —马卡 连柯(名 言网)
26、要使整个人生都过得舒适、愉快,这是不可能的,因为人类必须具备一种能应付逆境的态度。——卢梭
▪
27、只有把抱怨环境的心情,化为上进的力量,才是成功的保证。——罗曼·罗兰
▪
28、知之者不如好之者,好之者不如乐之者。——孔子
▪
29、勇猛、大胆和坚定的决心能够抵得上武器的精良。——达·芬奇
▪
30、意志是一个强壮的盲人,倚靠在明眼的跛子肩上。——叔本华
13、遵守纪律的风气的培养,只有领 导者本 身在这 方面以 身作则 才能收 到成效 。—— 马卡连 柯 14、劳动者的组织性、纪律性、坚毅 精神以 及同全 世界劳 动者的 团结一 致,是 取得最 后胜利 的保证 。—— 列宁 摘自名言网
15、机会是不守纪律的。——雨果
▪
atmage16 12864液晶显示波形,画点,画线
//以下采用的是模块化编程//液晶写数据写命令//读数据读命令#include"yejing12864.h"#include"delay.h"#include<macros.h>#include<iom16v.h>#define uint unsigned int#define uchar unsigned char//定义使能#define LCD_EN1 PORTC|=BIT(4) #define LCD_EN0 PORTC&=~BIT(4)//命令模式#define LCD_RS1 PORTC|=BIT(5) #define LCD_RS0 PORTC&=~BIT(5)//读写控制#define LCD_WR1 PORTC|=BIT(6) #define LCD_WR0 PORTC&=~BIT(6)//串并口控制#define LCD_PSB1 PORTC|=BIT(7) #define LCD_PSB0 PORTC&=~BIT(7) //写地址void write12864_com(uint com){DDRB=0xff;PORTB=0xff;LCD_RS0;LCD_WR0;LCD_EN0;PORTB=com;delay_xms(1);LCD_EN1;delay_xms(1);LCD_EN0;}//写数据void write12864_date(uint date) {DDRB=0xff;PORTB=0xff;LCD_RS1;LCD_WR0;LCD_EN0;PORTB=date;delay_xms(1);LCD_EN1;delay_xms(1);LCD_EN0;}//读数据uchar read_12864(void){uchar shuju;DDRB=0x00;PORTB=0xff;LCD_RS1;LCD_WR1;LCD_EN0;delay_xms(1); LCD_EN1;delay_xms(1);shuju=PINB;delay_xms(1);LCD_EN0;return(shuju);}//12864液晶初始化void LCD12864_init(void){LCD_PSB1;write12864_com(0x30);delay_xms(1);write12864_com(0x0c);delay_xms(1);write12864_com(0x01);delay_xms(1);}//12864液晶画图时的清屏函数void clrRAM_12864(void){uchar i,j;for(i=0;i<64;i++)for(j=0;j<16;j++){write12864_com(0x34);write12864_com(i+0x80);write12864_com(j+0x80);write12864_com(0x30);write12864_date(0x00);write12864_date(0x00);}}//延时函数 atmage16单片机4M晶振1us和1ms的准确延时#include"delay.h"void delay_xus(uint n){uint i;n=n*5/16;for(i=0;i<n;i++);}void delay_xms(uint x){while(x--){uint i;for(i=0;i<666;i++);}}//主函数,在12864液晶上显示有0通道出来的数据,转换成点#include<iom16v.h>#include<macros.h>#include<math.h>#include"delay.h"#include"yejing12864.h"#include"dianxs12864.h"#include"xianxs12864.h"#include"zbx.h"#define uchar unsigned char#define uint unsigned intuchar table[]="0123456789";uint adc_result;void ad_init(void){ADMUX=0x40;//参考电压的设置,数据对齐方式,通道的选择 ADCSRA=0xe6;//delay_xms(1000);}void main(void){uint q,b,s,g;DDRB=0xff;//端口初始化PORTB=0xff;DDRA&=~BIT(0);//电位器接在PA0上PORTA&=~BIT(0);DDRC=0xf0;PORTC=0xf0;clrRAM_12864();delay_xms(50);LCD12864_init();ad_init();while(1){uint i,xa,ya,py;uint pro_result;uint adc_l,adc_h;adc_l=ADCL;adc_h=ADCH;adc_result=adc_h*256+adc_l;zbx();if(pro_result!=adc_result);{pro_result=adc_result;ya=fabs(32-adc_result*32/1023);if(xa==0){py=ya;dianxs12864(8,ya,1);}xianxs_ry(xa+7,py,xa+8,ya,1);py=ya;xa=xa+2;if(xa>=128){xa=0;clrRAM_12864();delay_xms(50);}}q=adc_result/1000;b=adc_result%1000/100;s=adc_result%100/10;g=adc_result%10;write12864_com(0x9c);write12864_date(table[q]);write12864_date(table[b]);write12864_date(table[s]);write12864_date(table[g]);}}/*#pragma interrupt_handler AD_isr:15; void AD_isr(void){uint adc_l,adc_h;adc_l=ADCL;adc_h=ADCH;adc_result=adc_h*256+adc_l;}*///显示一个坐标轴#include"dianxs12864.h"#include"xianxs12864.h"#include"zbx.h"#define uint unsigned int#define uchar unsigned charvoid zbx(void){xianxs_shu(7,0,63,1);//画一个垂直的轴xianxs_heng(0,127,32,1); //画一个横轴//以十格为单位,给横轴画点dianxs12864(17,31,1);dianxs12864(27,31,1);dianxs12864(37,31,1);dianxs12864(47,31,1);dianxs12864(57,31,1);dianxs12864(67,31,1);dianxs12864(77,31,1);dianxs12864(87,31,1);dianxs12864(97,31,1);dianxs12864(107,31,1);dianxs12864(117,31,1);//以十格为单位,垂直轴上的点dianxs12864(8,2,1);dianxs12864(8,12,1);dianxs12864(8,22,1);dianxs12864(8,42,1);dianxs12864(8,52,1);dianxs12864(8,62,1);//垂直轴上的箭头dianxs12864(6,1,1);dianxs12864(5,2,1);dianxs12864(8,1,1);dianxs12864(9,2,1);//横轴上的箭头dianxs12864(126,31,1);dianxs12864(125,30,1);dianxs12864(126,33,1);dianxs12864(125,34,1);}//点显示函数#include"dianxs12864.h"#include"delay.h"#include"yejing12864.h"#include<iom16v.h>#include<macros.h>#define uchar unsigned char#define uint unsigned int//******************************************************** //打点函数//参数:color=1,该点填充(1);color=0,该点填充(0);//********************************************************void dianxs12864(uchar x,uchar y,uchar color){uchar x_dyte,x_byte;//横坐标在哪一个字节,哪一位uchar y_dyte,y_byte;//纵坐标在哪一个字节,哪一位uchar high ,low; //定义存放读出来的两个数据//write12864_com(0x01);//write12864_com(0x34);write12864_com(0x36);//x,y的坐标互换,即普通的x,y坐标x_dyte=x/16; //算出它在哪一个字节(地址)//一个地址是16位的x_byte=x&0x0f; //算出他在哪一位y_dyte=y/32; //确定是上半屏还是下半屏//0:上半屏,1下半屏y_byte=y&0x1f; //计算0~31当中的哪一行,即确定是在第几行 write12864_com(0x80+y_byte);//先写垂直坐标(最高位必须为1)write12864_com(0x80+x_dyte+8*y_dyte);//水平坐标//下半屏的水平坐标起始地址为0x80//(+8*y_byte)来确定//是用上半屏还是下半屏read_12864(); //先空读一次high=read_12864(); //读高位low=read_12864(); //读低位delay_xms(1);write12864_com(0x80+y_byte);//先写垂直坐标(最高位必须为1)write12864_com(0x80+x_dyte+8*y_dyte);//水平坐标//下半屏的水平坐标起始地址为0x80//(+8*y_byte)来确定//是用上半屏还是下半屏if(x_byte<8){if(color==1)write12864_date(high|(0X01<<(7-x_byte)));//写高字节因为坐标是从左到右的elsewrite12864_date(high&(~(0X01<<(7-x_byte))));write12864_date(low); //原数据送回}else{write12864_date(high);if(color==1)write12864_date(low|(0x01<<(15-x_byte)));elsewrite12864_date(low&(~(0x01<<(15-x_byte))));}write12864_com(0x30);}//横线,竖线,任意线显示显示#include"xianxs12864.h"#include"dianxs12864.h"#define uchar unsigned char#define uint unsigned int//横线显示当y相等时void xianxs_heng(uchar x0,uchar x1,uchar y,uchar color){uchar t;if(x0 > x1){t=x1;x1=x0;x0=t;}for(;x0 <= x1;x0++){dianxs12864(x0,y,color);}}//竖线显示当x相等时void xianxs_shu(uchar x,uchar y0,uchar y1,uchar color){uchar z;if(y0>y1){z=y1;y1=y0;y0=z;}for(;y0<=y1;y0++){dianxs12864(x,y0,color);}}//下面是两种不同的表达形式//第一种这个是把bresenham算法的结论来做的算法void xianxs_ry(uchar x0,uchar y0,uchar x1,uchar y1,uchar color) {int temp;int dx,dy;int s1,s2,status,i;int Dx,Dy,sub;dx=x1-x0;if(dx>=0)//判断x是增加还是减小s1=1;elses1=-1;dy=y1-y0;if(dy>=0)//判断x是增加还是减小s2=1;elses2=-1;if(dx<0)Dx=-dx;elseDx=dx;if(dy<0)Dy=-dy;elseDy=dy;if(Dy>Dx) //以角度45为分界线,靠近y轴是status=1,靠近x轴是status=0 {temp=Dx;Dx=Dy;Dy=temp;status=1;}elsestatus=0;//判断垂直线和水平线if(dx==0)xianxs_shu(x0,y0,y1,color);if(dy==0)xianxs_heng(x0,x1,y0,color);//bresenham算法画任意两点的直线sub=2*Dy-Dx;//第一次判断下一个点的位置for(i=0;i<Dx;i++){dianxs12864(x0,y0,color);//画出第一个点if(sub>=0){if(status==1)//靠近y轴x0=x0+s1; //x加1else//靠近x轴y0=y0+s2; //y加1sub=sub-2*Dx;//计算下一个点的位置}if(status==1)y0=y0+s2;elsex0=x0+s1;sub=sub+2*Dy;}}//下面这种方法也可以显示//这个是把bresenham算法的过程来做的算法/*//任意的两个点显示void xianxs_ry(uchar x0,uchar y0,uchar x1,uchar y1,uchar color) {int t,distance;int x=0,y=0,dx,dy;char cx,cy;dx=x1-x0;dy=y1-y0;//判断两个横坐标的大小if(dx>0){cx=1;}else if(dx==0)//两个横坐标相等则输出横的直线{xianxs_shu(x0,y0,y1,color);return;}else{cx=-1;}//判断两个做坐标的大小if(dy>0){cy=1;}else if(dy==0){xianxs_heng(x0,x1,y0,color);return;}else{cy=-1;}//对dx和dy取绝对值,使其为正整数if(dx<0)dx=-dx;if(dy<0)dy=-dy;//判断两个大小,把大的给变量distanceif(dx>dy){distance=dx;}else{distance=dy;}dianxs12864(x0,y0,color);//画出第一个点//画线for(t=0;t<=distance+1;t++){dianxs12864(x0,y0,color);//显示在那个点 x=x+dx;y=y+dy;if(x>distance){x=x-distance;x0=x0+cx;}if(y>distance){y=y-distance;y0=y0+cy;}}}*///以下是以上个子函数的.h文件//延时函数#ifndef __DELAY_H__#define __DELAY_H__#include<iom16v.h>#include<macros.h>#define uint unsigned int#define uchar unsigned charvoid delay_xus(uint x);void delay_xms(uint t);#endif#ifndef __YEJING12864_H__#define __YEJING12864_H__#define uchar unsigned char#define uint unsigned intvoid write12864_com(uint com);void write12864_date(uint date);uchar read_12864(void);void LCD12864_init(void);void clrRAM_12864(void);#endif#ifndef __DIANXS12864_H__#define __DIANXS12864_H__#include<iom16v.h>#include<macros.h>#define uint unsigned int#define uchar unsigned charvoid dianxs12864(uchar x,uchar y,uchar color);//void clrRAM_12864(void);#endif#ifndef __XIANXS12864_H__#define __XIANXS12864_H__#include<iom16v.h>#include<macros.h>#define uint unsigned int#define uchar unsigned charvoid xianxs_heng(uchar x0,uchar x1,uchar y,uchar color);void xianxs_shu(uchar x,uchar y0,uchar y1,uchar color);void xianxs_ry(uchar x0,uchar y0,uchar x1,uchar y1,uchar color); #endif#ifndef __ZBX_H__#define __ZBX_H__#define uint unsigned int#define uchar unsigned charvoid zbx(void);#endif。
- 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);}。