[应用方案]基于N76E003的16*64点阵屏的滚动显示及混排显示

文章介绍了如何通过编程实现点阵模块的滚动显示功能,特别是汉字的滚动显示。首先,文章提到了静态显示的局限性,并提出了滚动显示以增加信息量。接着,详细阐述了硬件连接和程序定义,包括对595芯片的控制以及点阵数据的装载和发送。然后,给出了滚动显示的实现函数及主程序,展示了如何从字模提取数据并进行滚动。最后,讨论了中英文混排显示的处理方法,通过编码区分不同类型的字符。
摘要由CSDN通过智能技术生成
前面曾介绍过点阵模块的静态显示模式,但毕竟在不把多个点阵模块进行级联的情况下,其显示的的信息量是有限的。
当然你也可以采用多屏切换的方式来增加信息的显示量,但它会使人产生断断续续的感觉,为此最好是能以滚动显示的方式来显示更多的信息,其形式见图1所示。

图1 显示效果
在原连接的方式不变的情况下,通过程序的修改来实现滚动显示的效果。
其具体的连接关系为:
A --- P1.0
B --- P1.1
C --- P1.2
D  --- P1.3
EN --- P1.4
R1 --- P1.5
STB--- P1.6
CLK--- P1.7
为此在程序中所做的定义如下:
sbit  R1=P1^5;            // 红色数据
sbit  STCP=P1^6;       // 595锁存端口
sbit  SHCP=P1^7;       // 595时钟端口
sbit  SHOW_OE=P1^4;   // 74HC138使能(低有效)
unsignedchar k=0, row =0; w=0;
uchar BUFF [18];
短延时函数的内容为:
复制
void delay(UINT16 z)

{

        while(z--);

}

实现字节合并与位置交换的处理函数为:
复制
unsigned char Combine (unsigned char H, unsigned char L)

{

        unsigned char dat,temp;

        temp=w;

        dat=(H>>temp)|(L<<(8-temp));

        return dat;

} 

装载点阵数据的函数为:
复制
void Load (void)                                  // 将显示内容装入缓存数组

{

         unsigned char i;

      for(i=0;i<16;i++)

      {

           BUFF [i]=Table[k+(i/2)][row*2+(i%2)];    // 装载点阵数据

      }

}

发送一行点阵数据的函数为:
复制
void Send(void)

{

        unsigned char s;

        unsigned char temp,i,j,inc;

        if(j<8)             inc=0;

        if(8<=j&&j<16)   inc=1;

        for(s=0+inc;s<=8+inc;s++)

        {

                temp=Combine(BUFF [s],BUFF [s+1]);

                for(i=0;i<8;i++)

                {

                        R1=~(temp>>i)&0x01;  // 取最低位的值

                        SHCP =0;

                        SHCP =1;               // 产生移位时钟

                }

        }

}


实现滚动显示的函数为:
void  MOVE()

{

        unsigned char i,j;

        for(j=0;j<16;j++)            // 循环16次,点亮并移动一个汉字,步进是一位

        {

                j=j%8;              // 一个字节移动位数

                for(i=0;i<16;i++)      // 扫描16行

                {

               row=i;

               Load();          // 装载一行点阵数据

               Send();          // 发送一行点阵数据

               SHOW_OE =1;  

                     STCP =1;             // 输出锁存

                     STCP =0;

                 P1=i ;              // 行扫描

                    SHOW_OE =0;

                }

        }

      delay(500);

      k=(k+1)%11;                // 限定汉字的显示数量,可视字库的大小来酌情扩展。

}


实现显示效果的主函数为:
void main (void)

{

        Set_All_GPIO_Quasi_Mode;

        set_CLOEN;

        while(1)

        {

                 MOVE();

        }

}

那该如何获取显示内容的字模呢?

显示内容的字模可由软件来提取,见图2所示,其提取格式如图3所示。

图2 工具软件

 

图3 提取格式

在提取字模后,是将字模存放到数组中以供读取,其格式如下:

 

在提取字模后,是将字模存放到数组中以供读取,其格式如下:
unsigned char code Table[][32]=

{

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,



0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,



0x00,0x00,0xFC,0x1F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFF,0x7F,0x80,0x00,

0x40,0x01,0x40,0x01,0x20,0x02,0x20,0x02,0x10,0x04,0x08,0x08,0x04,0x10,0x03,0x60,



0x00,0x02,0x04,0x02,0xC8,0x1F,0x08,0x12,0xE1,0x7F,0x02,0x12,0xD2,0x1F,0x10,0x02,

0x08,0x02,0xC8,0x1F,0x07,0x02,0x04,0x02,0xE4,0x3F,0x04,0x02,0x04,0x02,0x00,0x02,



0x00,0x00,0x80,0x3F,0xBF,0x24,0x88,0x24,0x88,0x3F,0x88,0x24,0x88,0x24,0xBE,0x3F,

0x08,0x04,0x08,0x04,0x88,0x3F,0x08,0x04,0x38,0x04,0x07,0x04,0xC2,0x7F,0x00,0x00,



0x00,0x00,0x00,0x00,0xFE,0x3F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,

0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFF,0x7F,0x00,0x00,0x00,0x00,



0x00,0x01,0x00,0x01,0x3F,0x01,0x20,0x3F,0xA0,0x20,0x92,0x10,0x54,0x02,0x28,0x02,

0x08,0x02,0x14,0x05,0x24,0x05,0xA2,0x08,0x81,0x08,0x40,0x10,0x20,0x20,0x10,0x40,



0x00,0x00,0x04,0x01,0xC8,0x3C,0x48,0x24,0x40,0x24,0x40,0x24,0x4F,0x24,0x48,0x24,

0x48,0x24,0x48,0x2D,0xC8,0x14,0x48,0x04,0x08,0x04,0x14,0x04,0xE2,0x7F,0x00,0x00,



0x10,0x01,0x10,0x01,0x10,0x01,0x88,0x7F,0x88,0x40,0x4C,0x20,0x2C,0x04,0x0A,0x04,

0x89,0x14,0x88,0x24,0x48,0x24,0x48,0x44,0x28,0x44,0x08,0x04,0x08,0x05,0x08,0x02,



 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,



0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

};

 
通过以上的数值,其显示的效果如图4所示。仿此使用者可根据自己的需要来提取相应的字模,在修改限定显示汉字个数的情况下就可完成自己的显示目标。

