久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3608|回復: 6
收起左側

單片機制作字庫(通過串口傳輸)

[復制鏈接]
ID:78835 發表于 2022-8-30 12:57 | 顯示全部樓層 |閱讀模式
在制作一些顯示類的作品時,通常會有大量的數組,用來儲存字庫,或者圖片。這個時候需要大容量的MCU,導致嚴重消耗MCU的FLASH,當然可以掛一個外部FLASH芯片。我的DIY喜好是利用身邊的元器件去DIY,能不去買元器件,決不去買!手上大把的MCU,利用起來。
首先先仿真一下,驗證理論上是否行的通,有的人認為仿真不如實際的板子,似乎很鄙視仿真。但是仿真可以摸魚呀,畢竟上班時候拿個板子在那里調試不好。當然仿真成功后,還是得用實際的板子驗證下!
直接上圖吧
51hei截圖_20220830110828.png

這是用AVR的MCU寫的,之所以用AVR是因為Proteus對AVR比較支持吧,運行速度也還行,之前用C51寫過,好多外設沒有,要軟件模擬。你也可以移植到其他型號的MCU。
原理比較簡單,主機發送命令格式給字庫單片機,字庫單片機接收到命令數據,返回字庫數據給主機。
我的格式是
主機發送:“1Bit字符類型”+“2Bit字符”,比如我需要寫8*16的字符A,那么發送的數據就是0x10,0x41,0x00 , 0x10就是字符類型,這個可以自己定義,0x41和0x00就是大寫字母A,這個用了2個Bit表示,是為了兼容漢字。
字庫單片機返回:解析后,返回字庫數組,在數據最后面發送一個0x55,用來告訴主機發送完畢。
下面是部分函數:
  1. #if 1
  2. /**********************************************************
  3. 函數結果:解析字庫
  4. 備  注:
  5. **********************************************************/
  6. void Font_AnalysisData(void)
  7. {
  8.           uint8_t i=0;
  9.           My_HeadPack_TypeDef *FontPack;
  10.         
  11.     if (TRUE == RingBuf_COM1_RD_Byte(&MyUart.COM1.Data))
  12.     {
  13.         MyUart.COM1.Buf_Rx[MyUart.COM1.LenRx]=MyUart.COM1.Data;
  14.         MyUart.COM1.LenRx++;
  15.     }
  16.     else
  17.     {
  18.         if (0 == MyUart.COM1.TimeOutState)//超時機制
  19.         {
  20.             if (0 != MyUart.COM1.LenRx)
  21.             {
  22.                                   FontPack=(My_HeadPack_TypeDef *)&MyUart.COM1.Buf_Rx[0];
  23.                                 
  24.                                   if(FontPack->Type == ASCII_8x5)
  25.                                 {
  26.                                           memcpy_P(&MyFont.Buf[0],&WordStock_ASCII_8x5[(FontPack->ID[0] - Font_ASCII_8x5_Offset) * ASCII_8x5],5);
  27.                                         Uart_COM1_WR_NByte(5,(uint8_t *)&MyFont.Buf[0]);
  28.                                         Uart_COM1_WR_Byte(0x55);
  29.                                 }
  30.                                 else if(FontPack->Type == ASCII_8x16)
  31.                                 {
  32.                                           memcpy_P(&MyFont.Buf[0],&WordStock_ASCII_8x16[(FontPack->ID[0] - Font_ASCII_8x16_Offset) * ASCII_8x16],16);
  33.                                         Uart_COM1_WR_NByte(16,(uint8_t *)&MyFont.Buf[0]);
  34.                                         Uart_COM1_WR_Byte(0x55);
  35.                                 }
  36.                                 else if(FontPack->Type == ASCII_16x16)
  37.                                 {
  38.                                           memcpy_P(&MyFont.Buf[0],&WordStock_ASCII_16x16[(FontPack->ID[0] - Font_ASCII_16x16_Offset) * ASCII_16x16],32);
  39.                                         Uart_COM1_WR_NByte(32,(uint8_t *)&MyFont.Buf[0]);
  40.                                         Uart_COM1_WR_Byte(0x55);
  41.                                 }
  42.                                 else if(FontPack->Type == CHN_16x16)
  43.                                 {
  44.                                         for (i=0;i<CHN_16x16_Len;i++)//查找漢字
  45.                                         {
  46.                                                 if ((FontPack->ID[0] == WordStock_CHN_16x16[i].Index[0])&&(FontPack->ID[1] == WordStock_CHN_16x16[i].Index[1]))
  47.                                                 {
  48.                                                         memcpy_P(&MyFont.Buf[0],&WordStock_CHN_16x16[i].Buf[0],32);
  49.                                                         Uart_COM1_WR_NByte(32,(uint8_t *)&MyFont.Buf[0]);
  50.                                                         Uart_COM1_WR_Byte(0x55);
  51.                                                         break;
  52.                                                 }
  53.                                         }
  54.                                         if(i == CHN_16x16_Len)
  55.                                         {
  56.                                                 memset(&MyFont.Buf[0] , 0xFF , 32);
  57.                                                 Uart_COM1_WR_NByte(32,(uint8_t *)&MyFont.Buf[0]);
  58.                                                 Uart_COM1_WR_Byte(0x55);
  59.                                         }
  60.                                 }
  61.                 memset(&MyUart.COM1.Buf_Rx[0] , 0 , sizeof (MyUart.COM1.Buf_Rx)); //清零
  62.                 MyUart.COM1.LenRx = 0;
  63.             }
  64.         }
  65.     }
  66. }
  67. #endif
