M61 点亮屏幕后,显示精灵动画

[复制链接]
查看1596 | 回复14 | 2023-11-30 00:21:36 | 显示全部楼层 |阅读模式
上一次点亮了屏幕,并显示了图片,这次准备在在屏幕上显示动画,制作会走路的小人,以及会动的背景

先看效果,由于视频太大,转成gif后文件过大,只能在转的时候缩小分辨率、帧数和时长了,原动画是不断绕地图一周
ani.gif

开始学习

上一次教程,我们在屏幕上画了一张图,但她是静态的,如果想做点有趣的东西,那动画也是基础,必不可少,所以这次我来学画动画。

就像电影一样,一系列不同的“画面”连续播放就形成了动画。而创造不同“画面”一般有两种方式,一种是画面本身不同,另一种是画面里面的东西在动。想象一下这个画面,角色从迷宫左上角走到右下角。

第一种:有4张不同的图,逐次播放,这种我们称为帧动画。
ns_attach_image_12891701162314732 (1).png

第二种:有一张背景和主角,每次播放时,背景直接画,角色画在不同的位置,这样的角色我们称为精灵(精灵本身也可以有帧动画)。
ns_attach_image_13041701162455844.png ns_attach_image_13121701162477004.png


显然角色从迷宫左上角走到右下角这个需求下,第二种更适合,实际应用中需两种结合来使用。
最典型的例子比如rpg动画里面,角色精灵移动时的左右脚迈步动画就是帧动画,精灵则是画在地图中的不同位置。

那其实就很简单了,每一帧都是先在屏幕画出背景,再在指定位置画上角色,如果角色可操控,那只需要用中断改变其位置。
貌似很容易实现,但这时又想到了个问题,我们的图片没有透明信息。
如果精灵的图片直接覆盖画上去,会有个矩形白边,如图1。
如果是用“位或”的方式画(暂且不论能不能实现),则连精灵都看不到了,如图2。
而我们想要的效果是最后的效果,部分覆盖,部分透明,如图3。
ns_attach_image_13551701164123053.png

这个问题最经典的解决方案就是用遮罩,遮罩如图1,
先用遮罩“位与运算”图1,得到图2,再用精灵“位或运算”图2,得到最终结果图3。
ns_attach_image_13941701165110251.png

位或,就是只画黑色的部分,白色的部分直接忽略不画。
为了实现或绘图的图片能进行或运算,也为了能提高性能,我们得换种画图方式。
原来的方式是直接在屏幕上逐个绘制图像,那改为把所有精灵图像逐个画在画板上,画完之后再把画板贴到屏幕上。可以理解画板是内存数据,操作内存肯定比i2c的画到屏幕快得多,原来要画多个图像,现在合并成了只画一次。而最关键的是内存操作可以进行位运算。

