|
在制作一些顯示類的作品時(shí),通常會有大量的數(shù)組,用來儲存字庫,或者圖片。這個(gè)時(shí)候需要大容量的MCU,導(dǎo)致嚴(yán)重消耗MCU的FLASH,當(dāng)然可以掛一個(gè)外部FLASH芯片。我的DIY喜好是利用身邊的元器件去DIY,能不去買元器件,決不去買! 手上大把的MCU,利用起來。
首先先仿真一下,驗(yàn)證理論上是否行的通,有的人認(rèn)為仿真不如實(shí)際的板子,似乎很鄙視仿真。但是仿真可以摸魚呀 ,畢竟上班時(shí)候拿個(gè)板子在那里調(diào)試不好。當(dāng)然仿真成功后,還是得用實(shí)際的板子驗(yàn)證下!
直接上圖吧
51hei截圖_20220830110828.png (100.88 KB, 下載次數(shù): 76)
下載附件
2022-8-30 11:23 上傳
這是用AVR的MCU寫的,之所以用AVR是因?yàn)镻roteus對AVR比較支持吧,運(yùn)行速度也還行,之前用C51寫過,好多外設(shè)沒有,要軟件模擬。你也可以移植到其他型號的MCU。
原理比較簡單,主機(jī)發(fā)送命令格式給字庫單片機(jī),字庫單片機(jī)接收到命令數(shù)據(jù),返回字庫數(shù)據(jù)給主機(jī)。
我的格式是
主機(jī)發(fā)送:“1Bit字符類型”+“2Bit字符”,比如我需要寫8*16的字符A,那么發(fā)送的數(shù)據(jù)就是0x10,0x41,0x00 , 0x10就是字符類型,這個(gè)可以自己定義,0x41和0x00就是大寫字母A,這個(gè)用了2個(gè)Bit表示,是為了兼容漢字。
字庫單片機(jī)返回:解析后,返回字庫數(shù)組,在數(shù)據(jù)最后面發(fā)送一個(gè)0x55,用來告訴主機(jī)發(fā)送完畢。
下面是部分函數(shù):
- #if 1
- /**********************************************************
- 函數(shù)結(jié)果:解析字庫
- 備 注:
- **********************************************************/
- void Font_AnalysisData(void)
- {
- uint8_t i=0;
- My_HeadPack_TypeDef *FontPack;
-
- if (TRUE == RingBuf_COM1_RD_Byte(&MyUart.COM1.Data))
- {
- MyUart.COM1.Buf_Rx[MyUart.COM1.LenRx]=MyUart.COM1.Data;
- MyUart.COM1.LenRx++;
- }
- else
- {
- if (0 == MyUart.COM1.TimeOutState)//超時(shí)機(jī)制
- {
- if (0 != MyUart.COM1.LenRx)
- {
- FontPack=(My_HeadPack_TypeDef *)&MyUart.COM1.Buf_Rx[0];
-
- if(FontPack->Type == ASCII_8x5)
- {
- memcpy_P(&MyFont.Buf[0],&WordStock_ASCII_8x5[(FontPack->ID[0] - Font_ASCII_8x5_Offset) * ASCII_8x5],5);
- Uart_COM1_WR_NByte(5,(uint8_t *)&MyFont.Buf[0]);
- Uart_COM1_WR_Byte(0x55);
- }
- else if(FontPack->Type == ASCII_8x16)
- {
- memcpy_P(&MyFont.Buf[0],&WordStock_ASCII_8x16[(FontPack->ID[0] - Font_ASCII_8x16_Offset) * ASCII_8x16],16);
- Uart_COM1_WR_NByte(16,(uint8_t *)&MyFont.Buf[0]);
- Uart_COM1_WR_Byte(0x55);
- }
- else if(FontPack->Type == ASCII_16x16)
- {
- memcpy_P(&MyFont.Buf[0],&WordStock_ASCII_16x16[(FontPack->ID[0] - Font_ASCII_16x16_Offset) * ASCII_16x16],32);
- Uart_COM1_WR_NByte(32,(uint8_t *)&MyFont.Buf[0]);
- Uart_COM1_WR_Byte(0x55);
- }
- else if(FontPack->Type == CHN_16x16)
- {
- for (i=0;i<CHN_16x16_Len;i++)//查找漢字
- {
- if ((FontPack->ID[0] == WordStock_CHN_16x16[i].Index[0])&&(FontPack->ID[1] == WordStock_CHN_16x16[i].Index[1]))
- {
- memcpy_P(&MyFont.Buf[0],&WordStock_CHN_16x16[i].Buf[0],32);
- Uart_COM1_WR_NByte(32,(uint8_t *)&MyFont.Buf[0]);
- Uart_COM1_WR_Byte(0x55);
- break;
- }
- }
- if(i == CHN_16x16_Len)
- {
- memset(&MyFont.Buf[0] , 0xFF , 32);
- Uart_COM1_WR_NByte(32,(uint8_t *)&MyFont.Buf[0]);
- Uart_COM1_WR_Byte(0x55);
- }
- }
- memset(&MyUart.COM1.Buf_Rx[0] , 0 , sizeof (MyUart.COM1.Buf_Rx)); //清零
- MyUart.COM1.LenRx = 0;
- }
- }
- }
- }
- #endif
復(fù)制代碼- #if 1
- /***********************************************************
- 函數(shù)結(jié)果:Font_RD_NByte
- 備 注: 讀取串口的字符數(shù)據(jù)
- ***********************************************************/
- void Font_RD_NByte(MyFont_Enum_TypeDef Font, uint8_t *CharacterBuf, char *String, uint8_t Len)
- {
- uint16_t Flag=0xFFFF;
-
- Uart_COM1_WR_Byte(Font);
- Uart_COM1_WR_NByte(2,(uint8_t *)String);
- while(Flag)
- {
- Flag--;
- if (TRUE == RingBuf_COM1_RD_Byte(&MyUart.COM1.Data))
- {
- MyUart.COM1.Buf_Rx[MyUart.COM1.LenRx]=MyUart.COM1.Data;
- MyUart.COM1.LenRx++;
- }
- else
- {
- if (0 == MyUart.COM1.TimeOutState)//超時(shí)機(jī)制
- {
- if (0 != MyUart.COM1.LenRx)
- {
- if (0x55 == MyUart.COM1.Buf_Rx[Len-1])//接收到0x55,表示叢機(jī)發(fā)送完畢了,可以拷貝數(shù)據(jù)
- {
- memcpy(CharacterBuf,&MyUart.COM1.Buf_Rx[0],Font);
- Flag=0;
- }
- memset(&MyUart.COM1.Buf_Rx[0] , 0 , sizeof (MyUart.COM1.Buf_Rx)); //清零
- MyUart.COM1.LenRx = 0;
- }
- }
- }
- if(Flag == 1)//超時(shí)
- {
- memset(CharacterBuf , 0xFF, Font); //叢機(jī)長時(shí)間不回應(yīng),串口通信失敗,全部點(diǎn)亮
- Flag=0;
- }
- }
- }
- #endif
復(fù)制代碼 先到這里了,過幾天測試下實(shí)物看看通信穩(wěn)不穩(wěn)定。
Uart_Font.zip
(366.62 KB, 下載次數(shù): 10)
2022-8-30 12:55 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|