关于12864如何显示八行的问题


        第一次写技术博客,哈哈,工程师就是喜欢分享。当自己做出来的东西,没有人能分享喜悦,那真的是很糟糕。

        前一段时间做了个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口模拟的。大家应该可以看懂,今天先到这里了,我要休息了。。。。


  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值