//如果只是要话一个点的话简单,这里是个串口程序
#include <reg52h>
#include <intrinsh>
#define uchar unsigned char
#define uint unsigned int
/LCD接口定义/
sbit SID = P1^0; //串行数据
sbit SCLK = P1^1; //串行同步时钟
/汉字地址表/
uchar code addr_tab[]={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行汉字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行汉字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行汉字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//第四行汉字位置
};
/n(ms)延时子程序/
void delayms(uint t) //约延时n(ms)
{
uint i;
while(t--)
{
for(i=0;i<125;i++);
}
}
/串行发送一个字节/
void SendByte(uchar Dbyte)
{
uchar i;
for(i=0;i<8;i++)
{
SCLK = 0;
Dbyte=Dbyte<<1; //左移一位
SID = CY; //移出的位给SID
SCLK = 1;
SCLK = 0;
}
}
/写指令/
void Lcd_WriteCmd(uchar Cbyte )
{
//delayms(1);
SendByte(0xf8); //11111,RW(0),RS(0),0
SendByte(0xf0&Cbyte); //高四位
SendByte(0xf0&Cbyte<<4); //低四位(先执行<<)
}
/写数据/
void Lcd_WriteData(uchar Dbyte )
{
//delayms(1);
SendByte(0xfa); //11111,RW(0),RS(1),0
SendByte(0xf0&Dbyte); //高四位
SendByte(0xf0&Dbyte<<4); //低四位(先执行<<)
}
/初始化LCD/
void Lcd_Init(void)
{
delayms(3);
Lcd_WriteCmd(0x30); //选择基本指令集
delayms(1);
Lcd_WriteCmd(0x30); //选择8bit数据流
delayms(1);
Lcd_WriteCmd(0x0c); //开显示(无游标、不反白)
delayms(1);
Lcd_WriteCmd(0x01); //清除显示,并且设定地址指针为00H
delayms(2);
}
void pic_Disp(uchar x,uchar y) //显示一个点
{
Lcd_WriteCmd(0x34); //切换到扩充指令,
Lcd_WriteCmd(0x34);//关闭图形显示
Lcd_WriteCmd(0x80+y); //行地址
Lcd_WriteCmd(0x80+x); //列地址,如果是下半屏这里多加8
Lcd_WriteData(0); //写数据 D15-D8
Lcd_WriteData(1); //写数据 D7-D0
Lcd_WriteCmd(0x36);//打开图形显示
}
void main()
{
Lcd_Init();
pic_Disp(1,1);
while(1);
}
给你测试了,行可行
下面论述的前提:LZ 得清楚,12864 实际上是 25632 点,把后面的 一半 搬到 第三行、第四行进行显示的。(这也是为什么 反白显示 只能是 1、3同步、2、4同步的原因)
首先得了解 绘图区 的结构:12864 这个屏的 绘图区,分有 16大列,每大列 有 16小列(点),1616=256,于是 它分成了 前 8大列 放在 第一、二行,后8 大列放在 第三、四行。告诉你这个结构,是想说:12864 的绘图区,是以 大列(16小列) 为单位进行 数据输入 显示的。现在来说题目:
1、从 0,0开始,这个最简单,由于从原点开始,可以直接输入数据。但要注意:
①输入的 横向长度,必须是 大列(16点)的整数倍,也就是说,你输入的数据,必须是 2Byte 的整数倍。如不足 长度,应自行补充。比如输入的 长度 为 35×16,横向35,不是 16的整数倍,那么输完 前面的 32 点后,横向还有 3个点,要补0 扩展成 16位 再输入。也就是说,你补充了0(显示为空白)后,实际数据为 48×16。
②因12864 不支持 自动换行,数据输入时,要自行在 横向结束时,进行换行(不是 12864 的四个行,而是每个 小点行)。
2,不从 0,0开始,这个比较繁琐。如果 起点的 横坐标的是 16的整数倍,可以直接通过 绘图 大列定位。如果起点坐标不是 16 的整数倍,那么要 先在每横向数据 的前面进行 填0 补充,虚构一个 16的整数倍。比如,起点在 18,0,那就需要在前面补 2个0,虚构起点在 16,0 的位置。这只是困难的开头,2个0 补充在数据头后,数据的低 2位就得 往 下一个数据 推了。这就是 连续数据 移位,一直移动到 横向长度 的结尾,再根据 LZ 上一个问题的方法处理结尾。连续数据 移位,比如:11100001 ,00011110,01111000,10000111,连续右移2位后,是 00111000,01000111,10011110,00100001, 11(000000,00000000),括号部分为12864补充 的长度,让数据为 16点 的整数倍。
1-1,尺寸不足 12864,就会导致其他区域数据的不定性(为上次的遗留),如果只需这个,那就应该在 绘图之前,进行 绘图区清0,也就是 输入 12864 点 的 0数据。
1-2,下半屏的坐标,参考 了解的 屏结构。
程序没看出什么问题,每一个半屏是12832=4096个像素,外循环32次;内循环16次,每一个write_data是一字节8位,对应8个像素点,这样32168就是4096个像素,就是半屏。
以上就是关于求一个12864画点简单程序,和一个画图的简单程序,不要教程 要亲测过可以才行。全部的内容,包括:求一个12864画点简单程序,和一个画图的简单程序,不要教程 要亲测过可以才行。、(51 单片机)关于 12864 区域 绘图,即 任意起始位置,绘任意太小的图片 、12864显示图像函数解释等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)