以下作品由安信可社區用戶
lclight制作
之前筆者用Ai-M61點亮了屏幕,并顯示了圖片(教程在這里:M61 gpio模擬i2c 點亮0.96寸屏幕),這次準備在屏幕上顯示動畫,制作會走路的小人以及會動的背景~
先看效果(如圖),由于視頻太大,轉成gif后文件也過大,只能縮小分辨率、幀數和時長了,原動畫是不斷繞地圖一周。
上一次教程在屏幕上畫了一張圖,但它是靜態的,如果想做點有趣的東西,那動畫也是基礎,必不可少,所以這次來學畫動畫。
像電影一樣,一系列不同的“畫面”連續播放就形成了動畫。而創造不同“畫面”一般有兩種方式,一種是畫面本身不同,另一種是畫面里面的東西在動。想象一下這個畫面,角色從迷宮左上角走到右下角。
第一種:有4張不同的圖,逐次播放,稱為幀動畫。
第二種:有一張背景和主角,每次播放時,背景直接畫,角色畫在不同的位置,這樣的角色稱為精靈(精靈本身也可以有幀動畫)。
顯然需要角色從迷宮左上角走到右下角,第二種更適合,實際應用中需兩種結合來使用。最典型的例子比如RPG動畫里面,角色精靈移動時的左右腳邁步動畫就是幀動畫,精靈則是畫在地圖中的不同位置。
那其實就很簡單了,每一幀都是先在屏幕畫出背景,再在指定位置畫上角色,如果角色可操控,那只需要用中斷改變其位置。
貌似很容易實現,但這時又想到了個問題,圖片沒有透明信息。
如果精靈的圖片直接覆蓋畫上去,會有個矩形白邊,如圖1。
如果是用“位或”的方式畫(暫且不論能不能實現),則連精靈都看不到了,如圖2。
而想要的效果是最后的效果,部分覆蓋,部分透明,如圖3。
這個問題最經典的解決方案就是用遮罩,遮罩如圖1。先用遮罩“位與運算”圖1,得到圖2,再用精靈“位或運算”圖2,得到最終結果圖3。
或者就是只畫黑色的部分,白色的部分直接忽略不畫。
為了實現或繪圖的圖片能進行或運算,也為了能提高性能,得換種畫圖方式。
原來的方式是直接在屏幕上逐個繪制圖像,那改為把所有精靈圖像逐個畫在畫板上,畫完之后再把畫板貼到屏幕上。
可以理解畫板是內存數據,操作內存肯定比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列。
把圖片數據全部畫完,就得到下圖
那么圖像合并就很明顯了,當兩張圖像使用“或運算”時,只要相同位置有一個是涂黑的,就涂黑。
“與運算”反之,所以我們只需遮罩用&,圖像用|,即可得到目標圖像,再把目標圖像畫到屏幕上。
就像這樣,把左下角的精靈貼到背景上,背景就是知世。
另外一個難點,就是繪制時是8位一起,所以當精靈在豎軸的坐標不是8的整倍數時,需要跨越兩個page繪制,處理起來麻煩,但不是無法處理,就直接看代碼了。
這次代碼分為3個文件了。main、spirit和resources
main.c
/**
* @file main.c
* @author lclight
* @brief
* @version 0.1
* @date 2023-11-26
*
* @copyright Copyright (c) 2023
*
*/
// 頭文件,為省事直接寫了一大堆
#include
#include
#include
#include
#include
#include
#include
#include "board.h"
#include "log.h"
#include "bflb_mtimer.h"
#include "bflb_i2c.h"
#include "bflb_gpio.h"
#include "bflb_audac.h"
#include "bflb_dma.h"
#include "bl616_glb.h"
#include "bflb_flash.h"
#include "spirit.h"
#include
#include
#include
// 選擇支持i2c的兩個針腳,接線也要按這個來接
#define SDA GPIO_PIN_31
#define SCL GPIO_PIN_30
// sleep函數,封裝一層,方便修改
// 因為精度不夠,這里用1太耗時,改為0比較合適,用usleep同樣不行
#define waittime(t) vTaskDelay(0)
struct bflb_device_s *gpio;
// 從機地址,從手冊或者賣家給的例子中獲得,如果沒有,甚至可以用for從0~127逐個初始化再確定是哪個
uint8_t addr = 0x78;
// i2c協議的開始位
void i2c_start()
{
bflb_gpio_set(gpio, SDA);
waittime(1);
bflb_gpio_set(gpio, SCL);
waittime(1);
bflb_gpio_reset(gpio, SDA);
waittime(1);
bflb_gpio_reset(gpio, SCL);
}
// i2c協議的結束位
void i2c_stop()
{
bflb_gpio_reset(gpio, SDA);
waittime(1);
bflb_gpio_set(gpio, SCL);
waittime(1);
bflb_gpio_set(gpio, SDA);
}
// i2c協議發送一個字節
void send_byte(uint8_t dat)
{
uint8_t i;
for (i = 0; i<8; i++)
{
if (dat & 0x80)
{
bflb_gpio_set(gpio, SDA);
}
else
{
bflb_gpio_reset(gpio, SDA);
}
waittime(1);
bflb_gpio_set(gpio, SCL);
waittime(1);
bflb_gpio_reset(gpio, SCL);
waittime(1);
dat <<= 1;
}
bflb_gpio_set(gpio, SDA);
waittime(1);
bflb_gpio_set(gpio, SCL);
waittime(1);
bflb_gpio_reset(gpio, SCL);
waittime(1);
}
// 發送一幀數據
void oled_wr_byte(uint8_t dat, uint8_t mode)
{
i2c_start();
send_byte(addr);
mode ? send_byte(0x40) : send_byte(0x00);
send_byte(dat);
i2c_stop();
}
// 發送一幀命令數據
void oled_cmd(uint8_t cmd)
{
// printf("cmd:%drn", cmd);
oled_wr_byte(cmd, 0);
}
// 發送一幀Data數據
void oled_data(uint8_t dat)
{
oled_wr_byte(dat, 1);
}
// 發送定位到頁的命令
void page_set(uint8_t page)
{
oled_cmd(0xb0 + page);
}
// 發送定位到列的命令
void column_set(uint8_t col)
{
oled_cmd(0x10 | (col >> 4));
oled_cmd(0x00 | (col & 0x0f));
}
// 清屏,就是把填滿數據0
void oled_clear()
{
uint8_t page,col;
for (page = 0; page < 8; ++page)
{
page_set(page);
column_set(0);
for (col = 0; col < 128; ++col)
{
oled_data(0x00);
}
}
}
// 清屏,就是把填滿數據1
void oled_full()
{
uint8_t page,col;
for (page = 0; page < 8; ++page)
{
page_set(page);
column_set(0);
for (col = 0; col < 128; ++col)
{
oled_data(0xff);
}
}
}
// 顯示圖片
void oled_display(const uint8_t *ptr_pic)
{
uint8_t page,col;
for (page = 0; page < 8; ++page)
{
page_set(page);
column_set(0);
for (col = 0; col < 128; ++col)
{
oled_data(*ptr_pic++);
}
}
}
// 顯示圖片,1和0反轉,就是反色
void oled_display_r(const uint8_t *ptr_pic)
{
uint8_t page,col,data;
for (page = 0; page < 8; ++page)
{
page_set(page);
column_set(0);
for (col = 0; col < 128; ++col)
{
data=*ptr_pic++;
data=~data;
oled_data(data);
}
}
}
// 刷新,即時把內存的圖像畫到屏幕上
// 由于實際上黑底白線比較好看,所以用反色畫
void refresh()
{
uint8_t page,col,data;
dc = dc0;
for (page = 0; page < 8; ++page)
{
page_set(page);
column_set(0);
for (col = 0; col < 128; ++col)
{
data=*dc++;
data=~data;
oled_data(data);
}
}
}
// 初始化,點亮屏幕,按手冊執行一些列命令即可,有些命令不是必要的
void init_display()
{
uint8_t cmds[25] =
{
0xAE,//關閉顯示
0xD5,//設置時鐘分頻因子,震蕩頻率
0x80, //[3:0],分頻因子;[7:4],震蕩頻率
0xA8,//設置驅動路數
0X3F,//默認0X3F(1/64)
0xD3,//設置顯示偏移
0X00,//默認為0
0x40,//設置顯示開始行 [5:0],行數.
0x8D,//電荷泵設置
0x14,//bit2,開啟/關閉
0x20,//設置內存地址模式
0x02,//[1:0],00,列地址模式;01,行地址模式;10,頁地址模式;默認10;
0xA1,//段重定義設置,bit0:0,0->0;1,0->127;
0xC8,//設置COM掃描方向;bit3:0,普通模式;1,重定義模式 COM[N-1]->COM0;N:驅動路數
0xDA,//設置COM硬件引腳配置
0x12,//[5:4]配置
0x81,//對比度設置
0xEF,//1~255;默認0X7F (亮度設置,越大越亮)
0xD9,//設置預充電周期
0xf1,//[3:0],PHASE 1;[7:4],PHASE 2;
0xDB,//設置VCOMH 電壓倍率
0x30,//[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;
0xA4,//全局顯示開啟;bit0:1,開啟;0,關閉;(白屏/黑屏)
0xA6,//設置顯示方式;bit0:1,反相顯示;0,正常顯示
0xAF,//開啟顯示
};
uint8_t i;
for (i = 0; i < 25; ++i)
{
oled_cmd(cmds[i]);
}
sleep(1);
}
{
// 創建我們操控的主角,稱為英雄
uint8_t heroWalkImg1[] = HERO_IMG1;
uint8_t heroWalkImg2[] = HERO_IMG2;
uint8_t heroMask[] = HERO_MASK;
struct frameImg heroFrames[2] = {
// 腳不用覆蓋,所以可以共用一個遮罩
{8, 16, heroWalkImg1, heroMask},
{8, 16, heroWalkImg2, heroMask}
};
//默認左上角{0,0},默認第一幀,總共2幀,當前狀態1
struct spirit hero = {0,0, 1,2, SPIRIT_STATE_SHOW, heroFrames};
//
uint8_t tmpDir = 0; // 方向,走路demo用到
gpio = bflb_device_get_by_name("gpio");
/* I2C0_SDA */
bflb_gpio_init(gpio, SDA, GPIO_OUTPUT | GPIO_PULLUP);
/* I2C0_SCL */
bflb_gpio_init(gpio, SCL, GPIO_OUTPUT | GPIO_PULLUP);
bflb_gpio_init(gpio, GPIO_PIN_18, GPIO_INPUT | GPIO_FLOAT | GPIO_SMT_EN | GPIO_DRV_0);
bflb_gpio_init(gpio, GPIO_PIN_14, GPIO_OUTPUT | GPIO_FLOAT | GPIO_SMT_EN | GPIO_DRV_1);
// 初始化,點亮屏幕
// 圖片輪播
init_display();
oled_full();
sleep(3);
while (true)
{
clean();
// 背景也是一個精靈,靜態創建即可
draw(&bg);
draw(&hero);
refresh();
// vTaskDelay(1);
// 讓小人繞屏幕一圈
switch (tmpDir)
{
case 0:
if (hero.px<110)
{move(&hero, 1, 0);}
else
{
if (bg.px>-72)
{move(&bg, -1, 0);}
else
{tmpDir++;}
}
break;
case 1:
if (hero.py<52)
{move(&hero, 0, 1);printf("hero.py:%drn", hero.py);}
else
{tmpDir++;}
break;
case 2:
if (hero.px>10)
{move(&hero, -1, 0);}
else
{
if (bg.px<0)
{move(&bg, 1, 0);}
else
{tmpDir++;}
}
break;
case 3:
if (hero.py>0)
{move(&hero, 0, -1);}
else
{tmpDir=0;}
break;
}
// 小人切換走路動畫幀
nextFrame(&hero);
}
}
int main(void)
{
board_init();
xTaskCreate(led_run, (char*)"led_run", 1024*4, NULL, 1, NULL);
vTaskStartScheduler();
}
文件名:spirit.h
#ifndef SPIRIT_H
#define SPIRIT_H
#include
#include "resources.h"
#define SPIRIT_STATE_HIDE 0
#define SPIRIT_STATE_SHOW 1
struct frameImg
{
uint8_t w; // 1~N
uint8_t h; // 1~N,一定是8的整數倍
uint8_t *img;
uint8_t *mask;
};
struct spirit
{
short px; // -N~N
short py; // -N~N
uint8_t curFrame;
uint8_t maxFrame;
uint8_t state; // 精靈當前狀態,0是正常,1是隱身
struct frameImg *frames;
};
// 背景,實際上也是精靈
uint8_t bgImg[] = BG_IMG;
struct frameImg bgFrame[] = {
{200, 64, bgImg, NULL}
};
struct spirit bg = {0,0, 1,1, SPIRIT_STATE_SHOW, bgFrame};
// 先把背景和所有精靈都畫到dc上,再畫到屏幕
uint8_t dc0[1024];
uint8_t *dc;
// 讓精靈進入下一幀
uint8_t nextFrame(struct spirit * sp)
{
sp->curFrame ++;
if (sp->curFrame > sp->maxFrame){
sp->curFrame = 1;
}
return sp->curFrame;
}
// 讓精靈進入指定幀
uint8_t frame(struct spirit * sp, uint8_t tarFrame)
{
sp->curFrame = tarFrame;
if (sp->curFrame > sp->maxFrame){
sp->curFrame = 1;
}
return sp->curFrame;
}
// 讓精靈移動,注意需要支持負數
void move(struct spirit * sp, short opx, short opy)
{
sp->px +=opx;
sp->py +=opy;
}
void draw(struct spirit * sp)
{
short spCol,spLine,spPage,spIdx,dcCol,dcLine,dcIdx,dcNIdx,dcPage,offset;
if (sp->state != SPIRIT_STATE_HIDE){
// 取出要畫的那一幀
struct frameImg * spFrame = & sp->frames[sp->curFrame-1];
// 兩個for從上到下,從左到右,把精靈繪制到內存上
for (spCol = 0; spCol < spFrame->w; ++spCol)
{
// 1個像素算一行,每個列有8個像素
for (spLine = 0; spLine < spFrame->h; spLine+=8)
{
// 計算出當前繪制到哪里 (page*8)-col
dcLine = sp->py+spLine; dcCol = sp->px+spCol;
// 超出屏幕范圍的不畫
if (dcLine>=0 && dcLine < 64 && dcCol>=0 && dcCol < 128){
// 分別是繪制位置的page和精靈的page
dcPage = dcLine/8;
spPage = spLine/8;
// Idx就是數組下標
dcIdx = (dcCol)+(dcPage)*128;
spIdx = spCol+spPage*spFrame->w;
// 精靈位置精確到像素,跨越了page,偏移多少要在下個page繪制
offset = dcLine % 8;
if (offset == 0){
if (spFrame->mask != NULL) { dc0[dcIdx] &= spFrame->mask[spIdx]; }
dc0[dcIdx] |= spFrame->img[spIdx];
}else{
// 為了讓左移后補上的位是1,取反->左移->再取反
if (spFrame->mask != NULL) { dc0[dcIdx] &= (~((~spFrame->mask[spIdx]) << offset)); }
// if (spFrame->mask != NULL) { dc0[dcIdx] &= ((spFrame->mask[spIdx] << offset) | (0xFF >> (8-offset)))); }
dc0[dcIdx] |= (spFrame->img[spIdx] << offset);
// 跨越了page,要在下個page繪制偏移出去的精靈,下個page的數組下標就是dcNIdx
dcNIdx = (dcCol)+(dcPage+1)*128;
// 選了下個page,需要判斷是否超出屏幕范圍
if (dcNIdx>=0 && dcNIdx < 1024){
// 右移無法保證補位是0還是1,干脆就用|填充1
if (spFrame->mask != NULL) { dc0[dcNIdx] &= ((spFrame->mask[spIdx] >> (8-offset) ) | (0xFF << offset) ); }
dc0[dcNIdx] |= ((spFrame->img[spIdx] >> (8-offset) ) & (~(0xFF << offset))); // 這里是或運算,補0
}
}
}
}
}
}
}
void clean()
{
for (size_t i = 0; i < 1024; ++i)
{
dc0[i] = 0;
}
}
#endif /* MBEDTLS_CONFIG_H */
文件名:resources.h
#ifndef RESOURCES_H
#define RESOURCES_H
#include
// HERO_IMG1 HERO_IMG2
// ████████ ████████
// █______█__█______█
//_█_██_█_█__█_██_█_█
//_█______█__█______█
//_█______█__█______█
//_█__██__█__█__██__█
//_█______█__█______█
//_████████__████████
//___█_█_______█_█___
//__█___█_______█____
//__█___█______█_█___
//__██__██_____████__
#define HERO_IMG1 {0xFF,0x81,0x85,0xA5,0xA1,0x85,0x81,0xFF,0x0,0xE,0x9,0x0,0x1,0xE,0x8,0x0}
#define HERO_IMG2 {0xFF,0x81,0x85,0xA5,0xA1,0x85,0x81,0xFF,0x0,0x0,0xD,0xA,0xD,0x8,0x0,0x0}
#define HERO_MASK {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}
#define BG_IMG {
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xC0,0x20,0x20,0x20,0x0,0x10,0xF,
0x0,0x0,0x80,0x40,0x20,0x10,0x8,0xC,0x4,0x2,0x2,0x1,0x1,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x80,0x40,0x60,0x30,0x30,0x8,0x8,0x8,0x0,0x5,0x9,0xA,
0x34,0x4C,0x18,0x20,0xC0,0x0,0x0,0x0,0x0,0x4C,0x83,0x80,0x80,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x60,0x88,0x8,0x4,0x4,0x0,0x0,0x0,0x4,0x3,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0xC,0xC,0x4,0x2,0x12,0x12,0x20,0xC0,
0x0,0x0,0x0,0x2,0x2,0x2,0x4,0x4,0x8,0x8,0x10,0x20,0x40,0x80,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x4,0x4,0x4,0x4,0x4,0x4,0x4,
0x4,0x4,0x7,0x0,0x0,0x0,0x0,0xE0,0x8,0x2,0x1,0x0,0x0,0x0,0x0,0x0,
0x80,0x80,0x0,0x40,0x40,0x0,0x80,0x80,0x80,0x40,0x6,0x1,0x0,0xF8,0x0,0xFC,
0x0,0x0,0x80,0x80,0x40,0x40,0x20,0x10,0x18,0x4,0x0,0x0,0x0,0x7,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x80,0x60,0x11,0xD,0x8,0x8,0x8,0x0,0x10,0x10,0x20,
0x40,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x40,0x60,0x20,0x10,0x10,0x8,0x8,0x8,0x0,
0x0,0x0,0x0,0x8,0x8,0x8,0x10,0x10,0x20,0x10,0x4,0x2,0x1,0x1,0x0,0x2,
0x2,0x2,0x4,0x18,0x10,0x20,0x20,0x20,0x20,0x20,0x10,0x10,0x8,0x4,0x0,0x8,
0x8,0x8,0x8,0x8,0x8,0x0,0x4,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x3,0xC,0x10,0x10,0x8,0x4,0x4,0x2,0x0,0x1,
0x0,0x0,0x81,0x41,0x21,0x12,0xA,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x3E,0x80,
0x0,0x0,0x60,0x18,0xC,0x6,0xC2,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x61,
0x1C,0x2,0x1,0x1,0x1,0x1,0x1,0x1,0x11,0xF1,0x18,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0xC0,0x30,0xE,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x2,0x4,
0x4,0x4,0x8,0x88,0x88,0x90,0x50,0x20,0x0,0x0,0x3,0x4,0x2,0x2,0x1,0x1,
0x0,0x2,0x4,0x8,0x70,0x40,0x20,0x20,0x10,0x10,0x10,0x0,0x0,0x8,0x8,0x8,
0x8,0x0,0x10,0x10,0x0,0x20,0x40,0x80,0x80,0x60,0x10,0x8,0x8,0x4,0x0,0x2,
0x2,0x2,0x2,0x2,0x2,0x2,0x4,0x4,0x8,0x10,0x10,0x10,0xC,0x3,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x80,0x80,0x40,0x40,0x40,0x40,0x40,0x0,0x1,0x2,0x2,0x2,0x2,0xC2,0x22,
0x1C,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x4,0x18,0x26,0x50,0xB0,0xA0,0x3F,0x10,
0x10,0x10,0x8,0x4,0x4,0x2,0x1,0x0,0x0,0x0,0x0,0x8,0x8,0x8,0x8,0x4,
0x3,0x0,0x80,0x80,0x40,0x20,0x20,0x10,0x8,0x6,0x1,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x1C,0x20,0x42,0x42,0x80,0x1,0x1,0x1,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x3,0x38,0x40,0x40,0x40,0x80,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3E,0x41,0x80,0x80,0x0,0x0,0x0,0x0,0x0,
0x10,0x10,0x10,0x3C,0x22,0x21,0x20,0x20,0x20,0x10,0x10,0x10,0x8,0x8,0x4,0xC4,
0xB4,0x8C,0x80,0x40,0x40,0xC0,0x1,0x1,0x2,0x2,0x0,0x4,0x4,0x84,0x84,0x4,
0x4,0x4,0x4,0x4,0x4,0x2,0x82,0x82,0x81,0x1,0x0,0x0,0x0,0x0,0x0,0xC0,
0x18,0x8,0x4,0x4,0x8,0x8,0x8,0x10,0x10,0x0,0x20,0x20,0x0,0x40,0x40,0x40,
0x81,0x82,0x84,0x88,0x90,0xC0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x60,0x20,0x40,0x80,0x80,0x30,0xC,0x3,0x67,0x20,0x10,0xD0,0x38,0x8,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x81,
0x86,0x98,0xC0,0x80,0x0,0x0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x0,0x0,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0,0x0,0x0,0x10,0x10,0x10,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8,0x0,0x8,0x8,0x8,0x8,0x8,0x8,0x8,
0x8,0x8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x10,0x10,0x10,
0x10,0x10,0x10,0x11,0x11,0x11,0x11,0x10,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x60,0xC,0x83,0x40,0x20,0x10,
0x8,0xC,0x4,0x2,0x1,0x0,0x0,0x3,0x1C,0x60,0x40,0x40,0x30,0xE,0x1,0x0,
0x0,0x1,0xC2,0x4,0x8,0x10,0x90,0x9F,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x80,0x80,0x0,0x40,0x40,0x40,
0x40,0x0,0x20,0x20,0x20,0x0,0x10,0x10,0x10,0x1F,0x10,0x1,0x9,0x8,0x8,0x8,
0x0,0x4,0x6,0x5,0x4,0x4,0x0,0x2,0x2,0x2,0x2,0x2,0x0,0x0,0x1,0x1,
0x1,0x1,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x80,0x70,0x0,0x0,0x80,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x20,0xA0,0x40,0x40,0x7C,0x10,0x30,0x8,
0xEE,0x0,0x0,0x80,0x80,0x84,0x5C,0x64,0x48,0x7,0x23,0x22,0x21,0x11,0x1C,0x10,
0x0,0x8,0x8,0x8,0x4,0x4,0x4,0x4,0x2,0x2,0x2,0x2,0x1,0x1,0x1,0x1,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x3,0x19,0x2,0x1,0x0,0x1,0x11,0x7,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x80,0x40,0x40,0x0,0x20,0x20,0x10,0x10,0x0,
0x8,0x8,0x6,0x4,0x4,0x2,0x2,0x2,0x1,0x1,0x1,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x20,0xE0,0xC0,0xC0,0x1E,0x7,0x30,0x10,0xE8,0x1C,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}
#endif /* MBEDTLS_CONFIG_H */
審核編輯 黃宇
-
內存
+關注
關注
8文章
3108瀏覽量
74975 -
安信可
+關注
關注
0文章
184瀏覽量
4351
發布評論請先 登錄
移植屏幕后,液晶顯示的字體顯示模糊有重影怎么解決?
關于rk3288點亮lvds屏幕的過程記錄
網頁顯示的幕后技術
用Arduino來點亮彩色LCD顯示屏

高性能、低功耗、可驅屏,Ai-M61系列模組驅屏能力介紹

安信可Ai-M61/Ai-M62系列連接AWS亞馬遜云

“WiFi 6+BLE5.3+Thread”,安信可Ai-M61系列模組選型

基于Ai-M61模組打造一個智能魚缸水質監測系統
智能家居之旅(3):Ai-M61/M62 接入HomeAssistant 實現點燈

安信可Ai-M61/M62系列模組支持CAN接口了?

安信可Ai-M61系列模組實現藍牙歌詞播放功能

能和Ai-M61模組對話了?手搓一個ChatGPT 語音助手

評論