通过以上的数值,其显示的效果如图4所示。仿此使用者可根据自己的需要来提取相应的字模,在修改限定显示汉字个数的情况下就可完成自己的显示目标。

图4 滚动显示效果

有了向左滚动显示的功能,那如何来实现向上的滚动显示呢?

以显示“远上寒山石径斜,白云深处有人家,停车坐爱枫林晚,霜叶红于二月花。”这首诗为例,可按图5所示的方式来提取字模。

图5 提取格式

图6 滚动显示效果

在提取字模后,其存储格式如下:

 

unsigned char code Table[]={

0x00,0x00,0xF8,0x23,0x00,0x10,0x00,0x10,0x00,0x00,0xFC,0x07,0x20,0xF1,0x20,0x11,

0x20,0x11,0x20,0x11,0x24,0x11,0x24,0x12,0x24,0x12,0x1C,0x14,0x00,0x28,0xFE,0x47,/*"?",0*/

0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0xF8,0x03,0x00,0x02,

0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0xFE,0xFF,0x00,0x00,/*"?",1*/

...

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x24,0x00,0x24,0x00,0x18,0x00,0x00,0x00,0x00,/*"?",31*/

}

显示向上滚动显示的主程序为:
void main (void) 

{

        unsigned char i;

    unsigned int k,m;

    char j;

        Set_All_GPIO_Quasi_Mode;

        set_CLOEN;          

    m=sizeof(Table);

    while(1)

    {

         for(k=0;k<m;k=k+2)      // 显示长度限定

         {

                for(i=0;i<16;i++)  // 显示16行

                {

                                          STCP_HIGH;

                      for(j=0;j<=3;j++)   // 每行4个汉字宽度

                      {

                           HC595_write (Table[(32*j+2*i+1+k)%m]);

                           HC595_write(Table[(32*j+2*i+k)%m]);

                      }

                                          SHOW_OE =1;

                      temp=ADDR;

                      ADDR=(temp&0xe1|t);                 // ABCD =P1.0 - P1.3

                      STCP_LOW;

                      _nop_();

                      STCP_HIGH;;

                                          SHOW_OE =0;

                                          delay(100);

               }

         }

     }

}

此外,在显示过程中还常会遇到中英文混排的情况,由于两者所用的字库结构不同,那又该如何解决这个问题呢?

这就需要在编码方面做些文章,例如可以将待显示的汉字编号高位置1来区分汉字和英文字符,然后再根据编码的不同来调用相应的显示函数进行处理。

图7 混排显示效果

实现混排显示的函数为:

void SCREEN_SHOW()

{

        UINT8 i,j,t=0,temp,p,n,f,u;        

        UINT8 ch[8]={0x10,0x11,0x12,0x03,0x02,0x13,0x10,0x10};

        SHOW_OE=0;

        for(i=0;i<16;i++)

        {

                STCP_HIGH;

        n=0;

        p=0;

                for(j=0;j<8;j++)

                {

                        if(ch[n]>0x0b)   // 可视字符库的规模来酌情增大限定值

                        {

                                  f=1;

                          }

            else

            {

                                  f=0;

            }

                        if(f)

                        {

                                  if(p==0) 

                                  {

                                                u=ch[n]-0x10;

                                  }

                                  HC595_write(table1[p+u*32+i*2]);  // 显示汉字

                  p=(p+1)%2;

                                  if(p==0)  n=n+1;

                        }

                        else

                        {

                                  u=ch[n];

                               HC595_write(table2[u*16+i]);     // 显示字符

                          n=n+1;

                          p=0;

                        }

                 }

                 temp=ADDR;

             ADDR=(temp&0xe1|t);                            // ABCD =P1.0 - P1.3

                 STCP_LOW;

                 STCP_HIGH;

                 t++;

                 delay(100);

         }

}

 
这样我们就使点阵模块的显示效能又提高了一个层次,也更符合实际应用的需要。
 
后面我们会继续探索全彩屏的驱动方法,它会给我们一个更加多彩的效果和感受!
---------------------
作者:jinglixixi
链接:https://bbs.21ic.com/icview-3290442-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值