OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4465|回复: 6

LCD显示屏数字显示半个的疑问

[复制链接]

49

主题

148

帖子

0

精华

高级会员

Rank: 4

积分
683
金钱
683
注册时间
2017-11-23
在线时间
133 小时
发表于 2022-4-5 13:15:27 | 显示全部楼层 |阅读模式
1金钱
各位大神,我再学习STM32F407 的LCD显示,有个奇怪的问题困扰我好几天,不得解惑,特来请各位大神帮忙看看,指点指点,能帮助我走出迷宫,
在LCD屏左上角上显示变化的数值,左面是16的数值显示,右面是24的数值显示,左面显示政策,但右面的数值老师显示半个,而且好像和左面一样大小的数字,
后面附有源程序

6938bf54c5dad238673fb065d25ab4f.jpg       9542ed7f85bd529f23a6d95b805c876.jpg


TOUCH3.rar

3.42 MB, 下载次数: 1

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2022-4-5 13:15:28 | 显示全部楼层
  1. //在指定位置显示一个字符
  2. //x,y:起始坐标
  3. //num:要显示的字符:" "--->"~"
  4. //size:字体大小 12/16/24
  5. void TFT_ShowChar(u16 x,u16 y,u8 num,u8 size)
  6. {                                                            
  7.         u8 temp,t1,t;
  8.         u16 y0=y;
  9.         u8 dzk[64];
  10.         u8 csize=(size/8+((size%8)?1:0))*(size/2);                //得到字体一个字符对应点阵集所占的字节数       
  11.         if(size!=12&&size!=16&&size!=24&&size!=32)return;        //不支持的size
  12.         Get_ASCIIMat(num,dzk,size);
  13.         for(t=0;t<csize;t++)
  14.         {         
  15.                 temp=dzk[t];          
  16.                 for(t1=0;t1<8;t1++)
  17.                 {                            
  18.                         if(temp&0x80)TFT_DrawPoint_Color(x,y,BRUSH_COLOR);
  19.                         else TFT_DrawPoint_Color(x,y,BACK_COLOR);
  20.                         temp<<=1;
  21.                         y++;
  22.                         if(y>tft_dev.lcd_height)return;                //超区域了
  23.                         if((y-y0)==size)
  24.                         {
  25.                                 y=y0;
  26.                                 x++;
  27.                                 if(x>tft_dev.lcd_width)return;        //超区域了
  28.                                 break;
  29.                         }
  30.                 }           
  31.         }        
  32.   return;
  33. }
复制代码
回复

使用道具 举报

49

主题

148

帖子

0

精华

高级会员

Rank: 4

积分
683
金钱
683
注册时间
2017-11-23
在线时间
133 小时
 楼主| 发表于 2022-4-5 13:46:12 | 显示全部楼层
