//在指定位置开始显示一个字符串 //支持自动换行 //(x,y):起始坐标 //width,height:区域 //str :字符串 //size :字体大小 //mode:0,非叠加方式;1,叠加方式 void Show_Str(u16 x,u16 y,u16 width,u16 height,u8*str,u8 size,u8 mode) { u16 x0=x; u16 y0=y; u8 bHz=0; //字符或者中文 while(*str!=0)//数据未结束 { if(!bHz) { if(*str>0x80)bHz=1;//中文 else //字符 { if(x>(x0+width-size/2))//换行 { y+=size; x=x0; } if(y>(y0+height-size))break;//越界返回 if(*str==13)//换行符号 { y+=size; x=x0; str++; } else LCD_ShowChar(x,y,*str,size,mode);//有效部分写入 str++; x+=size/2; //字符,为全字的一半 } }else//中文 { bHz=0;//有汉字库 if(x>(x0+width-size))//换行 { y+=size; x=x0; } if(y>(y0+height-size))break;//越界返回 Show_Font(x,y,str,size,mode); //显示这个汉字,空心显示 str+=2; x+=size;//下一个汉字偏移 } } }
//在指定位置开始显示一个字符串 //支持自动换行 //(x,y):起始坐标 //str :字符串 //size :字体大小 //mode:0,非叠加方式;1,叠加方式 void Show_Str(uint8_t x,uint8_t y,uint8_t*str,uint8_t size,uint8_t mode) { uint8_t bHz=0; //字符或者中文 while(*str!=0)//数据未结束 { if(!bHz) { if(*str>0x80)bHz=1;//中文 else //字符 { if(x>(LCD_W-size/2))//换行 { y+=size; x=0; } if(y>(LCD_H-size))break;//越界返回 if(*str==13)//换行符号 { y+=size; x=0; str++; } else LCD_ShowChar1(x,y,*str,size,mode);//有效部分写入 str++; x+=size/2; //字符,为全字的一半 } }else//中文 { bHz=0;//有汉字库 if(x>(LCD_W-size))//换行 { y+=size; x=0; } if(y>(LCD_H-size))break;//越界返回 Show_Font(x,y,str,size,mode); //显示这个汉字,空心显示 str+=2; x+=size;//下一个汉字偏移 } } }
int main(void) { u32 fontcnt; u8 i,j; u8 fontx[2];//gbk码 u8 key,t; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2 delay_init(); //延时函数初始化 uart_init(9600); //串口初始化为9600 LCD_Init(); //初始化液晶 LED_Init(); //LED初始化 KEY_Init(); //按键初始化 usmart_dev.init(72); //usmart初始化 mem_init(); //初始化内存池 exfuns_init(); //为fatfs相关变量申请内存 f_mount(fs[0],"0:",1); //挂载SD卡 f_mount(fs[1],"1:",1); //挂载FLASH. while(font_init()) //检查字库 { UPD: LCD_Clear(WHITE); //清屏 POINT_COLOR=RED; //设置字体为红色 LCD_ShowString(60,50,200,16,16,"mini STM32"); while(SD_Initialize()) //检测SD卡 { LCD_ShowString(60,70,200,16,16,"SD Card Failed!"); delay_ms(200); LCD_Fill(60,70,200+60,70+16,WHITE); delay_ms(200); } LCD_ShowString(60,70,200,16,16,"SD Card OK"); LCD_ShowString(60,90,200,16,16,"Font Updating..."); key=update_font(20,110,16);//更新字库 while(key)//更新失败 { LCD_ShowString(60,110,200,16,16,"Font Update Failed!"); delay_ms(200); LCD_Fill(20,110,200+20,110+16,WHITE); delay_ms(200); } LCD_ShowString(60,110,200,16,16,"Font Update Success!"); delay_ms(1500); LCD_Clear(WHITE);//清屏 } POINT_COLOR=RED; Show_Str(60,50,200,16,"Mini STM32开发板",16,0); Show_Str(60,70,200,16,"GBK字库测试程序",16,0); Show_Str(60,90,200,16,"正点原子@ALIENTEK",16,0); Show_Str(60,110,200,16,"2014年1月3日",16,0); Show_Str(60,130,200,16,"按KEY0,更新字库",16,0); POINT_COLOR=BLUE; Show_Str(60,150,200,16,"内码高字节:",16,0); Show_Str(60,170,200,16,"内码低字节:",16,0); Show_Str(60,190,200,16,"汉字计数器:",16,0); Show_Str(60,220,200,24,"对应汉字为:",24,0); Show_Str(60,244,200,16,"对应汉字(16*16)为:",16,0); Show_Str(60,260,200,12,"对应汉字(12*12)为:",12,0); while(1) { fontcnt=0; for(i=0x81;i<0xff;i++) { fontx[0]=i; LCD_ShowNum(148,150,i,3,16); //显示内码高字节 for(j=0x40;j<0xfe;j++) { if(j==0x7f)continue; fontcnt++; LCD_ShowNum(148,170,j,3,16); //显示内码低字节 LCD_ShowNum(148,190,fontcnt,5,16);//汉字计数显示 fontx[1]=j; Show_Font(60+132,220,fontx,24,0); Show_Font(60+144,244,fontx,16,0); Show_Font(60+108,260,fontx,12,0); t=200; while(t--)//延时,同时扫描按键 { delay_ms(1); key=KEY_Scan(0); if(key==KEY0_PRES)goto UPD; } LED0=!LED0; } } } }