单片机什么代码能88点阵动态显示

单片机什么代码能88点阵动态显示,第1张

龙之吻6iinxl8c >《单片机及控制系统》

阅464转62018.09.06关注

88点阵动态显示

硬件组成:单片机最小系统+88点阵+按键

图形移动模式 切换 1 跳动 2 上移 3 下移 4 左移 5 右移

显示内容汉字 一 二 三 四。四个字

仿真图:

打开APP查看高清大图

程序:

打开APP查看高清大图

源代码

#include

#define uchar unsigned char

#define uint unsigned int

// 左右移动 取码方式 阴码逐列

uchar code TAB[]={

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //空屏

0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00,/*'一',0*/

0x00,0x40,0x44,0x44,0x44,0x44,0x40,0x00,/*'二',1*/

0x00,0x40,0x54,0x54,0x54,0x54,0x42,0x00,/*'三',2*/

0x00,0x7E,0x52,0x5E,0x42,0x5E,0x52,0x7E,/*'四',3*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //空屏, //空屏

}

// 上下移动及翻页 取模方式 阳码逐行

uchar code TAB1[]={

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, //空屏

0xFF,0xFF,0xFF,0x81,0xFF,0xFF,0xFF,0xFF,/*'一',0*/

0xFF,0xFF,0xC3,0xFF,0xFF,0xFF,0x81,0xFF,/*'二',1*/

0xFF,0xBF,0xC3,0xFF,0xC3,0xFF,0x81,0xFF,/*'三',2*/

0xFF,0x81,0xA9,0xA9,0xA9,0x9D,0xBD,0x81,/*'四',3*/

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, //空屏

}

uchar idata Buffer[48]={0}//缓存显示单元

sbit key1=P3^2//外部中断

uchar num=0//用于图形移动切换

char i,t

void delay(uchar t)

1、8*8双色点阵实际上是两个8*8点阵,必须增加一个端口来控制是使用哪个颜色的8*8点阵;或者连接成一个8*16点阵来控制。C语言代码和控制8*8点阵类似,增加扫描端口就可以了。

2、例程:

#include <reg51.h> 

unsigned char code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f} 

unsigned char code digittab[10][8]={

                                    {0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00}, //0 

                                    {0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00}, //1 

                                    {0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00}, //2 

                                    {0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00}, //3 

                                    {0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00}, //4 

                                    {0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00}, //5 

                                    {0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00}, //6 

                                    {0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00}, //7 

                                    {0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00}, //8 

                                    {0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00} //9

                                    } 

  

unsigned int timecount 

unsigned char cnta 

unsigned char cntb 

  

void main(void) 

  TMOD=0x01 

  TH0=(65536-1000)/256 

  TL0=(65536-1000)%256 

  TR0=1 

  ET0=1 

  EA=1 

  while(1) 

    { 

    } 

  

void t0(void) interrupt 1 using 0 

  TH0=(65536-1000)/256 

  TL0=(65536-1000)%256 

  P3=tab[cnta] 

  P1=digittab[cntb][cnta] 

  cnta++ 

  if(cnta==8) 

    { 

      cnta=0 

    } 

  timecount++ 

  if(timecount==333) 

    { 

      timecount=0 

      cntb++ 

      if(cntb==10) 

        { 

          cntb=0 

        } 

    } 

}

你这个问题信息量太大,只能给你提个思路:

1) 8*8的点阵屏要显示0-9,字母以及汉字需要使用点整显示的方法。对于0-9以及字母都没有问题,点阵用的的很少,在程序里直接写就可以啦。对于汉字你需要找8*8的汉字点阵字库,能不能找到都是个问题,除非只是显示几个有限的简单汉字。而且8*8的屏显示汉字太小,比如必要显示汉字“真”,用8*8的点阵是很难显示的。一般显示汉字最小的也要12*12,正常情况是16*16的点阵,个别有窄体汉字用12*16的。

2)你要弄明白点阵显示汉字的逻辑,视觉暂留是LED显示屏得以广泛应用的基础,目前广为采用的扫描驱动方式。你需要一个通用函数,就是根据要显示的数字,字母或汉字,找到对应的点阵码值,然后用行扫描的方法依次给对点阵进行行地址选定,再对列电平置位。

3)比如数字0的8*8点阵就是(0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0xE7,0xFF,/* 0 */ ),你需要先选b0,将c0到c7,设置为0xff(即8位全1),接着选b1,将c0到c7设置为0xE7(即两段为0,中间全1,01111110 ),接着选b2,将 c0到c7设置为0xBD(即两段为1,中间全0,10000001 ),依次类推,就显示了数字0。可以根据同样的逻辑,把十个数字,26个字母的大小写都点阵化,写成数组放在代码里直接用就可以。

4)当你要显示汉字的时候,汉字其实是两个字节都成的,第一个字节的最高位是1,表示区码,后面跟着的是位码。根据这两个字节的信息可以定位你的汉字在字库里对应的点阵数据。然后和上面显示数字一样的处理方法把汉字点阵数据显示即可。

5)你的8*8显示屏显示数字和英文还勉强,显示中文太小啦。

6)你现在的首要难题是去找8*8的中文点阵字库,并弄清楚存放汉字点阵数据的逻辑,这样才能根据汉字的区位码找到对应的点阵数据。如果只显示数据和英文字母,可以在8*8的坐标纸上自己去写上数字或字母后,在转化成10101111类似的二进制,去做一个自己的字库。显示数字的时候,把每个数字的ASCII码值减去数字0的ASCII码值,去定位点阵数组的序号。英文字母同理进行处理。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11110367.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存