后来,在子程序增加了2行,依然不行,而且显示乱码了void LCD_ShowChar(u16 x,u16 y,u16 fc, u16 bc, u8 num,u8 size,u8 mode)
{  
   u8 temp,t,t1;        u16 colortemp=POINT_COLOR;      
                  
        num=num-' ';//得到偏移后的值
        LCD_SetWindows(x,y,x+size/2-1,y+size-1);//设置单个文字显示窗口
        if(!mode) //非叠加方式
        {               
                for(t=0;t<size;t++)
                {
                        if(size==12)temp=asc2_1206[num][t];//调用1206字体
                        //else temp=asc2_1608[num][t];                 //调用1608字体
                        else if(size==16)temp=asc2_1608[num][t];        //调用1608字体
                        else if(size==24)temp=asc2_2412[num][t];        //调用2412字体
                        else temp=asc2_1608[num][t];                 //其它的调用1608字体
                  //else return;                                                                //没有的字库
                        for(t1=0;t1<size/2;t1++)

aee61fce239a067bc873a9481824f97.jpg
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2022-4-5 18:55:22 | 显示全部楼层
  1. //在指定位置开始显示一个字符串            
  2. //支持自动换行
  3. //(x,y):起始坐标
  4. //width,height:区域
  5. //str  :字符串
  6. //size :字体大小
  7. //mode:0,正常显示,1,反色显示                                
  8. void TFT_Show_Str(u16 x,u16 y,u16 width,u16 height,u8 size,u8 mode,u8*str)
  9. {                                       
  10.         u16 x0=x;
  11.         u16 y0=y;                                                                    
  12.         if(mode==1)
  13.         TFT_Change_Back_Brush_Color();                                                                                   
  14.         while(*str!=0)//数据未结束
  15.         {
  16.                 if((*str)<=0x80)//字符
  17.                 {   
  18.                         if(x>(x0+width-size/2))//换行
  19.                         {                                  
  20.                                         y+=size;
  21.                                         x=x0;          
  22.                         }                                                            
  23.                         if(y>(y0+height-size))break;//越界返回      
  24.                         if(*str==13)//换行符号
  25.                         {         
  26.                                 y+=size;
  27.                                 x=x0;
  28.                                 str++;
  29.                         }  
  30.                         else TFT_ShowChar(x,y,*str,size);//有效部分写入
  31.                         str++;
  32.                         x+=size/2; //字符,为全字的一半
  33.                 }

  34.                 if(*str>0x80) //中文  
  35.                 {
  36. #if  (Font_Weizhi!=0)//#if    (SET_W25Qxx==0&&SET_SD==0)                                        
  37.                         if(x>(x0+width-size))//换行
  38.                         {            
  39.                                 y+=size;
  40.                                 x=x0;                  
  41.                         }
  42.                         if(y>(y0+height-size))break;//越界返回                                                       
  43.                         TFT_Show_Font(x,y,str,size); //显示这个汉字,空心显示
  44.                         x+=size;//下一个汉字偏移            
  45. #endif
  46.                         str+=2;                                                               
  47.         }                                               
  48.         }
  49.         if(mode==1)
  50.                 TFT_Change_Back_Brush_Color();
  51. }

  52. //在指定位置开始显示一个字符串            
  53. //支持自动换行
  54. //(x,y):起始坐标
  55. //width,height:区域
  56. //str  :字符串
  57. //size :字体大小
  58. //mode:0,正常显示,1,反色显示                                
  59. void TFT_Printf(u16 x,u16 y,u16 width,u16 height,u8 size,u8 mode,char *fmt, ...)
  60. {
  61.         u8 temp[100];
  62.         va_list arg_ptr;
  63.         va_start(arg_ptr, fmt);
  64.         vsnprintf((char *)temp, 100+1, fmt, arg_ptr);
  65.         va_end(arg_ptr);
  66.         TFT_Show_Str(x,y,width,height,size,mode,temp);
  67. }
复制代码
回复

使用道具 举报

49

主题

148

帖子

0

精华

高级会员

Rank: 4

积分
683
金钱
683
注册时间
2017-11-23
在线时间
133 小时
 楼主| 发表于 2022-4-5 19:29:28 | 显示全部楼层
感谢大神的指点,但大神说的这个例子是原子大神的例子,他们用的是SD卡,W25Qxx等存储芯片做的,
我这使用的是直接在芯片存储区自制几个汉字库做的,跟原子大神的很不一样,
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2022-4-6 11:41:47 | 显示全部楼层
温柔的郎 发表于 2022-4-5 19:29
感谢大神的指点,但大神说的这个例子是原子大神的例子,他们用的是SD卡,W25Qxx等存储芯片做的,
我这使用 ...

都一样的  给上次的汉字的例子一样 想办法把字库传入到u8 dzk[64];  就行了
回复

使用道具 举报

49

主题

148

帖子

0

精华

高级会员

Rank: 4

积分
683
金钱
683
注册时间
2017-11-23
在线时间
133 小时
 楼主| 发表于 2022-4-6 19:08:07 | 显示全部楼层
感谢大神指点,我的C语言水平在这呢,半路入这行的,啥基础都没有,遇见啥学啥,单独简单的功能修改还可以应付,复杂点的,多出联动的功能,就不行了,
还得继续修炼啊!!!
向大神学习,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 23:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表