12864的程序Word格式文档下载.docx
- 文档编号:19863739
- 上传时间:2023-01-11
- 格式:DOCX
- 页数:15
- 大小:408.58KB
12864的程序Word格式文档下载.docx
《12864的程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《12864的程序Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。
1.#include"
reg52.h"
2.#include"
intrins.h"
3.sbitio_LCD12864_RS=P1^0;
4.sbitio_LCD12864_RW=P1^1;
5.sbitio_LCD12864_EN=P1^2;
6.
7.#defineio_LCD12864_DATAPORTP0
8.
9.#defineSET_DATA
io_LCD12864_RS=1;
10.#defineSET_INC
io_LCD12864_RS=0;
11.#defineSET_READ
io_LCD12864_RW=1;
12.#defineSET_WRITEio_LCD12864_RW=0;
13.#defineSET_EN
io_LCD12864_EN=1;
14.#defineCLR_EN
io_LCD12864_EN=0;
15.
16.
17.voidv_Lcd12864CheckBusy_f(void)
//忙检测函数
18.{
19.
unsignedintnTimeOut=0;
20.
SET_INC
21.
SET_READ
22.
CLR_EN
23.
SET_EN
24.
while((io_LCD12864_DATAPORT&
0x80)&
&
(++nTimeOut!
=0));
25.
26.
27.
28.}
29.
30.voidv_Lcd12864SendCmd_f(unsignedcharbyCmd)
//发送命令
31.{
32.
v_Lcd12864CheckBusy_f();
33.
34.
SET_WRITE
35.
36.
io_LCD12864_DATAPORT=byCmd;
37.
_nop_();
38.
39.
SET_EN
40.
41.
42.
43.
44.
45.}
46.voidv_Lcd12864SendData_f(unsignedcharbyData)
//发送数据
47.{
48.
49.
SET_DATA
50.
51.
52.
io_LCD12864_DATAPORT=byData;
53.
54.
55.
56.
57.
58.
59.
60.
61.}
62.
63.voidv_DelayMs_f(unsignedintnDelay)
//延时
64.{
65.
unsignedinti;
66.
for(;
nDelay>
0;
nDelay--)
67.
{
68.
for(i=125;
i>
i--);
69.
}
70.}
71.
72.voidv_Lcd12864Init_f(void)
//初始化
73.{
74.
v_Lcd12864SendCmd_f(0x30);
//基本指令集
75.
v_DelayMs_f(50);
76.
v_Lcd12864SendCmd_f(0x01);
//清屏
77.
78.
v_Lcd12864SendCmd_f(0x06);
//光标右移
79.
80.
v_Lcd12864SendCmd_f(0x0c);
//开显示
81.}
82.voidv_Lcd12864SetAddress_f(unsignedcharx,y)
//地址转换
83.{
84.
unsignedcharbyAddress;
85.
switch(y)
86.
87.
case0:
byAddress=0x80+x;
88.
break;
89.
case1:
byAddress=0x90+x;
90.
break;
91.
case2:
byAddress=0x88+x;
92.
93.
case3:
byAddress=0x98+x;
94.
95.
default:
96.
97.
98.
v_Lcd12864SendCmd_f(byAddress);
99.}
100.voidv_Lcd12864PutString_f(unsignedcharx,unsignedchary,unsignedchar*pData)
101.{
102.
v_Lcd12864SetAddress_f(x,y);
103.
while(*pData!
='
\0'
)
104.
105.
v_Lcd12864SendData_f(*pData++);
106.
}
107.
108.}
109.voidmain(void)
110.{
111.
v_Lcd12864Init_f();
112.
113.
v_Lcd12864PutString_f(0,0,"
电子工程师之家"
);
114.
v_Lcd12864PutString_f(2,1,"
欢迎光临"
115.
v_Lcd12864PutString_f(0,2,"
*LCD12864ST7920*"
116.
v_Lcd12864PutString_f(0,3,"
★○◇◆※☆■△"
117.
while
(1);
118.}
复制代码
怎么样,你弄出来了吗,很简单吧~~
下一章节内容将学习如何在LCD12864液晶屏上画图。
尽请期待^_^
玩转12864液晶显示图片,画点,画任意直线
通过上一篇的实验,相信大家都掌握了显示字符的基本用法。
下面我们来看一下12864液晶更高级的用法。
首先是它的绘图功能。
让我们先来显示一整副的图片吧,也就是128x64大小。
在使用绘图功能时,先要打开扩充指令集,然后再打开绘图功能。
接着就是送数据显示了。
这里我们首先要弄明白ST7920的显示坐标关系。
其显示坐标如下。
从图中可以看出,X方向共有8个字(16个字节)Y方向共有0~31行分为上下两个屏。
弄懂了之后我们就可以依照此坐标来显示一整屏的图片了。
随便用一个图片的提取转换软件,讲一副126X64大小的图片转换成字节数据,总共字节大小为128*64/8=1024个字节。
下面我们来看看这个显示整屏图像的函数
voidv_Lcd12864DrawPicture_f(unsignedcharcode*pPicture)
{
unsignedchari,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++);
}
看看效果图片如下:
显示一个人的图像
下面来看看如何在任意一个位置显示或者是擦除一个点
对于12864这种二值显示屏来说,其显示状态无外乎显示和不显示一个点这两种状态。
而在任意位置画点,是我们随心所欲的画线,画圆,画矩形的等GUI函数的基础。
为了让这个位置有一个参考点,我们有必要定义一个坐标系
在这里,我定义的坐标系如下
0,0------------------------------------127,0
|
|
0,63----------------------------------127,63
0,0代表屏幕的左上角,127,63代表屏幕的右下角。
对于屏幕上面任意一个点,如果我们想要点亮它,必须先读出此点的状态,然后再修改该点,最后送出去,即读----修改----写。
按照这个步骤,然后再运用C语言中的位操作运算符可以很方便的完成画点的函数。
由于画点函数涉及到读ST7920内部RAM的操作,因此,我们必须先要完成这个读数据的函数
具体实现过程如下:
unsignedcharu8_Lcd12864ReadByte_f(void)
unsignedcharbyReturnValue;
io_LCD12864_DATAPORT=0xff;
byReturnValue=io_LCD12864_DATAPORT;
returnbyReturnValue;
然后是画点的函数,其实现过程如下:
voidv_Lcd12864DrawPoint_f(unsignedcharX,unsignedcharY,unsignedcharColor)
unsignedcharRow,Tier,Tier_bit
;
unsignedcharReadOldH,ReadOldL;
v_Lcd12864SendCmd_f(0x34);
v_Lcd12864SendCmd_f(0x36);
Tier=X>
>
4;
Tier_bit=X&
0x0f;
if(Y<
32)
{?
Row=Y;
Row=Y-32;
Tier+=8;
v_Lcd12864SendCmd_f(Row+0x80);
v_Lcd12864SendCmd_f(Tier+0x80);
u8_Lcd12864ReadByte_f();
ReadOldH=u8_Lcd12864ReadByte_f();
ReadOldL=u8_Lcd12864ReadByte_f();
v_Lcd12864SendCmd_f(Row+0x80)
if(Tier_bit<
8)
switch(Color)
case0:
ReadOldH&
=(~(0x01<
<
(7-Tier_bit)));
break;
case1:
ReadOldH|=(0x01<
(7-Tier_bit));
case2:
ReadOldH^=(0x01<
(7-Tier_bit))
default:
v_Lcd12864SendData_f(ReadOldH);
v_Lcd12864SendData_f(ReadOldL);
switch(Color)
ReadOldL&
=(~(0x01<
(15-Tier_bit)));
ReadOldL|=(0x01<
(15-Tier_bit))
ReadOldL^=(0x01<
(15-Tier_bit));
v_Lcd12864SendCmd_f(0x30)
有了画点的函数之后,一切似乎都变得简单了,因为点是一切复杂图形的最基本的组成单位。
下面我们就在这个画点函数的基础上,实现画水平线和垂直线的两个函数。
画水平线:
voidv_Lcd12864DrawLineX_f(unsignedcharX0,unsignedcharX1,unsignedcharY,unsignedcharColor)
{
unsignedcharTemp;
if(X0>
X1)
Temp=X1;
X1=X0;
X0=Temp;
X0<
=X1;
X0++)
v_Lcd12864DrawPoint_f(X0,Y,Color);
画垂直线:
voidv_Lcd12864DrawLineY_f(unsignedcharX,unsignedcharY0,unsignedcharY1,unsignedcharColor)
if(Y0>
Y1)
Temp=Y1;
Y1=Y0;
Y0=Temp;
for(;
Y0<
=Y1;
Y0++)
v_Lcd12864DrawPoint_f(X,Y0,Color)
下面我们就用以上两个画线函数,在液晶屏上面画一个表格出来
v_Lcd12864DrawLineX_f(0,127,0,1);
v_Lcd12864DrawLineX_f(0,127,7,1);
v_Lcd12864DrawLineX_f(0,127,15,1);
v_Lcd12864DrawLineX_f(0,127,23,1);
v_Lcd12864DrawLineX_f(0,127,31,1);
v_Lcd12864DrawLineX_f(0,127,39,1);
v_Lcd12864DrawLineX_f(0,127,47,1);
v_Lcd12864DrawLineX_f(0,127,55,1);
v_Lcd12864DrawLineX_f(0,127,63,1);
v_Lcd12864DrawLineY_f(0,0,63,1);
v_Lcd12864DrawLineY_f(15,0,63,1);
v_Lcd12864DrawLineY_f(31,0,63,1);
v_Lcd12864DrawLineY_f(47,0,63,1);
v_Lcd12864DrawLineY_f(63,0,63,1);
v_Lcd12864DrawLineY_f(79,0,63,1);
v_Lcd12864DrawLineY_f(95,0,63,1);
v_Lcd12864DrawLineY_f(111,0,63,1);
v_Lcd12864DrawLineY_f(127,0,63,1);
看看显示效果
怎么样,你的实现了吗?
只能画水平线和垂直线似乎太简单和单调点了。
要是能在任意两点间画一条直线就好了,那样我们就可以做很多事情了。
下面就让我们去实现它!
在这里我们采用Bresenham画线算法,关于这个算法,网上有很多资料,请大家以它为关键字到网上去搜索,在这里就不啰嗦了。
下面是算法的具体实现过程:
voidv_Lcd12864DrawLine_f(unsignedcharStartX,unsignedcharStartY,unsignedcharEndX,unsignedcharEndY,unsignedcharColor)
intt,distance;
/*根据屏幕大小改变变量类型(如改为int型)*/
intx=0,y=0,delta_x,delta_y;
charincx,incy;
delta_x=EndX-StartX;
delta_y
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 12864 程序