nRF51800 蓝牙学习 进程记录 2:关于二维数组 执念执战

  前天在玩OLED时想完成一直想弄得一个东西,就是简单的单片机游戏。由于STM32和nRF51822的内存足够,因此就用缓存数组的方法来显示图像(我也不知道术语是啥,反正就是在内存中创建一个128X64的二维数组,更新显示时将整个数组刷新到屏幕上),并且这两个OLED是串口的(还有一个128X32的OLED,同样串口的,连驱动时序和驱动函数都同样,两个都过小了,还那么贵......),四个IO口就能驱动(两个仍是供电的VCC和GND),因此不像以前的那个mini 12864屏幕,它是8位并口的,带读写功能,而这个串口的只能写,不能读(那个Mini12864是5V的,我试着不加外加电路用STM32没驱动成功,多是我水平不够,另外总共十多个引脚,全弄转换电路太复杂,而STM32的5V兼容当时我还不知道,就一直放着了,没在用STM32 试过,为了简单点使用12864,也为了作毕设,就又买了俩3.3V的),因此开辟一个缓存数组能够解决读屏幕内容这个问题。(之后看还能想着补上三种12864的照片吧)数组

  可是在刚开始写程序时就出了问题,就是对于二维数组的定义和引用出现了问题。如今解决了,顾总结以下(仅我知道的和刚刚解决的)。缓存

  1:二维数组在函数定义时,要定义到列,其中列数要与要传递来的二维数组的列向量数一致。如:函数

      定义一个二维数组:spa

      unsigned char T_image[4][6]={      //就是一个俄罗斯方块的一个图形的四个方向变换的图形游戏

              {0,1,0,1,1,1},内存

              { 1,0,1,1,1,0},it

              {1,1,1,0,1,0},io

              {0,1,1,1,0,1}};for循环

  2:而后定义一个函数,此函数可以调用上面二维数组,但不限于上面一个,则定义为:void Position_change(struct POSITION pos,unsigned char ch[][6]);,注意定义中对数组的定义,就是定义到列向量,而且下标数值与即将引用的数组的列向量下标相等值,而行向量下标则不须要写(因此上面定义二维数组时最好行列向量下标值要统一)。使用时即可以直接传递一个定义了的二维数组,如在main中调用时写为:Position_change(pos,T_image); 就能够了。
变量

  3:若在这个定义的函数中还调用了另外一个函数Draw_position,这个函数要使用ch[][6]传递的函数,则在定义这个函数时和上面那个函数同样,定义到列向量:void Draw_position(unsigned char ch[][6]);而后在上面那个函数中被调用时写成 Draw_position(ch);就能够了,即二维数组变量做为传递函数时只须要写方括号前面的名称就好,不须要写方括号,也不须要精确到列向量,和上面那个函数在main函数中调用同样。即总体写为:

      void Position_change(struct POSITION pos,unsigned char ch[][6])

        {   Draw_position(ch);

          }

    4:若函数中还有对传递二维数组的for循环,则只须要对定义中的二维数组进行操做就好了:

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

      for(n=0;n<6;n++)

        if(ch[i][n]==0).......    //ch就是指定义时的参数变量名称,定义为啥就写为啥好了,就能传递下来了

        else......

 

 

   好了,基本就写完了。其实这个很简单,只是当时学的时候没以为这个重要,就简单而过了。

  之后要写点对nRF51822的应用体验,拟想从开箱开始(额,用了很久了,跳过吧,从怎么链接电脑设置kile5并用SWD下载开始吧),可是不知道人家容许么......

 

  本文水平有限,内容不少词语因为知识问题不严谨或很离谱,但主要做为记录做用,能理解就行了,但愿之后的本身和路过的大神对必要的错误提出批评与指点,对好笑的错误不要嘲笑,指出来我会改正的。

相关文章
相关标签/搜索