如何用12864液晶显示图片和绘制任意函数图象(打点)

一. 显示图片

显示图片的要点在于:1.取模 2.利用扩展指令设置液晶3.清楚液晶地址的概念

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();

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;

}

这样,整个代码就全部讲完了,下面是显示正弦波的图片

时间: 2024-12-29 22:32:37

如何用12864液晶显示图片和绘制任意函数图象(打点)的相关文章

iOS开发Quzrtz2D 十:圆形图片的绘制以及加边框圆形图片的绘制

一:圆形图片的绘制 @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageV; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; /** * UIBezierPath:绘制路径,就是根据路径对图形上下文进行构造 */ //0.加载图片 UIImage *image = [UII

如何在html中把一个图片或者表格覆盖在一张已有图片上的任意位置

如何在html中把一个图片或者表格覆盖在一张已有图片上的任意位置 <div style="position:relative;"> <img src="" width="500" height="500" /> <div style="position:absolute; left:80px; top:50px; border:#000 solid 1px;"><i

计算机图形学 绘制任意斜率的直线(1)

作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/40025917 本文演示,通过自己编写绘制直线函数(像素点填充),绘制任意斜率的直线. 1)创建CP2类 头文件:p2.h // P2.h: interface for the CP2 class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX

使用ImageMagick 在图片上绘制粗斜体的中文也许是一个错误。

测试发现: ImageMagick使用中文字体,在图片上绘制带粗或斜体的中文,看不到效果. 如果使用英文字体,绘制粗或斜体的英文,99%都有效果. 今天无意看到一篇文章提到: convert -list font 获得系统目前拥有的字体的列表,其中glyphs一项是字体的文件. 试了一下,果然能列出所有的字体. 但和windows的字体选择对话框一对比,郁闷了. 比如windows的字体选择对话框里显示“宋体”和“新宋体”. 但在 convert -list font 列出来的是: Font: 

用中点Bresenham画直线算法绘制任意斜率直线

使用VC 6.0 mfc实现编程 刚学的图像学,挺难学的,show 代码吧 void CLineView::OnDraw(CDC* pDC) { CLineDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here int x1 ,x2 ,y1,y2 ; x1 = 0 ; y1 = 0 ;  x2 = 1000 ; y2 = 500 ; COLORREF c = RGB(25

在图片上绘制图形和添加文字

使用opencv读取图片,在图片上绘制线条.矩形.圆.多边形和添加文字 1.画线 #!/usr/bin/python3 # -*- coding:utf-8 -*- import cv2 import numpy as np # 读取一张图片 img = cv2.imread('img.jpg',cv2.IMREAD_COLOR) #画线 , 目标,起始坐标,终点坐标,颜色,线宽 cv2.line(img,(10,10),(200,100),(255,255,255),5) #画矩形 , 目标,

微信朋友圈的图片上传,多图上传怎么去撸才合适?我们一起来实现吧!

微信朋友圈的图片上传,多图上传怎么去撸才合适?我们一起来实现吧! 图片上传是非常常见的功能,而多图上传在大多数应用中也是非常常见的,比如微信的朋友圈,微博的动态,都是有九宫格图片的,那这里肯定涉及了多图上传,所以今天我们来一起撸一下,怎么去思考这个实现逻辑! 这里我想到的思路是比较简单的,首先,我们有一个按钮,按钮是上传图片,点击之后弹出某个界面进行图片的选择,一般是九张图片或者十二张,选完之后就直接上传了,大致的流程应该是这个样子,那我们首先来写个按钮 activity_main.xml <?

用Enterprise Architecture绘制十种UML图

UML课程作业要求绘制十种UML图,选择Enterprise Architecture作为绘图工具,每次绘制图都要上网找教程,感觉十分麻烦,而且有些图没有找到具体教程,靠自己摸索找到了绘制方法,现在总结一下使用Enterprise Architecture如何绘制这十种图,方便大家使用.(写完博客后发表发现图都没了,坑爹的CSDN,大家按照文字描述的步骤也能顺利完成) 首先这十种图分别是: 概念类图,活动图,状态机图,用例图,顺序图,通讯图,设计类图,包图,组件图,部署图. 先来介绍一下前五种图

如何绘制思维导图

思维导图是很实用的工具,可以将我们的思维最大化的展示出来,发挥个人潜力,可以通过文字,图片,颜色,等进行展示,最好通过图文并茂的形式进行展示,这样会加大视觉体验,可以让思维导图发挥其更大的用途,当然也有很多绘制思维导图的书籍,里面有很多理论知识,但是看完之后很容易忘记,所以自己动手绘制是一件很好的方法,那要如何绘制思维导图呢?下面是分享的操作方法希望可以帮助到大家. 绘制工具及原料: 电脑,网线 绘制方法: 1.小编这里讲述的是利用在线网站绘制思维导图,那要做的就是在百度中搜索在线绘制思维导图工