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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5588|回復: 0
打印 上一主題 下一主題
收起左側

STM32 can通信例程 發送和接受數組

[復制鏈接]
跳轉到指定樓層
樓主
can 收發數據

以上壓縮包的所有內容可以到本帖最后下載附件

部分例程源碼預覽:
  1. #include "fontupd.h"
  2. #include "sys.h"
  3. #include "fat.h"
  4. #include "flash.h"
  5. #include "usart.h"
  6. #include "delay.h"
  7. #include "lcd.h"
  8. #include "ad.h"
  9. //////////////////////////////////////////////////////////////////////////////////         
  10. //本程序只供學習使用,未經作者許可,不得用于其它任何用途
  11. //中文漢字支持程序 驅動代碼                  
  12. //本程序只供學習使用,未經作者許可,不得用于其它任何用途
  13. //LX-1A開發板                  
  14. //青島智芯科技
  15. //電話:13012418100
  16. //修改日期:2018/10/28
  17. //版權所有,盜版必究。
  18. //////////////////////////////////////////////////////////////////////////////////         



  19. //以下下字段一定不要亂改!!!
  20. //字節0~3,  記錄UNI2GBKADDR;字節4~7  ,記錄UNI2GBKADDR的大小
  21. //字節8~11, 記錄FONT16ADDR ;字節12~15,記錄FONT16ADDR的大小
  22. //字節16~19,記錄FONT12ADDR ;字節20~23,記錄FONT12ADDR的大小                    
  23. //字節24,用來存放字庫是否存在的標志位,0XAA,表示存在字庫;其他值,表示字庫不存在!

  24. //系統文件夾                  
  25. const unsigned char *folder[2]=
  26. {
  27. "SYSTEM",
  28. "FONT",         
  29. };         
  30. //系統文件定義
  31. const unsigned char *sysfile[3]=
  32. {                          
  33. "GBK16.FON",
  34. "GBK24.FON",
  35. "UNI2GBK.SYS",         
  36. };
  37. //字節0~3,  記錄UNI2GBKADDR;字節4~7  ,記錄UNI2GBKADDR的大小
  38. //字節8~11, 記錄FONT16ADDR ;字節12~15,記錄FONT16ADDR的大小
  39. //字節16~19,記錄FONT12ADDR ;字節20~23,記錄FONT12ADDR的大小
  40. //字體存放,從100K處開始
  41. //100K,存放UNICODE2GBK的轉換碼        

  42. u32 FONT16ADDR ;//16字體存放的地址
  43. u32 FONT24ADDR ;//24字體存放的地址
  44. u32 UNI2GBKADDR;//UNICODE TO GBK 表存放地址                  

  45. //更新字體文件
  46. //返回值:0,更新成功;
  47. //                 其他,錯誤代碼.
  48. //正點原子@ALIENTEK
  49. //V1.1
  50. #ifdef EN_UPDATE_FONT
  51. u8 temp[512];  //零時空間
  52. u8 Update_Font(void)
  53. {
  54.         u32 fcluster=0;           
  55.         u32 i;
  56.         //u8 temp[512];  //零時空間         在這里定義,會內存溢出
  57.         u32 tempsys[2];  //臨時記錄文件起始位置和文件大小
  58.         float prog;
  59.         u8 t;                 
  60.         FileInfoStruct FileTemp;//零時文件夾                                                
  61.         //得到根目錄的簇號
  62.         if(FAT32_Enable)fcluster=FirstDirClust;
  63.         else fcluster=0;                           
  64.         FileTemp=F_Search(fcluster,(unsigned char *)folder[0],T_FILE);//查找system文件夾         
  65.         if(FileTemp.F_StartCluster==0)return 1;                                                  //系統文件夾丟失                          
  66.         {                                                                                          
  67.                 //先查找字體
  68.                 FileTemp=F_Search(FileTemp.F_StartCluster,(unsigned char *)folder[1],T_FILE);//在system文件夾下查找FONT文件夾
  69.                 if(FileTemp.F_StartCluster==0)return 2;//字體文件夾丟失        

  70.                 fcluster=FileTemp.F_StartCluster;      //字體文件夾簇號            
  71.                 FileTemp=F_Search(fcluster,(unsigned char *)sysfile[2],T_SYS);//在system文件夾下查找SYS文件
  72.                 if(FileTemp.F_StartCluster==0)return 3;//FONT12字體文件丟失         
  73.                 //LCD_ShowString(20,90,"Write UNI2GBK to FLASH...");               
  74.                 //LCD_ShowString(108,110,"%");               
  75.                 F_Open(&FileTemp);//打開該文件
  76.                 i=0;         
  77.                 while(F_Read(&FileTemp,temp))//成功讀出512個字節
  78.                 {                 
  79.                         if(i<FileTemp.F_Size)//不超過文件大小
  80.                         {
  81.                                 SPI_Flash_Write(temp,i+100000,512);//從100K字節處開始寫入512個數據   
  82.                                 i+=512;//增加512個字節
  83.                         }
  84.                         prog=(float)i/FileTemp.F_Size;
  85.                         prog*=100;
  86.                         if(t!=prog)
  87.                         {
  88.                                 t=prog;
  89.                                 if(t>100)t=100;
  90.                                 //LCD_ShowNum(84,110,t,3,16);//顯示數值
  91.                         }                                            
  92.                 }
  93.                 UNI2GBKADDR=100000;//UNI2GBKADDR從100K處開始寫入.
  94.                 tempsys[0]=UNI2GBKADDR;
  95.                 tempsys[1]=FileTemp.F_Size;                   //UNI2GBKADDR 大小
  96.                 SPI_Flash_Write((u8*)tempsys,0,8);//記錄在地址0~7處

  97.                 delay_ms(1000);                           
  98.                 //printf("UNI2GBK寫入FLASH完畢!\n");
  99.                 //printf("寫入數據長度:%d\n",FileTemp.F_Size);
  100.                 //printf("UNI2GBKSADDR:%d\n\n",UNI2GBKADDR);
  101.                
  102.                 FONT16ADDR=FileTemp.F_Size+UNI2GBKADDR;//F16的首地址
  103.                 FileTemp=F_Search(fcluster,(unsigned char *)sysfile[0],T_FON);//在system文件夾下查找FONT16字體文件
  104.                 if(FileTemp.F_StartCluster==0)return 4;//FONT16字體文件丟失         
  105.         
  106.                 //LCD_ShowString(20,90,"Write FONT16 to FLASH... ");               
  107.                  //printf("開始FONT16寫入FLASH...\n");               
  108.                 F_Open(&FileTemp);//打開該文件
  109.                 i=0;         
  110.                 while(F_Read(&FileTemp,temp))//成功讀出512個字節
  111.                 {
  112.                         if(i<FileTemp.F_Size)//不超過文件大小
  113.                         {
  114.                                 SPI_Flash_Write(temp,i+FONT16ADDR,512);//從0開始寫入512個數據   
  115.                                 i+=512;//增加512個字節
  116.                         }
  117.                         prog=(float)i/FileTemp.F_Size;
  118.                         prog*=100;
  119.                         if(t!=prog)
  120.                         {
  121.                                 t=prog;
  122.                                 if(t>100)t=100;
  123.                                 //LCD_ShowNum(84,110,t,3,16);//顯示數值
  124.                         }
  125.                 }                                                                                                   
  126.                 tempsys[0]=FONT16ADDR;
  127.                 tempsys[1]=FileTemp.F_Size;                   //FONT16ADDR 大小
  128.                 SPI_Flash_Write((u8*)tempsys,8,8);//記錄在地址8~15處
  129.                
  130.                 delay_ms(1000);            
  131.                 //printf("FONT16寫入FLASH完畢!\n");
  132.                 //printf("寫入數據長度:%d\n",FileTemp.F_Size);


  133.                 FONT24ADDR=FileTemp.F_Size+FONT16ADDR;//F16的首地址
  134.                 //printf("FONT16SADDR:%d\n\n",FONT16ADDR);
  135.                 //LCD_ShowString(20,60,"Write FONT12 to FLASH... ");               
  136.                 //FONT12暫時不加入
  137.                                           
  138.                 FileTemp=F_Search(fcluster,(unsigned char *)sysfile[1],T_FON);//在system文件夾下查找FONT12字體文件
  139.                 if(FileTemp.F_StartCluster==0)return 5;//FONT12字體文件丟失         
  140.                 //printf("開始FONT12寫入FLASH...\n");               
  141.                 F_Open(&FileTemp);//打開該文件
  142.                 i=0;         
  143.                 while(F_Read(&FileTemp,temp))//成功讀出512個字節
  144.                 {
  145.                         if(i<FileTemp.F_Size)//不超過文件大小
  146.                         {
  147.                                 SPI_Flash_Write(temp,i+FONT24ADDR,512);//從0開始寫入512個數據   
  148.                                 i+=512;//增加512個字節
  149.                         }
  150.                         prog=(float)i/FileTemp.F_Size;
  151.                         prog*=100;
  152.                         if(t!=prog)
  153.                         {
  154.                                 t=prog;
  155.                                 if(t>100)t=100;
  156.                                 //LCD_ShowNum(84,80,t,3,16);//顯示數值
  157.                         }
  158.                 }            
  159.                 tempsys[0]=FONT24ADDR;
  160.                 tempsys[1]=FileTemp.F_Size;                   //FONT16ADDR 大小
  161.                 SPI_Flash_Write((u8*)tempsys,16,8);//記錄在地址16~23處

  162.                 //printf("FONT12寫入FLASH完畢!\n");
  163.         //        printf("寫入數據長度:%d\n",FileTemp.F_Size);   
  164.         //        printf("FONT12SADDR:%d\n\n",FONT12ADDR); */
  165.         }
  166.         t=0XAA;
  167.            SPI_Flash_Write(&t,24,1);//寫入字庫存在標志        0XAA
  168.         //LCD_ShowString(20,90,"  Font Update Successed  ");                    
  169.         delay_ms(1000);               
  170.         delay_ms(1000);               
  171.         return 0;//成功
  172. }
  173. #endif

  174. //用這個函數得到字體地址
  175. //在系統使用漢字支持之前,必須調用該函數
  176. //包括FONT16ADDR,FONT12ADDR,UNI2GBKADDR;  
  177. u8 Font_Init(void)
  178. {
  179.         u32 tempsys[2];//臨時記錄文件起始位置和文件大小
  180.         u8 fontok=0;
  181.         SPI_Flash_Read(&fontok,24,1);//讀出字庫標志位,看是否存在字庫
  182.         if(fontok!=0XAA)return 1;
  183.         SPI_Flash_Read((u8*)tempsys,0,8);//讀出8個字節   
  184.         UNI2GBKADDR=tempsys[0];                                          
  185.         //printf("tempsysgbk[0]:%d\n",tempsys[0]);
  186.         //printf("tempsysgbk[1]:%d\n",tempsys[1]);

  187.         SPI_Flash_Read((u8*)tempsys,8,8);//讀出8個字節   
  188.         //printf("tempsysf16[0]:%d\n",tempsys[0]);
  189.         //printf("tempsysf16[1]:%d\n",tempsys[1]);
  190.         FONT16ADDR=tempsys[0];
  191.         
  192.         SPI_Flash_Read((u8*)tempsys,16,8);//讀出8個字節   
  193.         //printf("tempsysf12[0]:%d\n",tempsys[0]);
  194.         //printf("tempsysf12[1]:%d\n",tempsys[1]);
  195.         FONT24ADDR=tempsys[0];
  196.         return 0;         
  197. }

復制代碼
  1. #include "flash.h"
  2. #include "lcd.h"
  3. #include "text.h"
  4. #include "gui.h"
  5. //code 字符指針開始
  6. //從字庫中查找出字模
  7. //code 字符串的開始地址,ascii碼
  8. //mat  數據存放地址 size*2 bytes大小
  9. u32 FONT16ADDR ;//16字體存放的地址
  10. u32 FONT24ADDR ;//24字體存放的地址
  11. u32 UNI2GBKADDR;//UNICODE TO GBK 表存放地址
  12. void Get_HzMat(unsigned char *code,unsigned char *mat,u8 size)
  13. {
  14.         unsigned char qh,ql;
  15.         unsigned char i;                                          
  16.         unsigned long foffset;
  17.         qh=*code;
  18.         ql=*(++code);
  19.         if(qh<0x81||ql<0x40||ql==0xff||qh==0xff)//非 常用漢字
  20.         {                       
  21.             for(i=0;i<(size*2);i++)*mat++=0x00;//填充滿格
  22.             return; //結束訪問
  23.         }         
  24.         if(ql<0x7f)ql-=0x40;//注意!
  25.         else ql-=0x41;
  26.         qh-=0x81;   
  27.         foffset=((unsigned long)190*qh+ql)*(size*2);//得到字庫中的字節偏移量                    

  28.         Flash_Read(mat,foffset+FONT16ADDR,32);
  29.               
  30. }  
  31. //顯示一個指定大小的漢字
  32. //x,y :漢字的坐標
  33. //font:漢字GBK碼
  34. //size:字體大小
  35. //mode:0,正常顯示,1,疊加顯示         

  36. void Show_Font(u16 x,u16 y,u8 *font,u16 charColor,u8 size,u8 mode,u8 DispDirec)
  37. {
  38.         u16 temp,t,t1;
  39.         u16 y0=y;
  40.         u8 dzk[32];
  41.         u16 tempcolor;

  42.         Get_HzMat(font,dzk,size);//得到相應大小的點陣數據
  43.         if(mode==0)//正常顯示
  44.         {         
  45.             for(t=0;t<size*2;t++)
  46.             {                                                                                                      
  47.                     temp=dzk[t];//得到12數據                          
  48.                 for(t1=0;t1<8;t1++)
  49.                         {
  50.                                 if(temp&0x80)LCD_DrawPoint(x,y,charColor,DispDirec);
  51.                                  else
  52.                                 {
  53.                                         tempcolor=POINTLCD_COLOR;
  54.                                     LCD_DrawPoint(x,y,tempcolor,DispDirec);
  55.                                         POINTLCD_COLOR=tempcolor;//還原
  56.                                 }
  57.                                 temp<<=1;
  58.                                 y++;
  59.                                 if((y-y0)==size)
  60.                                 {
  61.                                         y=y0;
  62.                                         x++;
  63.                                         break;
  64.                                 }
  65.                         }           
  66.             }
  67.         }else//疊加顯示
  68.         {
  69.             for(t=0;t<size*2;t++)
  70.             {                                                                                                      
  71.                     temp=dzk[t];//得到12數據                          
  72.                 for(t1=0;t1<8;t1++)
  73.                         {
  74.                                 if(temp&0x80)LCD_DrawPoint(x,y,charColor,DispDirec);   
  75.                                 temp<<=1;
  76.                                 y++;
  77.                                 if((y-y0)==size)
  78.                                 {
  79.                                         y=y0;
  80.                                         x++;
  81.                                         break;
  82.                                 }
  83.                         }           
  84.             }
  85.         }   
  86. }
  87.                                    

  88. u16 my_strlen(u8*str)
  89. {
  90.         u16 len=0;
  91.         while(*str!='\0')
  92.         {
  93.                 str++;
  94.                 len++;
  95.         }
  96.         return len;
  97. }

  98. void my_stradd(u8*str1,u8*str2)
  99. {                                 
  100.         while(*str1!='\0')str1++;
  101.         while(*str2!='\0')
  102.         {
  103.                 *str1=*str2;
  104.                 str2++;
  105.                 str1++;
  106.         }
  107.         *str1='\0';//加入結束符                  
  108. }  

  109. void Get_HzMat24(u8 *code,unsigned char *mat)
  110. {
  111.         unsigned char qh,ql;
  112.         //unsigned char i;                                          
  113.         unsigned long foffset;
  114.         qh=*code;
  115.         ql=*(++code);
  116.         
  117.          qh-=0xa0;
  118.          ql-=0xa0;
  119.          foffset=((unsigned long)94*(qh-1)+(ql-1))*72;
  120.          Flash_Read(mat,foffset+FONT24ADDR,72);
  121.    
  122. }

  123.                                           
  124. void LCD_ShowString24(u16 x,u16 y,u8 *font,u16 charColor,u8 mode,u8 DispDirec)
  125. {
  126.         u8 temp,t,t1;
  127.         u16 y0=y;
  128.         u8 dzk[36];
  129.         u16 tempcolor;

  130.         Get_HzMatsting24(font,dzk);//得到相應大小的點陣數據
  131.         if(mode==0)//正常顯示
  132.         {         
  133.             for(t=0;t<36;t++)
  134.             {                                                                                                      
  135.                     temp=dzk[t];                        
  136.                 for(t1=0;t1<8;t1++)
  137.                         {
  138.                                 if(temp&0x80)LCD_DrawPoint(x,y,charColor,DispDirec);
  139.                                  else
  140.                                 {
  141.                                     tempcolor=POINTLCD_COLOR;
  142.                                     LCD_DrawPoint(x,y,tempcolor,DispDirec);
  143.                                         POINTLCD_COLOR=tempcolor;//還原
  144.                                 }
  145.                                 temp<<=1;
  146.                                 y++;
  147.                                 if((y-y0)==24)
  148.                                 {
  149.                                         y=y0;
  150.                                         x++;
  151.                                         break;
  152.                                 }
  153.                         }           
  154.             }
  155.         }else//疊加顯示
  156.         {
  157.             for(t=0;t<36;t++)
  158.             {                                                                                                      
  159.                     temp=dzk[t];//得到12數據                          
  160.                 for(t1=0;t1<8;t1++)
  161.                         {
  162.                                 if(temp&0x80)LCD_DrawPoint(x,y,charColor,DispDirec);   
  163.                                 temp<<=1;
  164.                                 y++;
  165.                                 if((y-y0)==24)
  166.                                 {
  167.                                         y=y0;
  168.                                         x++;
  169.                                         break;
  170.                                 }
  171.                         }           
  172.             }
  173.         }   
  174. }
  175. void Get_HzMatsting24(unsigned char *code,unsigned char *mat)
  176. {
  177.         unsigned char qh;                                          
  178.         unsigned long foffset;
  179.         qh=*code;
  180.         qh=qh-' ';
  181.         foffset=(unsigned long)qh*36;
  182.         Flash_Read(mat,foffset+2030000,36);     
  183. }
  184. u8 Font_Init(void)
  185. {
  186.         u32 tempsys[2];//臨時記錄文件起始位置和文件大小
  187.         u8 fontok=0;
  188.         Flash_Read(&fontok,24,1);//讀出字庫標志位,看是否存在字庫
  189.         if(fontok!=0XAA)return 1;
  190.         Flash_Read((u8*)tempsys,0,8);//讀出8個字節   
  191.         UNI2GBKADDR=tempsys[0];                                          
  192.         //printf("tempsysgbk[0]:%d\n",tempsys[0]);
  193.         //printf("tempsysgbk[1]:%d\n",tempsys[1]);

  194.         Flash_Read((u8*)tempsys,8,8);//讀出8個字節   
  195.         //printf("tempsysf16[0]:%d\n",tempsys[0]);
  196.         //printf("tempsysf16[1]:%d\n",tempsys[1]);
  197.         FONT16ADDR=tempsys[0];
  198.         
  199.         Flash_Read((u8*)tempsys,16,8);//讀出8個字節   
  200.         //printf("tempsysf12[0]:%d\n",tempsys[0]);
  201.         //printf("tempsysf12[1]:%d\n",tempsys[1]);
  202.         FONT24ADDR=tempsys[0];
  203.         return 0;         
  204. }
