您的位置:首页 > 其它

关于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个时钟脉冲发送一个字节。发送格式图中也有说明,第一个字节是固定格式,第二个字节发送数据的高四位,第三个字节发送数据的第四位。

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口模拟的。大家应该可以看懂,今天先到这里了,我要休息了。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: