欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3602|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)制作字庫(kù)(通過(guò)串口傳輸)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:78835 發(fā)表于 2022-8-30 12:57 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
在制作一些顯示類(lèi)的作品時(shí),通常會(huì)有大量的數(shù)組,用來(lái)儲(chǔ)存字庫(kù),或者圖片。這個(gè)時(shí)候需要大容量的MCU,導(dǎo)致嚴(yán)重消耗MCU的FLASH,當(dāng)然可以?huà)煲粋(gè)外部FLASH芯片。我的DIY喜好是利用身邊的元器件去DIY,能不去買(mǎi)元器件,決不去買(mǎi)!手上大把的MCU,利用起來(lái)。
首先先仿真一下,驗(yàn)證理論上是否行的通,有的人認(rèn)為仿真不如實(shí)際的板子,似乎很鄙視仿真。但是仿真可以摸魚(yú)呀,畢竟上班時(shí)候拿個(gè)板子在那里調(diào)試不好。當(dāng)然仿真成功后,還是得用實(shí)際的板子驗(yàn)證下!
直接上圖吧


這是用AVR的MCU寫(xiě)的,之所以用AVR是因?yàn)镻roteus對(duì)AVR比較支持吧,運(yùn)行速度也還行,之前用C51寫(xiě)過(guò),好多外設(shè)沒(méi)有,要軟件模擬。你也可以移植到其他型號(hào)的MCU。
原理比較簡(jiǎn)單,主機(jī)發(fā)送命令格式給字庫(kù)單片機(jī),字庫(kù)單片機(jī)接收到命令數(shù)據(jù),返回字庫(kù)數(shù)據(jù)給主機(jī)。
我的格式是
主機(jī)發(fā)送:“1Bit字符類(lèi)型”+“2Bit字符”,比如我需要寫(xiě)8*16的字符A,那么發(fā)送的數(shù)據(jù)就是0x10,0x41,0x00 , 0x10就是字符類(lèi)型,這個(gè)可以自己定義,0x41和0x00就是大寫(xiě)字母A,這個(gè)用了2個(gè)Bit表示,是為了兼容漢字。
字庫(kù)單片機(jī)返回:解析后,返回字庫(kù)數(shù)組,在數(shù)據(jù)最后面發(fā)送一個(gè)0x55,用來(lái)告訴主機(jī)發(fā)送完畢。
下面是部分函數(shù):
  1. #if 1
  2. /**********************************************************
  3. 函數(shù)結(jié)果:解析字庫(kù)
  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)//超時(shí)機(jī)制
  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
復(fù)制代碼
  1. #if 1
  2. /***********************************************************
  3. 函數(shù)結(jié)果:Font_RD_NByte
  4. 備  注:  讀取串口的字符數(shù)據(jù)
  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)//超時(shí)機(jī)制
  23.                         {
  24.                                 if (0 != MyUart.COM1.LenRx)
  25.                                 {
  26.                                           if (0x55 == MyUart.COM1.Buf_Rx[Len-1])//接收到0x55,表示叢機(jī)發(fā)送完畢了,可以拷貝數(shù)據(jù)
  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)//超時(shí)
  37.                 {
  38.                           memset(CharacterBuf , 0xFF, Font); //叢機(jī)長(zhǎng)時(shí)間不回應(yīng),串口通信失敗,全部點(diǎn)亮
  39.                           Flag=0;
  40.                 }
  41.     }
  42. }
  43. #endif
復(fù)制代碼
先到這里了,過(guò)幾天測(cè)試下實(shí)物看看通信穩(wěn)不穩(wěn)定。
Uart_Font.zip (366.62 KB, 下載次數(shù): 10)





評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

無(wú)效樓層,該帖已經(jīng)被刪除
板凳
ID:44037 發(fā)表于 2022-9-3 11:16 | 只看該作者
謝謝樓主分享 只有仿真  能分享一下程序嗎
回復(fù)

使用道具 舉報(bào)

地板
ID:78835 發(fā)表于 2022-9-8 16:48 | 只看該作者
by64214 發(fā)表于 2022-9-3 11:16
謝謝樓主分享 只有仿真  能分享一下程序嗎

等我整理好一起發(fā)出來(lái),最近上班有點(diǎn)忙,沒(méi)時(shí)間整理
回復(fù)

使用道具 舉報(bào)

5#
ID:467178 發(fā)表于 2022-9-8 19:57 | 只看該作者
樓主請(qǐng)教你下,怎么讓單片機(jī)發(fā)送類(lèi)似于“AA 55 01 02 02”的數(shù)據(jù)我的單片機(jī)只能發(fā)送一個(gè)如AA在給后面寫(xiě)就錯(cuò)誤了
回復(fù)

使用道具 舉報(bào)

6#
ID:467178 發(fā)表于 2022-9-8 20:06 | 只看該作者
怎么寫(xiě)??
收到0x01發(fā)送55 AA 03 00 02延時(shí)1秒再發(fā)送55 AA 03 02 02
收到0x02 發(fā)送55 AA 03 01 03延時(shí)1秒再發(fā)送55 AA 03 03 03在延時(shí)1秒發(fā)送55 AA 03 04 01
……
一共30條到0x1e
求大神賜教
回復(fù)

使用道具 舉報(bào)

7#
ID:78835 發(fā)表于 2022-9-9 08:35 | 只看該作者
zhhdok 發(fā)表于 2022-9-8 20:06
怎么寫(xiě)??
收到0x01發(fā)送55 AA 03 00 02延時(shí)1秒再發(fā)送55 AA 03 02 02
收到0x02 發(fā)送55 AA 03 01 03延時(shí)1 ...

利用環(huán)形數(shù)組接收數(shù)據(jù),再用定時(shí)器計(jì)算一幀數(shù)據(jù)的間隔,就是定時(shí)器里面記數(shù)標(biāo)志一直不斷加一,串口接收中斷一進(jìn)去,就清零定時(shí)器記數(shù)標(biāo)志,這樣當(dāng)串口中斷沒(méi)進(jìn)去的時(shí)候,定時(shí)器的記數(shù)標(biāo)志位肯定往上加到一定閥值,達(dá)到那個(gè)閥值說(shuō)明一幀數(shù)據(jù)接收到了,這個(gè)時(shí)候你就可以解碼了。
回復(fù)

使用道具 舉報(bào)

8#
ID:759131 發(fā)表于 2022-9-23 13:49 | 只看該作者
這個(gè)用X Modem或者Y Modem就可以很好地傳輸了
然后X Y 貓用超級(jí)終端就有,還有一些遠(yuǎn)程終端也有的
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表