復制代碼


can收發程序 - 備份.zip

19.01 MB, 下載次數: 67, 下載積分: 黑幣 -5

can收發數據

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久高清 | 影音先锋中文字幕在线观看 | 欧美福利影院 | av在线成人| 91视频国产区| 狠狠婷婷综合久久久久久妖精 | 国产成人精品免高潮在线观看 | www久久国产 | 久久99久久99精品免视看婷婷 | 中文字幕一区二区在线观看 | 国产欧美综合在线 | 久久福利电影 | 午夜欧美 | 91精品久久久久久久久久 | 啪啪精品 | 91精品国产91久久综合桃花 | 伊人精品 | 欧美成人性生活 | 国产日韩欧美二区 | 中文字幕中文字幕 | 色综合久久天天综合网 | 亚洲精久| 涩涩视频网 | 欧美视频免费在线 | 青久草视频 | 久久99久久98精品免观看软件 | 日韩中文一区二区三区 | 日韩中文字幕免费在线观看 | 欧美一a一片一级一片 | 久久久免费 | 日本精品久久久久 | 日韩av在线一区 | 中文字幕日韩专区 | 99精品视频在线 | 欧美精品在线播放 | 精品国产一区二区国模嫣然 | 国产一区二区日韩 | 不卡一区二区三区四区 | 久久草在线视频 | 韩国主播午夜大尺度福利 | 国产剧情一区二区三区 |