那么接下来简单说下位运算,以上个教程画的大道寺知世为例
  • const uint8_t  picture_tab[]={
  • 0x1,0x2,0x4,0x8,0xF0,0xA0,0x0,0x10,0x10,0x10,0x8,0x8,0x8,0x18,0x10,0x11,

图像的数据逐个改为二进制,比如 0x1 = 00000001,0x2 = 00000010,...,0x11 = 00010001,共16个uint8_t,
从左到右的每一竖列,在1的位置涂黑,就得到了下图的0~15列。
ns_attach_image_14251701166777257.png
把图片数据全部画完,就得到下图
ns_attach_image_14391701167076353.png

那么图像合并就很明显了,当两张图像使用“或运算”时,只要相同位置有一个是涂黑的,就涂黑。
“与运算”反之,所以我们只需遮罩用&,图像用|,即可得到目标图像,再把目标图像画到屏幕上。

就像这样,把左下角的精灵贴到背景上,背景就是知世
12.png

另外一个难点,就是绘制时,是8位一起,所以当精灵在竖轴的坐标不是8的整倍数时,需要跨越两个page绘制,这问题处理起来麻烦,但不是无法处理,就直接看代码了。

这次代码分为3个文件了。main、spirit和resources

main.c
  1. /**
  2. * @file main.c
  3. * @author lclight
  4. * @brief
  5. * @version 0.1
  6. * @date 2023-11-26
  7. *
  8. * @copyright Copyright (c) 2023
  9. *
  10. */
  11. // 头文件,为省事直接写了一大堆
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <FreeRTOS.h>
  16. #include <task.h>
  17. #include <time.h>
  18. #include <unistd.h>
  19. #include "board.h"
  20. #include "log.h"
  21. #include "bflb_mtimer.h"
  22. #include "bflb_i2c.h"
  23. #include "bflb_gpio.h"
  24. #include "bflb_audac.h"
  25. #include "bflb_dma.h"
  26. #include "bl616_glb.h"
  27. #include "bflb_flash.h"
  28. #include "spirit.h"
  29. #include <queue.h>
  30. #include <semphr.h>
  31. #include <timers.h>

  32. // 选择支持i2c的两个针脚,接线也要按这个来接
  33. #define SDA GPIO_PIN_31
  34. #define SCL GPIO_PIN_30

  35. // sleep函数,封装一层,方便修改
  36. // 因为精度不够,这里用1太耗时,改为0比较合适,用usleep同样不行
  37. #define waittime(t) vTaskDelay(0)

  38. struct bflb_device_s *gpio;

  39. // 从机地址,从手册或者卖家给的例子中获得,如果没有,甚至可以用for从0~127逐个初始化再确定是哪个
  40. uint8_t addr = 0x78;

  41. // i2c协议的开始位
  42. void i2c_start()
  43. {
  44.     bflb_gpio_set(gpio, SDA);
  45.     waittime(1);
  46.     bflb_gpio_set(gpio, SCL);
  47.     waittime(1);
  48.     bflb_gpio_reset(gpio, SDA);
  49.     waittime(1);
  50.     bflb_gpio_reset(gpio, SCL);
  51. }
  52. // i2c协议的结束位
  53. void i2c_stop()
  54. {
  55.     bflb_gpio_reset(gpio, SDA);
  56.     waittime(1);
  57.     bflb_gpio_set(gpio, SCL);
  58.     waittime(1);
  59.     bflb_gpio_set(gpio, SDA);
  60. }
  61. // i2c协议发送一个字节
  62. void send_byte(uint8_t dat)
  63. {
  64.     uint8_t i;
  65.     for (i = 0; i<8; i++)
  66.     {
  67.         if (dat & 0x80)
  68.         {
  69.             bflb_gpio_set(gpio, SDA);
  70.         }
  71.         else
  72.         {
  73.             bflb_gpio_reset(gpio, SDA);
  74.         }
  75.         waittime(1);
  76.         bflb_gpio_set(gpio, SCL);
  77.         waittime(1);
  78.         bflb_gpio_reset(gpio, SCL);
  79.         waittime(1);
  80.         dat <<= 1;
  81.     }
  82.     bflb_gpio_set(gpio, SDA);
  83.     waittime(1);
  84.     bflb_gpio_set(gpio, SCL);
  85.     waittime(1);
  86.     bflb_gpio_reset(gpio, SCL);
  87.     waittime(1);
  88. }

  89. // 发送一帧数据
  90. void oled_wr_byte(uint8_t dat, uint8_t mode)
  91. {
  92.     i2c_start();
  93.     send_byte(addr);
  94.     mode ? send_byte(0x40) : send_byte(0x00);
  95.     send_byte(dat);
  96.     i2c_stop();
  97. }
  98. // 发送一帧命令数据
  99. void oled_cmd(uint8_t cmd)
  100. {
  101.     // printf("cmd:%d\r\n", cmd);
  102.     oled_wr_byte(cmd, 0);
  103. }
  104. // 发送一帧Data数据
  105. void oled_data(uint8_t dat)
  106. {
  107.     oled_wr_byte(dat, 1);
  108. }
  109. // 发送定位到页的命令
  110. void page_set(uint8_t page)
  111. {
  112.     oled_cmd(0xb0 + page);
  113. }
  114. // 发送定位到列的命令
  115. void column_set(uint8_t col)
  116. {
  117.     oled_cmd(0x10 | (col >> 4));
  118.     oled_cmd(0x00 | (col & 0x0f));
  119. }
  120. // 清屏,就是把填满数据0
  121. void oled_clear()
  122. {
  123.     uint8_t page,col;
  124.     for (page = 0; page < 8; ++page)
  125.     {
  126.         page_set(page);
  127.         column_set(0);
  128.         for (col = 0; col < 128; ++col)
  129.         {
  130.             oled_data(0x00);
  131.         }
  132.     }
  133. }
  134. // 清屏,就是把填满数据1
  135. void oled_full()
  136. {
  137.     uint8_t page,col;
  138.     for (page = 0; page < 8; ++page)
  139.     {
  140.         page_set(page);
  141.         column_set(0);
  142.         for (col = 0; col < 128; ++col)
  143.         {
  144.             oled_data(0xff);
  145.         }
  146.     }
  147. }
  148. // 显示图片
  149. void oled_display(const uint8_t *ptr_pic)
  150. {
  151.     uint8_t page,col;
  152.     for (page = 0; page < 8; ++page)
  153.     {
  154.         page_set(page);
  155.         column_set(0);
  156.         for (col = 0; col < 128; ++col)
  157.         {
  158.             oled_data(*ptr_pic++);
  159.         }
  160.     }
  161. }
  162. // 显示图片,1和0反转,就是反色
  163. void oled_display_r(const uint8_t *ptr_pic)
  164. {
  165.     uint8_t page,col,data;
  166.     for (page = 0; page < 8; ++page)
  167.     {
  168.         page_set(page);
  169.         column_set(0);
  170.         for (col = 0; col < 128; ++col)
  171.         {
  172.             data=*ptr_pic++;
  173.             data=~data;
  174.             oled_data(data);
  175.         }
  176.     }
  177. }
  178. // 刷新,即时把内存的图像画到屏幕上
  179. // 由于实际上黑底白线比较好看,所以用反色画
  180. void refresh()
  181. {
  182.     uint8_t page,col,data;
  183.     dc = dc0;
  184.     for (page = 0; page < 8; ++page)
  185.     {
  186.         page_set(page);
  187.         column_set(0);
  188.         for (col = 0; col < 128; ++col)
  189.         {
  190.             data=*dc++;
  191.             data=~data;
  192.             oled_data(data);
  193.         }
  194.     }
  195. }
  196. // 初始化,点亮屏幕,按手册执行一些列命令即可,有些命令不是必要的
  197. void init_display()
  198. {
  199.     uint8_t cmds[25] =
  200.     {
  201.        0xAE,//关闭显示
  202.        0xD5,//设置时钟分频因子,震荡频率
  203.        0x80,  //[3:0],分频因子;[7:4],震荡频率
  204.        0xA8,//设置驱动路数
  205.        0X3F,//默认0X3F(1/64)
  206.        0xD3,//设置显示偏移
  207.        0X00,//默认为0
  208.        0x40,//设置显示开始行 [5:0],行数.                              
  209.        0x8D,//电荷泵设置
  210.        0x14,//bit2,开启/关闭
  211.        0x20,//设置内存地址模式
  212.        0x02,//[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
  213.        0xA1,//段重定义设置,bit0:0,0->0;1,0->127;
  214.        0xC8,//设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数
  215.        0xDA,//设置COM硬件引脚配置
  216.        0x12,//[5:4]配置            
  217.        0x81,//对比度设置
  218.        0xEF,//1~255;默认0X7F (亮度设置,越大越亮)
  219.        0xD9,//设置预充电周期
  220.        0xf1,//[3:0],PHASE 1;[7:4],PHASE 2;
  221.        0xDB,//设置VCOMH 电压倍率
  222.        0x30,//[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;
  223.        0xA4,//全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
  224.        0xA6,//设置显示方式;bit0:1,反相显示;0,正常显示        
  225.        0xAF,//开启显示     
  226.     };
  227.     uint8_t i;
  228.     for (i = 0; i < 25; ++i)
  229.     {
  230.         oled_cmd(cmds[i]);
  231.     }
  232.     sleep(1);
  233. }
  234. void led_run(void* param)
  235. {

  236.     // 创建我们操控的主角,称为英雄
  237.     uint8_t heroWalkImg1[] = HERO_IMG1;
  238.     uint8_t heroWalkImg2[] = HERO_IMG2;
  239.     uint8_t heroMask[] = HERO_MASK;
  240.     struct frameImg heroFrames[2] = {
  241.         // 脚不用覆盖,所以可以共用一个遮罩
  242.         {8, 16, heroWalkImg1, heroMask},
  243.         {8, 16, heroWalkImg2, heroMask}
  244.     };
  245.     //默认左上角{0,0},默认第一帧,总共2帧,当前状态1
  246.     struct spirit hero = {0,0, 1,2, SPIRIT_STATE_SHOW, heroFrames};
  247.     //
  248.     uint8_t tmpDir = 0; // 方向,走路demo用到
  249.     gpio = bflb_device_get_by_name("gpio");
  250.     /* I2C0_SDA */
  251.     bflb_gpio_init(gpio, SDA, GPIO_OUTPUT | GPIO_PULLUP);
  252.     /* I2C0_SCL */
  253.     bflb_gpio_init(gpio, SCL, GPIO_OUTPUT | GPIO_PULLUP);
  254.     bflb_gpio_init(gpio, GPIO_PIN_18, GPIO_INPUT | GPIO_FLOAT | GPIO_SMT_EN | GPIO_DRV_0);
  255.     bflb_gpio_init(gpio, GPIO_PIN_14, GPIO_OUTPUT | GPIO_FLOAT | GPIO_SMT_EN | GPIO_DRV_1);
  256.     // 初始化,点亮屏幕
  257.     // 图片轮播
  258.     init_display();
  259.     oled_full();
  260.     sleep(3);
  261.     while (true)
  262.     {
  263.         clean();
  264.         // 背景也是一个精灵,静态创建即可
  265.         draw(&bg);
  266.         draw(&hero);
  267.         refresh();
  268.         // vTaskDelay(1);
  269.         // 让小人绕屏幕一圈
  270.         switch (tmpDir)
  271.         {
  272.             case 0:
  273.                 if (hero.px<110)
  274.                 {move(&hero, 1, 0);}
  275.                 else
  276.                 {
  277.                     if (bg.px>-72)
  278.                     {move(&bg, -1, 0);}
  279.                     else
  280.                     {tmpDir++;}
  281.                 }
  282.                 break;
  283.             case 1:
  284.                 if (hero.py<52)
  285.                 {move(&hero, 0, 1);printf("hero.py:%d\r\n", hero.py);}
  286.                 else
  287.                 {tmpDir++;}
  288.                 break;
  289.             case 2:
  290.                 if (hero.px>10)
  291.                 {move(&hero, -1, 0);}
  292.                 else
  293.                 {
  294.                     if (bg.px<0)
  295.                     {move(&bg, 1, 0);}
  296.                     else
  297.                     {tmpDir++;}
  298.                 }
  299.                 break;
  300.             case 3:
  301.                 if (hero.py>0)
  302.                 {move(&hero, 0, -1);}
  303.                 else
  304.                 {tmpDir=0;}
  305.                 break;
  306.         }
  307.         // 小人切换走路动画帧
  308.         nextFrame(&hero);
  309.     }
  310.    
  311. }
  312. int main(void)
  313. {
  314.     board_init();
  315.     xTaskCreate(led_run, (char*)"led_run", 1024*4, NULL, 1, NULL);
  316.     vTaskStartScheduler();
  317. }
复制代码


文件名:spirit.h


  1. #ifndef SPIRIT_H
  2. #define SPIRIT_H
  3. #include <stdio.h>
  4. #include "resources.h"

  5. #define SPIRIT_STATE_HIDE 0
  6. #define SPIRIT_STATE_SHOW 1
  7. struct frameImg
  8. {
  9.     uint8_t w;  // 1~N
  10.     uint8_t h;  // 1~N,一定是8的整数倍
  11.     uint8_t *img;
  12.     uint8_t *mask;
  13. };
  14. struct spirit
  15. {
  16.     short px;  // -N~N
  17.     short py;  // -N~N
  18.     uint8_t curFrame;
  19.     uint8_t maxFrame;
  20.     uint8_t state; // 精灵当前状态,0是正常,1是隐身
  21.     struct frameImg *frames;
  22. };


  23. // 背景,实际上也是精灵
  24. uint8_t bgImg[] = BG_IMG;
  25. struct frameImg bgFrame[] = {
  26.     {200, 64, bgImg, NULL}
  27. };
  28. struct spirit bg = {0,0, 1,1, SPIRIT_STATE_SHOW, bgFrame};

  29. // 先把背景和所有精灵都画到dc上,再画到屏幕
  30. uint8_t dc0[1024];
  31. uint8_t *dc;

  32. // 让精灵进入下一帧
  33. uint8_t nextFrame(struct spirit * sp)
  34. {
  35.     sp->curFrame ++;
  36.     if (sp->curFrame > sp->maxFrame){
  37.         sp->curFrame = 1;
  38.     }
  39.     return sp->curFrame;
  40. }
  41. // 让精灵进入指定帧
  42. uint8_t frame(struct spirit * sp, uint8_t tarFrame)
  43. {
  44.     sp->curFrame = tarFrame;
  45.     if (sp->curFrame > sp->maxFrame){
  46.         sp->curFrame = 1;
  47.     }
  48.     return sp->curFrame;
  49. }
  50. // 让精灵移动,注意需要支持负数
  51. void move(struct spirit * sp, short opx, short opy)
  52. {
  53.     sp->px +=opx;
  54.     sp->py +=opy;
  55. }
  56. void draw(struct spirit * sp)
  57. {
  58.     short spCol,spLine,spPage,spIdx,dcCol,dcLine,dcIdx,dcNIdx,dcPage,offset;
  59.     if (sp->state != SPIRIT_STATE_HIDE){
  60.         // 取出要画的那一帧
  61.         struct frameImg * spFrame = & sp->frames[sp->curFrame-1];
  62.         // 两个for从上到下,从左到右,把精灵绘制到内存上
  63.         for (spCol = 0; spCol < spFrame->w; ++spCol)
  64.         {
  65.             // 1个像素算一行,每个列有8个像素
  66.             for (spLine = 0; spLine < spFrame->h; spLine+=8)
  67.             {
  68.                 // 计算出当前绘制到哪里 (page*8)-col
  69.                 dcLine = sp->py+spLine; dcCol = sp->px+spCol;
  70.                 // 超出屏幕范围的不画
  71.                 if (dcLine>=0 && dcLine < 64 && dcCol>=0 && dcCol < 128){
  72.                     // 分别是绘制位置的page和精灵的page
  73.                     dcPage = dcLine/8;
  74.                     spPage = spLine/8;
  75.                     // Idx就是数组下标
  76.                     dcIdx = (dcCol)+(dcPage)*128;
  77.                     spIdx = spCol+spPage*spFrame->w;
  78.                     // 精灵位置精确到像素,跨越了page,偏移多少要在下个page绘制
  79.                     offset = dcLine % 8;
  80.                     if (offset == 0){
  81.                         if (spFrame->mask != NULL) { dc0[dcIdx] &= spFrame->mask[spIdx]; }
  82.                         dc0[dcIdx] |= spFrame->img[spIdx];
  83.                     }else{
  84.                         // 为了让左移后补上的位是1,取反->左移->再取反
  85.                         if (spFrame->mask != NULL) { dc0[dcIdx] &= (~((~spFrame->mask[spIdx]) << offset)); }
  86.                         // if (spFrame->mask != NULL) { dc0[dcIdx] &= ((spFrame->mask[spIdx] << offset) | (0xFF >> (8-offset)))); }
  87.                         dc0[dcIdx] |= (spFrame->img[spIdx] << offset);
  88.                         // 跨越了page,要在下个page绘制偏移出去的精灵,下个page的数组下标就是dcNIdx
  89.                         dcNIdx = (dcCol)+(dcPage+1)*128;
  90.                         // 选了下个page,需要判断是否超出屏幕范围
  91.                         if (dcNIdx>=0 && dcNIdx < 1024){
  92.                             // 右移无法保证补位是0还是1,干脆就用|填充1
  93.                             if (spFrame->mask != NULL) { dc0[dcNIdx] &= ((spFrame->mask[spIdx] >> (8-offset) ) | (0xFF << offset) ); }
  94.                             dc0[dcNIdx] |= ((spFrame->img[spIdx] >> (8-offset) ) & (~(0xFF << offset))); // 这里是或运算,补0
  95.                         }
  96.                     }
  97.                 }
  98.             }
  99.         }
  100.     }
  101. }
  102. void clean()
  103. {
  104.     for (size_t i = 0; i < 1024; ++i)
  105.     {
  106.         dc0[i] = 0;
  107.     }
  108. }
  109. #endif /* MBEDTLS_CONFIG_H */
复制代码



文件名:resources.h


  1. #ifndef RESOURCES_H
  2. #define RESOURCES_H
  3. #include <stdio.h>


  4. // HERO_IMG1 HERO_IMG2
  5. // ████████  ████████
  6. // █______█__█______█
  7. //_█_██_█_█__█_██_█_█
  8. //_█______█__█______█
  9. //_█______█__█______█
  10. //_█__██__█__█__██__█
  11. //_█______█__█______█
  12. //_████████__████████
  13. //___█_█_______█_█___
  14. //__█___█_______█____
  15. //__█___█______█_█___
  16. //__██__██_____████__
  17. #define HERO_IMG1  {0xFF,0x81,0x85,0xA5,0xA1,0x85,0x81,0xFF,0x0,0xE,0x9,0x0,0x1,0xE,0x8,0x0}
  18. #define HERO_IMG2  {0xFF,0x81,0x85,0xA5,0xA1,0x85,0x81,0xFF,0x0,0x0,0xD,0xA,0xD,0x8,0x0,0x0}
  19. #define HERO_MASK  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}

  20. #define BG_IMG {\
  21. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xC0,0x20,0x20,0x20,0x0,0x10,0xF,\
  22. 0x0,0x0,0x80,0x40,0x20,0x10,0x8,0xC,0x4,0x2,0x2,0x1,0x1,0x0,0x0,0x0,\
  23. 0x0,0x0,0x0,0x0,0x80,0x40,0x60,0x30,0x30,0x8,0x8,0x8,0x0,0x5,0x9,0xA,\
  24. 0x34,0x4C,0x18,0x20,0xC0,0x0,0x0,0x0,0x0,0x4C,0x83,0x80,0x80,0x0,0x0,0x0,\
  25. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  26. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  27. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  28. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  29. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  30. 0x0,0x0,0x60,0x88,0x8,0x4,0x4,0x0,0x0,0x0,0x4,0x3,0x0,0x0,0x0,0x0,\
  31. 0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0xC,0xC,0x4,0x2,0x12,0x12,0x20,0xC0,\
  32. 0x0,0x0,0x0,0x2,0x2,0x2,0x4,0x4,0x8,0x8,0x10,0x20,0x40,0x80,0x0,0x0,\
  33. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x4,0x4,0x4,0x4,0x4,0x4,0x4,\
  34. 0x4,0x4,0x7,0x0,0x0,0x0,0x0,0xE0,0x8,0x2,0x1,0x0,0x0,0x0,0x0,0x0,\
  35. 0x80,0x80,0x0,0x40,0x40,0x0,0x80,0x80,0x80,0x40,0x6,0x1,0x0,0xF8,0x0,0xFC,\
  36. 0x0,0x0,0x80,0x80,0x40,0x40,0x20,0x10,0x18,0x4,0x0,0x0,0x0,0x7,0x0,0x0,\
  37. 0x0,0x0,0x0,0x0,0x0,0x80,0x60,0x11,0xD,0x8,0x8,0x8,0x0,0x10,0x10,0x20,\
  38. 0x40,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  39. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  40. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  41. 0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x40,0x60,0x20,0x10,0x10,0x8,0x8,0x8,0x0,\
  42. 0x0,0x0,0x0,0x8,0x8,0x8,0x10,0x10,0x20,0x10,0x4,0x2,0x1,0x1,0x0,0x2,\
  43. 0x2,0x2,0x4,0x18,0x10,0x20,0x20,0x20,0x20,0x20,0x10,0x10,0x8,0x4,0x0,0x8,\
  44. 0x8,0x8,0x8,0x8,0x8,0x0,0x4,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  45. 0x0,0x0,0x0,0x0,0x0,0x0,0x3,0xC,0x10,0x10,0x8,0x4,0x4,0x2,0x0,0x1,\
  46. 0x0,0x0,0x81,0x41,0x21,0x12,0xA,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x3E,0x80,\
  47. 0x0,0x0,0x60,0x18,0xC,0x6,0xC2,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x61,\
  48. 0x1C,0x2,0x1,0x1,0x1,0x1,0x1,0x1,0x11,0xF1,0x18,0x0,0x0,0x0,0x0,0x0,\
  49. 0x0,0x0,0x0,0xC0,0x30,0xE,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x4,\
  50. 0x4,0x4,0x8,0x88,0x88,0x90,0x50,0x20,0x0,0x0,0x3,0x4,0x2,0x2,0x1,0x1,\
  51. 0x0,0x2,0x4,0x8,0x70,0x40,0x20,0x20,0x10,0x10,0x10,0x0,0x0,0x8,0x8,0x8,\
  52. 0x8,0x0,0x10,0x10,0x0,0x20,0x40,0x80,0x80,0x60,0x10,0x8,0x8,0x4,0x0,0x2,\
  53. 0x2,0x2,0x2,0x2,0x2,0x2,0x4,0x4,0x8,0x10,0x10,0x10,0xC,0x3,0x0,0x0,\
  54. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  55. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  56. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  57. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  58. 0x0,0x80,0x80,0x40,0x40,0x40,0x40,0x40,0x0,0x1,0x2,0x2,0x2,0x2,0xC2,0x22,\
  59. 0x1C,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x4,0x18,0x26,0x50,0xB0,0xA0,0x3F,0x10,\
  60. 0x10,0x10,0x8,0x4,0x4,0x2,0x1,0x0,0x0,0x0,0x0,0x8,0x8,0x8,0x8,0x4,\
  61. 0x3,0x0,0x80,0x80,0x40,0x20,0x20,0x10,0x8,0x6,0x1,0x0,0x0,0x0,0x0,0x0,\
  62. 0x0,0x0,0x0,0x1C,0x20,0x42,0x42,0x80,0x1,0x1,0x1,0x0,0x0,0x0,0x0,0x0,\
  63. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  64. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  65. 0x3,0x38,0x40,0x40,0x40,0x80,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  66. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  67. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  68. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  69. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  70. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3E,0x41,0x80,0x80,0x0,0x0,0x0,0x0,0x0,\
  71. 0x10,0x10,0x10,0x3C,0x22,0x21,0x20,0x20,0x20,0x10,0x10,0x10,0x8,0x8,0x4,0xC4,\
  72. 0xB4,0x8C,0x80,0x40,0x40,0xC0,0x1,0x1,0x2,0x2,0x0,0x4,0x4,0x84,0x84,0x4,\
  73. 0x4,0x4,0x4,0x4,0x4,0x2,0x82,0x82,0x81,0x1,0x0,0x0,0x0,0x0,0x0,0xC0,\
  74. 0x18,0x8,0x4,0x4,0x8,0x8,0x8,0x10,0x10,0x0,0x20,0x20,0x0,0x40,0x40,0x40,\
  75. 0x81,0x82,0x84,0x88,0x90,0xC0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  76. 0x60,0x20,0x40,0x80,0x80,0x30,0xC,0x3,0x67,0x20,0x10,0xD0,0x38,0x8,0x0,0x0,\
  77. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x81,\
  78. 0x86,0x98,0xC0,0x80,0x0,0x0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x0,0x0,\
  79. 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0,0x0,0x0,0x10,0x10,0x10,\
  80. 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0,0x0,0x0,\
  81. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8,0x0,0x8,0x8,0x8,0x8,0x8,0x8,0x8,\
  82. 0x8,0x8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x10,0x10,0x10,\
  83. 0x10,0x10,0x10,0x11,0x11,0x11,0x11,0x10,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  84. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x60,0xC,0x83,0x40,0x20,0x10,\
  85. 0x8,0xC,0x4,0x2,0x1,0x0,0x0,0x3,0x1C,0x60,0x40,0x40,0x30,0xE,0x1,0x0,\
  86. 0x0,0x1,0xC2,0x4,0x8,0x10,0x90,0x9F,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  87. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x80,0x80,0x0,0x40,0x40,0x40,\
  88. 0x40,0x0,0x20,0x20,0x20,0x0,0x10,0x10,0x10,0x1F,0x10,0x1,0x9,0x8,0x8,0x8,\
  89. 0x0,0x4,0x6,0x5,0x4,0x4,0x0,0x2,0x2,0x2,0x2,0x2,0x0,0x0,0x1,0x1,\
  90. 0x1,0x1,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  91. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  92. 0x80,0x70,0x0,0x0,0x80,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  93. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  94. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  95. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  96. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  97. 0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x20,0xA0,0x40,0x40,0x7C,0x10,0x30,0x8,\
  98. 0xEE,0x0,0x0,0x80,0x80,0x84,0x5C,0x64,0x48,0x7,0x23,0x22,0x21,0x11,0x1C,0x10,\
  99. 0x0,0x8,0x8,0x8,0x4,0x4,0x4,0x4,0x2,0x2,0x2,0x2,0x1,0x1,0x1,0x1,\
  100. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  101. 0x0,0x0,0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  102. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  103. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  104. 0x0,0x0,0x0,0x0,0x0,0x3,0x19,0x2,0x1,0x0,0x1,0x11,0x7,0x0,0x0,0x0,\
  105. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  106. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  107. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  108. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  109. 0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x80,0x40,0x40,0x0,0x20,0x20,0x10,0x10,0x0,\
  110. 0x8,0x8,0x6,0x4,0x4,0x2,0x2,0x2,0x1,0x1,0x1,0x0,0x0,0x0,0x0,0x0,\
  111. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  112. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  113. 0x0,0x0,0x0,0x0,0x0,0x0,0x20,0xE0,0xC0,0xC0,0x1E,0x7,0x30,0x10,0xE8,0x1C,\
  114. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  115. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  116. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  117. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  118. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  119. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,\
  120. 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}

  121. #endif /* MBEDTLS_CONFIG_H */
复制代码
13.png




ns_attach_image_12891701162314732.png

本帖被以下淘专辑推荐:

回复

使用道具 举报

爱笑 | 2023-11-30 09:06:40 | 显示全部楼层
写的很棒~
用心做好保姆工作
回复

使用道具 举报

WT_0213 | 2023-11-30 09:10:56 | 显示全部楼层
回复

使用道具 举报

lazy | 2023-11-30 09:34:20 | 显示全部楼层
学习了
回复

使用道具 举报

干簧管 | 2023-11-30 09:40:41 | 显示全部楼层
太酷啦
回复

使用道具 举报

bzhou830 | 2023-11-30 10:55:15 | 显示全部楼层
选择去发光,而不是被照亮
回复

使用道具 举报

lsrly | 2023-11-30 11:23:46 | 显示全部楼层
学习了
回复

使用道具 举报

qwe2079282957 | 2023-11-30 11:31:24 | 显示全部楼层
太厉害了
回复

使用道具 举报

496199544 | 2023-11-30 11:43:20 | 显示全部楼层
回复

使用道具 举报

Ject | 2023-11-30 11:52:30 | 显示全部楼层
6
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则