16*16点阵显示汉字

问题遇到的现象和发生背景
用代码块功能插入代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果

if(aa>30) aa=0; //字模地址 这里的字模地址是什么意思,还有"aa"在这里的含义,为什么改成其他数值点阵就异常显示了

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define data1 P0
#define data2 P2
sbit s1=P3^6;
sbit s2=P3^7;
bit fangxiang;
uint alt=0,net=0,sl=256;
bit mode;
uchar code tab[]=
{



};

void delay(uint z)       //延时子函数
{
   uchar x;

   for(x=110;x>0;x--);
}

void xianshi()            //显示
{ 
    uchar aa,i;
    for(i=0;i<16;i++)
    {
        P1=i; //列扫描
        data1=tab[net+aa]; //取出上8行数据输出
        aa++;
        data2=tab[net+aa]; //取出下8行数据输出
        aa++;
        delay(1);    //延时
        data1=0;  //清屏
        data2=0;  //清屏
        P1=0xff;  //消除余辉
        P0=0Xff;
        if(aa>30) aa=0;  //字模地址
    }    
    
}

void main()     //主函数
{
   ET1=1;     //使能定时器0
   EA=1;     //开启总中断
   TR1=1;    //开始计数
   while(1)     //无限循环
   {
       xianshi();  //显示
       if(s1==0)   //检测按键
       {
          delay(30);  //延时消抖
          TR1=~TR1;      //按下暂停  ,暂按继续
          while(!s1)xianshi();
          delay(30);
       }
       if(s2==0)    //检测按键
       {
           delay(30);            //延时消抖
           fangxiang=~fangxiang;  //方向取反
           while(!s2)xianshi();
           delay(30);
       }
     }
}
 
void timer1() interrupt 3
{

   alt++;
   if(alt==8)           //到一定的时间加以实现左移
   {
     alt=0;
     if(fangxiang==0)     //如果是正向 正向移动
     {
         net=net+2;
         if(net>sl)  //字移动数量
         net=0;
     }
     else               //否则反向移动
     {
         net=net-2;
         if(net<2)
         net=sl;      //字移动数量
     }
   }
   
}


1、OLED怎么实现字库的字模显示?用取模软件获取字库,然后写入单片机内部,显示的时候直接读取内部字库就可以了
2、一个16×16点阵,需要 (1616/8=32)字节储存空间。即取模软件生成1616的点阵数组会有32个字节。

img


3、字模地址的意思就是用取模软件生成的点阵数组的下标。"aa"是数组下标,大于30的时候说明已经传完全部32个字节了。改成其他数值和点阵数组就不匹配了。