|
can 收發數據
0.png (30.45 KB, 下載次數: 54)
下載附件
2016-4-20 15:30 上傳
以上壓縮包的所有內容可以到本帖最后下載附件
部分例程源碼預覽:
- #include "fontupd.h"
- #include "sys.h"
- #include "fat.h"
- #include "flash.h"
- #include "usart.h"
- #include "delay.h"
- #include "lcd.h"
- #include "ad.h"
- //////////////////////////////////////////////////////////////////////////////////
- //本程序只供學習使用,未經作者許可,不得用于其它任何用途
- //中文漢字支持程序 驅動代碼
- //本程序只供學習使用,未經作者許可,不得用于其它任何用途
- //LX-1A開發板
- //青島智芯科技
- //電話:13012418100
- //修改日期:2018/10/28
- //版權所有,盜版必究。
- //////////////////////////////////////////////////////////////////////////////////
-
- //以下下字段一定不要亂改!!!
- //字節0~3, 記錄UNI2GBKADDR;字節4~7 ,記錄UNI2GBKADDR的大小
- //字節8~11, 記錄FONT16ADDR ;字節12~15,記錄FONT16ADDR的大小
- //字節16~19,記錄FONT12ADDR ;字節20~23,記錄FONT12ADDR的大小
- //字節24,用來存放字庫是否存在的標志位,0XAA,表示存在字庫;其他值,表示字庫不存在!
- //系統文件夾
- const unsigned char *folder[2]=
- {
- "SYSTEM",
- "FONT",
- };
- //系統文件定義
- const unsigned char *sysfile[3]=
- {
- "GBK16.FON",
- "GBK24.FON",
- "UNI2GBK.SYS",
- };
- //字節0~3, 記錄UNI2GBKADDR;字節4~7 ,記錄UNI2GBKADDR的大小
- //字節8~11, 記錄FONT16ADDR ;字節12~15,記錄FONT16ADDR的大小
- //字節16~19,記錄FONT12ADDR ;字節20~23,記錄FONT12ADDR的大小
- //字體存放,從100K處開始
- //100K,存放UNICODE2GBK的轉換碼
- u32 FONT16ADDR ;//16字體存放的地址
- u32 FONT24ADDR ;//24字體存放的地址
- u32 UNI2GBKADDR;//UNICODE TO GBK 表存放地址
- //更新字體文件
- //返回值:0,更新成功;
- // 其他,錯誤代碼.
- //正點原子@ALIENTEK
- //V1.1
- #ifdef EN_UPDATE_FONT
- u8 temp[512]; //零時空間
- u8 Update_Font(void)
- {
- u32 fcluster=0;
- u32 i;
- //u8 temp[512]; //零時空間 在這里定義,會內存溢出
- u32 tempsys[2]; //臨時記錄文件起始位置和文件大小
- float prog;
- u8 t;
- FileInfoStruct FileTemp;//零時文件夾
- //得到根目錄的簇號
- if(FAT32_Enable)fcluster=FirstDirClust;
- else fcluster=0;
- FileTemp=F_Search(fcluster,(unsigned char *)folder[0],T_FILE);//查找system文件夾
- if(FileTemp.F_StartCluster==0)return 1; //系統文件夾丟失
- {
- //先查找字體
- FileTemp=F_Search(FileTemp.F_StartCluster,(unsigned char *)folder[1],T_FILE);//在system文件夾下查找FONT文件夾
- if(FileTemp.F_StartCluster==0)return 2;//字體文件夾丟失
- fcluster=FileTemp.F_StartCluster; //字體文件夾簇號
- FileTemp=F_Search(fcluster,(unsigned char *)sysfile[2],T_SYS);//在system文件夾下查找SYS文件
- if(FileTemp.F_StartCluster==0)return 3;//FONT12字體文件丟失
- //LCD_ShowString(20,90,"Write UNI2GBK to FLASH...");
- //LCD_ShowString(108,110,"%");
- F_Open(&FileTemp);//打開該文件
- i=0;
- while(F_Read(&FileTemp,temp))//成功讀出512個字節
- {
- if(i<FileTemp.F_Size)//不超過文件大小
- {
- SPI_Flash_Write(temp,i+100000,512);//從100K字節處開始寫入512個數據
- i+=512;//增加512個字節
- }
- prog=(float)i/FileTemp.F_Size;
- prog*=100;
- if(t!=prog)
- {
- t=prog;
- if(t>100)t=100;
- //LCD_ShowNum(84,110,t,3,16);//顯示數值
- }
- }
- UNI2GBKADDR=100000;//UNI2GBKADDR從100K處開始寫入.
- tempsys[0]=UNI2GBKADDR;
- tempsys[1]=FileTemp.F_Size; //UNI2GBKADDR 大小
- SPI_Flash_Write((u8*)tempsys,0,8);//記錄在地址0~7處
- delay_ms(1000);
- //printf("UNI2GBK寫入FLASH完畢!\n");
- //printf("寫入數據長度:%d\n",FileTemp.F_Size);
- //printf("UNI2GBKSADDR:%d\n\n",UNI2GBKADDR);
-
- FONT16ADDR=FileTemp.F_Size+UNI2GBKADDR;//F16的首地址
- FileTemp=F_Search(fcluster,(unsigned char *)sysfile[0],T_FON);//在system文件夾下查找FONT16字體文件
- if(FileTemp.F_StartCluster==0)return 4;//FONT16字體文件丟失
-
- //LCD_ShowString(20,90,"Write FONT16 to FLASH... ");
- //printf("開始FONT16寫入FLASH...\n");
- F_Open(&FileTemp);//打開該文件
- i=0;
- while(F_Read(&FileTemp,temp))//成功讀出512個字節
- {
- if(i<FileTemp.F_Size)//不超過文件大小
- {
- SPI_Flash_Write(temp,i+FONT16ADDR,512);//從0開始寫入512個數據
- i+=512;//增加512個字節
- }
- prog=(float)i/FileTemp.F_Size;
- prog*=100;
- if(t!=prog)
- {
- t=prog;
- if(t>100)t=100;
- //LCD_ShowNum(84,110,t,3,16);//顯示數值
- }
- }
- tempsys[0]=FONT16ADDR;
- tempsys[1]=FileTemp.F_Size; //FONT16ADDR 大小
- SPI_Flash_Write((u8*)tempsys,8,8);//記錄在地址8~15處
-
- delay_ms(1000);
- //printf("FONT16寫入FLASH完畢!\n");
- //printf("寫入數據長度:%d\n",FileTemp.F_Size);
- FONT24ADDR=FileTemp.F_Size+FONT16ADDR;//F16的首地址
- //printf("FONT16SADDR:%d\n\n",FONT16ADDR);
- //LCD_ShowString(20,60,"Write FONT12 to FLASH... ");
- //FONT12暫時不加入
-
- FileTemp=F_Search(fcluster,(unsigned char *)sysfile[1],T_FON);//在system文件夾下查找FONT12字體文件
- if(FileTemp.F_StartCluster==0)return 5;//FONT12字體文件丟失
- //printf("開始FONT12寫入FLASH...\n");
- F_Open(&FileTemp);//打開該文件
- i=0;
- while(F_Read(&FileTemp,temp))//成功讀出512個字節
- {
- if(i<FileTemp.F_Size)//不超過文件大小
- {
- SPI_Flash_Write(temp,i+FONT24ADDR,512);//從0開始寫入512個數據
- i+=512;//增加512個字節
- }
- prog=(float)i/FileTemp.F_Size;
- prog*=100;
- if(t!=prog)
- {
- t=prog;
- if(t>100)t=100;
- //LCD_ShowNum(84,80,t,3,16);//顯示數值
- }
- }
- tempsys[0]=FONT24ADDR;
- tempsys[1]=FileTemp.F_Size; //FONT16ADDR 大小
- SPI_Flash_Write((u8*)tempsys,16,8);//記錄在地址16~23處
- //printf("FONT12寫入FLASH完畢!\n");
- // printf("寫入數據長度:%d\n",FileTemp.F_Size);
- // printf("FONT12SADDR:%d\n\n",FONT12ADDR); */
- }
- t=0XAA;
- SPI_Flash_Write(&t,24,1);//寫入字庫存在標志 0XAA
- //LCD_ShowString(20,90," Font Update Successed ");
- delay_ms(1000);
- delay_ms(1000);
- return 0;//成功
- }
- #endif
- //用這個函數得到字體地址
- //在系統使用漢字支持之前,必須調用該函數
- //包括FONT16ADDR,FONT12ADDR,UNI2GBKADDR;
- u8 Font_Init(void)
- {
- u32 tempsys[2];//臨時記錄文件起始位置和文件大小
- u8 fontok=0;
- SPI_Flash_Read(&fontok,24,1);//讀出字庫標志位,看是否存在字庫
- if(fontok!=0XAA)return 1;
- SPI_Flash_Read((u8*)tempsys,0,8);//讀出8個字節
- UNI2GBKADDR=tempsys[0];
- //printf("tempsysgbk[0]:%d\n",tempsys[0]);
- //printf("tempsysgbk[1]:%d\n",tempsys[1]);
- SPI_Flash_Read((u8*)tempsys,8,8);//讀出8個字節
- //printf("tempsysf16[0]:%d\n",tempsys[0]);
- //printf("tempsysf16[1]:%d\n",tempsys[1]);
- FONT16ADDR=tempsys[0];
-
- SPI_Flash_Read((u8*)tempsys,16,8);//讀出8個字節
- //printf("tempsysf12[0]:%d\n",tempsys[0]);
- //printf("tempsysf12[1]:%d\n",tempsys[1]);
- FONT24ADDR=tempsys[0];
- return 0;
- }
復制代碼- #include "flash.h"
- #include "lcd.h"
- #include "text.h"
- #include "gui.h"
- //code 字符指針開始
- //從字庫中查找出字模
- //code 字符串的開始地址,ascii碼
- //mat 數據存放地址 size*2 bytes大小
- u32 FONT16ADDR ;//16字體存放的地址
- u32 FONT24ADDR ;//24字體存放的地址
- u32 UNI2GBKADDR;//UNICODE TO GBK 表存放地址
- void Get_HzMat(unsigned char *code,unsigned char *mat,u8 size)
- {
- unsigned char qh,ql;
- unsigned char i;
- unsigned long foffset;
- qh=*code;
- ql=*(++code);
- if(qh<0x81||ql<0x40||ql==0xff||qh==0xff)//非 常用漢字
- {
- for(i=0;i<(size*2);i++)*mat++=0x00;//填充滿格
- return; //結束訪問
- }
- if(ql<0x7f)ql-=0x40;//注意!
- else ql-=0x41;
- qh-=0x81;
- foffset=((unsigned long)190*qh+ql)*(size*2);//得到字庫中的字節偏移量
- Flash_Read(mat,foffset+FONT16ADDR,32);
-
- }
- //顯示一個指定大小的漢字
- //x,y :漢字的坐標
- //font:漢字GBK碼
- //size:字體大小
- //mode:0,正常顯示,1,疊加顯示
- void Show_Font(u16 x,u16 y,u8 *font,u16 charColor,u8 size,u8 mode,u8 DispDirec)
- {
- u16 temp,t,t1;
- u16 y0=y;
- u8 dzk[32];
- u16 tempcolor;
- Get_HzMat(font,dzk,size);//得到相應大小的點陣數據
- if(mode==0)//正常顯示
- {
- for(t=0;t<size*2;t++)
- {
- temp=dzk[t];//得到12數據
- for(t1=0;t1<8;t1++)
- {
- if(temp&0x80)LCD_DrawPoint(x,y,charColor,DispDirec);
- else
- {
- tempcolor=POINTLCD_COLOR;
- LCD_DrawPoint(x,y,tempcolor,DispDirec);
- POINTLCD_COLOR=tempcolor;//還原
- }
- temp<<=1;
- y++;
- if((y-y0)==size)
- {
- y=y0;
- x++;
- break;
- }
- }
- }
- }else//疊加顯示
- {
- for(t=0;t<size*2;t++)
- {
- temp=dzk[t];//得到12數據
- for(t1=0;t1<8;t1++)
- {
- if(temp&0x80)LCD_DrawPoint(x,y,charColor,DispDirec);
- temp<<=1;
- y++;
- if((y-y0)==size)
- {
- y=y0;
- x++;
- break;
- }
- }
- }
- }
- }
-
-
- u16 my_strlen(u8*str)
- {
- u16 len=0;
- while(*str!='\0')
- {
- str++;
- len++;
- }
- return len;
- }
- void my_stradd(u8*str1,u8*str2)
- {
- while(*str1!='\0')str1++;
- while(*str2!='\0')
- {
- *str1=*str2;
- str2++;
- str1++;
- }
- *str1='\0';//加入結束符
- }
-
- void Get_HzMat24(u8 *code,unsigned char *mat)
- {
- unsigned char qh,ql;
- //unsigned char i;
- unsigned long foffset;
- qh=*code;
- ql=*(++code);
-
- qh-=0xa0;
- ql-=0xa0;
- foffset=((unsigned long)94*(qh-1)+(ql-1))*72;
- Flash_Read(mat,foffset+FONT24ADDR,72);
-
- }
-
-
- void LCD_ShowString24(u16 x,u16 y,u8 *font,u16 charColor,u8 mode,u8 DispDirec)
- {
- u8 temp,t,t1;
- u16 y0=y;
- u8 dzk[36];
- u16 tempcolor;
- Get_HzMatsting24(font,dzk);//得到相應大小的點陣數據
- if(mode==0)//正常顯示
- {
- for(t=0;t<36;t++)
- {
- temp=dzk[t];
- for(t1=0;t1<8;t1++)
- {
- if(temp&0x80)LCD_DrawPoint(x,y,charColor,DispDirec);
- else
- {
- tempcolor=POINTLCD_COLOR;
- LCD_DrawPoint(x,y,tempcolor,DispDirec);
- POINTLCD_COLOR=tempcolor;//還原
- }
- temp<<=1;
- y++;
- if((y-y0)==24)
- {
- y=y0;
- x++;
- break;
- }
- }
- }
- }else//疊加顯示
- {
- for(t=0;t<36;t++)
- {
- temp=dzk[t];//得到12數據
- for(t1=0;t1<8;t1++)
- {
- if(temp&0x80)LCD_DrawPoint(x,y,charColor,DispDirec);
- temp<<=1;
- y++;
- if((y-y0)==24)
- {
- y=y0;
- x++;
- break;
- }
- }
- }
- }
- }
- void Get_HzMatsting24(unsigned char *code,unsigned char *mat)
- {
- unsigned char qh;
- unsigned long foffset;
- qh=*code;
- qh=qh-' ';
- foffset=(unsigned long)qh*36;
- Flash_Read(mat,foffset+2030000,36);
- }
- u8 Font_Init(void)
- {
- u32 tempsys[2];//臨時記錄文件起始位置和文件大小
- u8 fontok=0;
- Flash_Read(&fontok,24,1);//讀出字庫標志位,看是否存在字庫
- if(fontok!=0XAA)return 1;
- Flash_Read((u8*)tempsys,0,8);//讀出8個字節
- UNI2GBKADDR=tempsys[0];
- //printf("tempsysgbk[0]:%d\n",tempsys[0]);
- //printf("tempsysgbk[1]:%d\n",tempsys[1]);
- Flash_Read((u8*)tempsys,8,8);//讀出8個字節
- //printf("tempsysf16[0]:%d\n",tempsys[0]);
- //printf("tempsysf16[1]:%d\n",tempsys[1]);
- FONT16ADDR=tempsys[0];
-
- Flash_Read((u8*)tempsys,16,8);//讀出8個字節
- //printf("tempsysf12[0]:%d\n",tempsys[0]);
- //printf("tempsysf12[1]:%d\n",tempsys[1]);
- FONT24ADDR=tempsys[0];
- return 0;
- }
復制代碼
|
-
-
can收發程序 - 備份.zip
2016-4-20 13:42 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
19.01 MB, 下載次數: 67, 下載積分: 黑幣 -5
can收發數據
評分
-
查看全部評分
|