復制代碼
  1. #if 1
  2. /***********************************************************
  3. 函數結果:Font_RD_NByte
  4. 備  注:  讀取串口的字符數據
  5. ***********************************************************/
  6. void Font_RD_NByte(MyFont_Enum_TypeDef Font, uint8_t *CharacterBuf, char *String, uint8_t Len)
  7. {
  8.           uint16_t Flag=0xFFFF;
  9.           
  10.           Uart_COM1_WR_Byte(Font);
  11.         Uart_COM1_WR_NByte(2,(uint8_t *)String);
  12.     while(Flag)
  13.     {
  14.                   Flag--;
  15.         if (TRUE == RingBuf_COM1_RD_Byte(&MyUart.COM1.Data))
  16.                 {
  17.                         MyUart.COM1.Buf_Rx[MyUart.COM1.LenRx]=MyUart.COM1.Data;
  18.                         MyUart.COM1.LenRx++;
  19.                 }
  20.                 else
  21.                 {
  22.                         if (0 == MyUart.COM1.TimeOutState)//超時機制
  23.                         {
  24.                                 if (0 != MyUart.COM1.LenRx)
  25.                                 {
  26.                                           if (0x55 == MyUart.COM1.Buf_Rx[Len-1])//接收到0x55,表示叢機發送完畢了,可以拷貝數據
  27.                                         {
  28.                                                   memcpy(CharacterBuf,&MyUart.COM1.Buf_Rx[0],Font);
  29.                                                 Flag=0;
  30.                                         }
  31.                                         memset(&MyUart.COM1.Buf_Rx[0] , 0 , sizeof (MyUart.COM1.Buf_Rx)); //清零
  32.                                         MyUart.COM1.LenRx = 0;
  33.                                 }
  34.                         }
  35.                 }
  36.         if(Flag == 1)//超時
  37.                 {
  38.                           memset(CharacterBuf , 0xFF, Font); //叢機長時間不回應,串口通信失敗,全部點亮
  39.                           Flag=0;
  40.                 }
  41.     }
  42. }
  43. #endif
復制代碼
先到這里了,過幾天測試下實物看看通信穩不穩定。
Uart_Font.zip (366.62 KB, 下載次數: 10)





評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

無效樓層,該帖已經被刪除
ID:44037 發表于 2022-9-3 11:16 | 顯示全部樓層
謝謝樓主分享 只有仿真  能分享一下程序嗎
回復

使用道具 舉報

ID:78835 發表于 2022-9-8 16:48 | 顯示全部樓層
by64214 發表于 2022-9-3 11:16
謝謝樓主分享 只有仿真  能分享一下程序嗎

等我整理好一起發出來,最近上班有點忙,沒時間整理
回復

使用道具 舉報

ID:467178 發表于 2022-9-8 19:57 | 顯示全部樓層
樓主請教你下,怎么讓單片機發送類似于“AA 55 01 02 02”的數據我的單片機只能發送一個如AA在給后面寫就錯誤了
回復

使用道具 舉報

ID:467178 發表于 2022-9-8 20:06 | 顯示全部樓層
怎么寫??
收到0x01發送55 AA 03 00 02延時1秒再發送55 AA 03 02 02
收到0x02 發送55 AA 03 01 03延時1秒再發送55 AA 03 03 03在延時1秒發送55 AA 03 04 01
……
一共30條到0x1e
求大神賜教
回復

使用道具 舉報

ID:78835 發表于 2022-9-9 08:35 | 顯示全部樓層
zhhdok 發表于 2022-9-8 20:06
怎么寫??
收到0x01發送55 AA 03 00 02延時1秒再發送55 AA 03 02 02
收到0x02 發送55 AA 03 01 03延時1 ...

利用環形數組接收數據,再用定時器計算一幀數據的間隔,就是定時器里面記數標志一直不斷加一,串口接收中斷一進去,就清零定時器記數標志,這樣當串口中斷沒進去的時候,定時器的記數標志位肯定往上加到一定閥值,達到那個閥值說明一幀數據接收到了,這個時候你就可以解碼了。
回復

使用道具 舉報

ID:759131 發表于 2022-9-23 13:49 | 顯示全部樓層
這個用X Modem或者Y Modem就可以很好地傳輸了
然后X Y 貓用超級終端就有,還有一些遠程終端也有的
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲成人中文字幕 | 成人免费视频 | 日韩国产在线观看 | 波多野结衣一区二区 | 日韩三级在线观看 | 男人天堂99 | 亚州影院 | 超碰免费在 | 综合激情av| 精品一区二区三区不卡 | 久草成人网| 亚洲一区二区三区 | 亚洲一区二区三 | 国产精品久久久久久久久久久免费看 | 成人免费大片黄在线播放 | 日韩成人免费视频 | 粉嫩一区二区三区国产精品 | 国产精品不卡 | 天天曰夜夜 | 久久久精品一区 | 国产999精品久久久影片官网 | 一级欧美| 久久精品国产久精国产 | 手机看片169 | 欧美精品三区 | 成人网在线 | 国产高清一区二区三区 | 在线视频三区 | 欧美黄色一区 | 久久久涩 | 日韩视频在线播放 | 女女百合av大片一区二区三区九县 | 久久久久久久久久久久久久国产 | 国产精品不卡视频 | 日韩免费高清视频 | 大学生a级毛片免费视频 | 久久色视频| 91传媒在线观看 | 国产成人av一区二区三区 | 性色av一区二区三区 | 成人福利在线观看 |