关于12864如何显示八行的问题
2017-11-17 20:20
579 查看
第一次写技术博客,哈哈,工程师就是喜欢分享。当自己做出来的东西,没有人能分享喜悦,那真的是很糟糕。
前一段时间做了个12864显示屏的驱动。那么大的屏,偏偏只能显示4行,总觉得不甘心,琢磨着搞个八行的显示。虽然最后被老板pass掉了,但是大家看看还是不错的。
(一)带字库的12864
大多数朋友买到的12864都是带字库的,字库就是厂家已经抠出字形放在12864的内存里,显示的时候直接调用就可以了。我们就从12864的内存说起,内存啥意思,就不多说了。
12864的内存一般可以分为两种:文本显示DDRAM;绘图显示GDRAM。
字库一般就存放在文本显示中,文本显示包括8X4行的汉字空间,有三种显示方式,当然也对应于三种不同的内存空间。
(1)全字宽中文字型CGROM:可以显示16X16的汉字;
(2)半字宽英文字型HCGROM:可以显示8X16的英文和符号(以ASCII码的顺序编排);
(3)自定义字型CGRAM:可以用取码软件取字码,但是一个字占半屏,没什么意义。
其实到这里,相信很多朋友都已经看出来了,所谓的ROM,就是只读存储器。12864在出厂的时候,厂家已经将字型做成字库存在ROM中,我们可以直接用。这就是带字库的12864.
科普就到这里,说了那么多,12864到底是怎样显示的?(写到这里已经好累了,我不适合写作。。。)
向12864发送显示数据有两种方式:并行和串行。并行就不讲了,占用太多资源。这里就以串行显示的方式开始。串行显示需要三根线,片选,时钟,数据;典型的SPI串行传输。。。(SPI就不多说了)
最底层的发送函数,必须先满足12864的时序、方向(由高位到地位,还是地位到高位),这些其实都是协议了,不多说,直接看图:(好烦呐,贴不上图
)
(弄了半小时,天呐,咋就这么难。。。)三根线的时序如图所示,从图中我们可以看出:片选端在高电平的时候有效,时钟信号的下降沿数据锁存(其实这个不容易看出来),24个时钟脉冲发送一个字节。发送格式图中也有说明,第一个字节是固定格式,第二个字节发送数据的高四位,第三个字节发送数据的第四位。
cyPORT &= ~BIT(cyCLK); //时钟
while(j > 0)
{
if(j == 3) temp = firstbyte;//第一个字节
else if(j == 2)
temp = transdata&0xf0;//第二个字节
else
temp = (transdata << 4) & 0xf0;//第三个字节
for(i = 8;i > 0;i--)//发送一个字节
{
if(temp & 0x80)
cyPORT |= BIT(cySID);
else cyPORT &= ~BIT(cySID);
cyPORT |= BIT(cyCLK); //模拟时钟脉冲
temp <<= 1;
cyPORT &= ~BIT(cyCLK);
} //三个字节之间一定要有足够的延时,否则易出现时序问题
if(j == 3)
delay_Nus(600);
else delay_Nus(200);
j--;
}
cyPORT &= ~BIT(cySID);
cyPORT &= ~BIT(cyCS);
}
这是一个用IO口模拟的。大家应该可以看懂,今天先到这里了,我要休息了。。。。
前一段时间做了个12864显示屏的驱动。那么大的屏,偏偏只能显示4行,总觉得不甘心,琢磨着搞个八行的显示。虽然最后被老板pass掉了,但是大家看看还是不错的。
(一)带字库的12864
大多数朋友买到的12864都是带字库的,字库就是厂家已经抠出字形放在12864的内存里,显示的时候直接调用就可以了。我们就从12864的内存说起,内存啥意思,就不多说了。
12864的内存一般可以分为两种:文本显示DDRAM;绘图显示GDRAM。
字库一般就存放在文本显示中,文本显示包括8X4行的汉字空间,有三种显示方式,当然也对应于三种不同的内存空间。
(1)全字宽中文字型CGROM:可以显示16X16的汉字;
(2)半字宽英文字型HCGROM:可以显示8X16的英文和符号(以ASCII码的顺序编排);
(3)自定义字型CGRAM:可以用取码软件取字码,但是一个字占半屏,没什么意义。
其实到这里,相信很多朋友都已经看出来了,所谓的ROM,就是只读存储器。12864在出厂的时候,厂家已经将字型做成字库存在ROM中,我们可以直接用。这就是带字库的12864.
科普就到这里,说了那么多,12864到底是怎样显示的?(写到这里已经好累了,我不适合写作。。。)
向12864发送显示数据有两种方式:并行和串行。并行就不讲了,占用太多资源。这里就以串行显示的方式开始。串行显示需要三根线,片选,时钟,数据;典型的SPI串行传输。。。(SPI就不多说了)
最底层的发送函数,必须先满足12864的时序、方向(由高位到地位,还是地位到高位),这些其实都是协议了,不多说,直接看图:(好烦呐,贴不上图
)
(弄了半小时,天呐,咋就这么难。。。)三根线的时序如图所示,从图中我们可以看出:片选端在高电平的时候有效,时钟信号的下降沿数据锁存(其实这个不容易看出来),24个时钟脉冲发送一个字节。发送格式图中也有说明,第一个字节是固定格式,第二个字节发送数据的高四位,第三个字节发送数据的第四位。
void Send(ubyte type,ubyte transdata) { ubyte firstbyte = 0xf8; //第一个字节格式 ubyte temp0,temp1,temp2; if(type) firstbyte |= 0x02; //判断命令或者数据(第一个字节的D6位,0为指令,1为数据) temp0 = firstbyte; temp1 = transdata&0xf0; //发送的第二个字节,取高四位 temp2 = (transdata << 4) & 0xf0; //发送的第三个字节,取低四位 U0C1_SSC_vSendData(temp0); //用英飞凌单片机的童鞋可能了解, U0C1_SSC_vSendData(temp1); //这是用它的SPI模块做的 U0C1_SSC_vSendData(temp2); //当然也可以用IO口模拟 }话不多说,直接上代码。这就是我写的最底层的发送函数。
void Send(uchar type,uchar transdata) { uchar firstbyte = 0xf8; uchar temp; uchar i,j = 3; if(type) firstbyte |= 0x02;//
//判断命令或者数据(第一个字节的D6位,0为指令,1为数据)cyPORT |= BIT(cyCS); //片选(高电平)
cyPORT &= ~BIT(cyCLK); //时钟
while(j > 0)
{
if(j == 3) temp = firstbyte;//第一个字节
else if(j == 2)
temp = transdata&0xf0;//第二个字节
else
temp = (transdata << 4) & 0xf0;//第三个字节
for(i = 8;i > 0;i--)//发送一个字节
{
if(temp & 0x80)
cyPORT |= BIT(cySID);
else cyPORT &= ~BIT(cySID);
cyPORT |= BIT(cyCLK); //模拟时钟脉冲
temp <<= 1;
cyPORT &= ~BIT(cyCLK);
} //三个字节之间一定要有足够的延时,否则易出现时序问题
if(j == 3)
delay_Nus(600);
else delay_Nus(200);
j--;
}
cyPORT &= ~BIT(cySID);
cyPORT &= ~BIT(cyCS);
}
这是一个用IO口模拟的。大家应该可以看懂,今天先到这里了,我要休息了。。。。
相关文章推荐
- 如何解决关于TableView里面cell随机显示的问题
- 如何解决关于TableView里面cell随机显示的问题
- 关于JFreeChart横向柱状图如何将数值显示到柱子顶端的问题
- 在Android中,关于如何全屏显示的问题
- 关于文章列表如何直接显示文章类别名的问题
- iOS 关于如何将cell.detailTextLabel.text的内容显示出来的问题。
- iTextSharp应用中关于“Cannot access a closed Stream”问题的解决办法(附带提供如何在页面中显示PDF的流)
- 连载 1 - 深入讨论 Android 关于高效显示图片的问题 - 如何高效的加载大位图
- 向大家请教一个关于sharepoint2003的问题,如何使一个Custom List in Datasheet View中某个field从其他list抽取数据当显示时?
- 如何解决关于TableView里面cell随机显示的问题
- 如何解决关于TableView里面cell随机显示的问题
- 关于PD 中的 表对象 如何同时显示name 与code 的问题
- 如何解决关于TableView里面cell随机显示的问题
- 关于PD 中的 表对象 如何同时显示name 与code 的问题
- 关于如何悬浮框居中显示的问题
- 关于如何计算子网掩码和广播地址的问题的一个例子
- 一个关于asp显示记录的问题
- 关于asp.net中js文件中文显示支持的问题。
- 关于做框架页作业时归还单中“创建人”显示不出来的问题
- VB中关于statusbar状态条随FORM变化的问题,以及如何设置toolbar