想在LCD上显示较大的数字,这个函数应怎么修改才行?

2019-07-21 06:05发布

本帖最后由 rjx007 于 2018-2-10 13:04 编辑

想在LCD上显示尺寸较大的数字,但经试验,这个函数最大只能显示24*12的数字,现在想显示如48*24,64*32的数字,该怎么修改这个函数才能行?或能提供一个能显示大字符的函数也可。


//显示数字,高位为0,则不显示
//x,y :起点坐标         
//len :数字的位数
//size:字体大小
//color:颜 {MOD}
//num:数值(0~4294967295);         
void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size)
{                 
        u8 t,temp;
        u8 enshow=0;                                                   
        for(t=0;t<len;t++)
        {
                temp=(num/LCD_Pow(10,len-t-1))%10;
                if(enshow==0&&t<(len-1))
                {
                        if(temp==0)
                        {
                                LCD_ShowChar(x+(size/2)*t,y,' ',size,0);
                                continue;
                        }else enshow=1;
                          
                }
                 LCD_ShowChar(x+(size/2)*t,y,temp+'0',size,0);
        }
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
a496298685
1楼-- · 2019-07-22 03:45
rjx007 发表于 2018-2-9 16:22
LCD_ShowChar这个函数我也试了,最大也是只能显示24x12的数字,我自己取模分别做了几个0~9这十个数字的32x1 ...

我的意思是,修改LCD_ShowChar使他能够正确显示大尺寸的字符。
由于不知道你的代码是怎样的思路,所以,,
请自行努力。
czhaii
2楼-- · 2019-07-22 08:41

给你一个写汉字过程自己分析

/***写汉字 同步显示0-32字节写过程程序测试***/
/***2018 1 28 21:15 L217 CODE 220340*********/
                      #include <stm32f10x_lib.h>
                          #include "sys.h"  
                          #include "stdio.h"
                          #include "usart.h"               
                          #include "delay.h"       
                          #include "led.h"
                          #include "flash.h"
                            #include "lcd.h"          
                          #include "text.h"
                          #include "fat.h"
                          #include "fontupd.h"
                          #include "mmc_sd.h"
                          const unsigned char Hz1[32]=   
                     {
                      0x10,0x00,0x10,0x00,0x3D,0xFC,0x20,0x20,
                      0x40,0x20,0xBC,0x20,0x10,0x20,0x10,0x20,
              0xFD,0xFC,0x10,0x20,0x10,0x28,0x10,0x24,
                      0x14,0x24,0x18,0x20,0x13,0xFE,0x00,0x00
                          };/*"钰"*/
                  const unsigned char Hz2[32]=
                      {
                          0X01,0XFF,0X01,0XFF,0X01,0XFF,0X01,0XFF,
                      0X01,0XFF,0X01,0XFF,0X01,0XFF,0X01,0XFF,
                      0X01,0XFF,0X01,0XFF,0X01,0XFF,0X01,0XFF,
                      0X01,0XFF,0X01,0XFF,0X01,0XFF,0X01,0XFF
                      };/*"竖条"*/
                      const unsigned char Hz3[32]=       
                      {
                      0X00,0X01,0X00,0X03,0X00,0X07,0X00,0X0F,
                      0X00,0X1F,0X00,0X3F,0X00,0X7F,0X00,0XFF,
                      0X01,0XFF,0X03,0XFF,0X07,0XFF,0X0F,0XFF,
                      0X1F,0XFF,0X3F,0XFF,0X7F,0XFF,0XFF,0XFF
                       };/*三角形*/
                      const u8 disdt[]={48,49,50,51,52,53,54,55,56,57};
/**************写汉字字节数显示*********/
              void  dispvavel(u8 vel)
                      {
                      u8        l,m,n;
                  l=vel/100;
                      m=(vel-l*100)/10;
                         n=vel-l*100-m*10;
                      POINT_COLOR=RED;//设置字体为红 {MOD}
                      LCD_ShowChar(10,32,disdt[l],16,0); //10横向 90纵向disdt[]
                         POINT_COLOR=BLUE;//设置字体为蓝 {MOD}
                      LCD_ShowChar(18,32,disdt[m],16,0); //18横向 90纵向disdt[]
                      POINT_COLOR=BROWN;//设置字体为棕 {MOD}
                      LCD_ShowChar(26,32,disdt[n],16,0); //26横向 90纵向disdt[]
                  }        
/**************写一个“沁”字***********Hz1************/
              void LcdShowHz1(u16 x,u16 y)
                      {
                      u8 temp,t1,t,k;                         //数据缓冲 一个字节循环 汉字字节总数
                      u8 x0,s=0;                             //数据缓冲 一个字节循环 汉字字节总数
                       for(t=0;t<16;t++)                 //共16个字节
                       {
                       x0=x;                                                         //汉字左边缘等于实参
                        for(k=0;k<2;k++)                                   //两行等于两字节,左右结构
                        {
                        dispvavel(s);                                         //临时函数,写汉字字节显示
                        temp=Hz1[s];                                         //取字符表代码
                         for(t1=0;t1<8;t1++)             //一个字节左移8次 读每移动一次后0或1
                         {
                          if(temp&0x80)
                              {
                              LCD_DrawPoint(x0,y);           //如为1在XY地址写显示
                              }
                             temp<<=1;                       //左移一位
                         x0++;                           //水平位置加1共0--15计16个点
                         }
                         s++;                                                          // 写完1字节八个点 字符表位置加1
                         delay_ms(600);
                        }
                       y++;                                                             //两个字节换一行
               }
                      }               
/**************画一个竖条 左部00H 右部FFH***Hz2*************/
                  void LcdShowHz2(u16 x,u16 y)
                      {
                      u8 temp,t1,t,k;                         //数据缓冲 一个字节循环 汉字字节总数
                      u8 x0,s=0;                             //数据缓冲 一个字节循环 汉字字节总数
                       for(t=0;t<16;t++)                 //共16个字节
                       {
                       x0=x;                                                     //汉字左边缘等于实参
                        for(k=0;k<2;k++)                               //两行等于两字节,左右结构
                        {
                        dispvavel(s);                                     //临时函数,写汉字字节显示
                        temp=Hz2[s];                                     //取字符表代码
                         for(t1=0;t1<8;t1++)             //一个字节左移8次 读每移动一次后0或1
                         {
                          if(temp&0x80)
                              {
                              LCD_DrawPoint(x0,y);           //如为1在XY地址写显示
                              }
                             temp<<=1;                       //左移一位
                         x0++;                           //水平位置加1共0--15计16个点
                         }
                         s++;                                                      // 写完1字节八个点 字符表位置加1
                         delay_ms(600);
                         }
                        y++;                                                     //两个字节换一行
               }
                      }               
/***************画一个三角形****Hz3******************/
                  void LcdShowHz3(u16 x,u16 y)
                      {
                       u8 temp,t1,t,k;                         //数据缓冲 一个字节循环 汉字字节总数
                      u8 x0,s=0;                             //数据缓冲 一个字节循环 汉字字节总数
                       for(t=0;t<16;t++)                 //共16个字节
                       {
                       x0=x;                                                 //汉字左边缘等于实参
                        for(k=0;k<2;k++)                               //两行等于两字节,左右结构
                        {
                        dispvavel(s);                                     //临时函数,写汉字字节显示
                        temp=Hz3[s];                                     //取字符表代码
                         for(t1=0;t1<8;t1++)             //一个字节左移8次 读每移动一次后0或1
                         {
                          if(temp&0x80)
                              {
                              LCD_DrawPoint(x0,y);           //如为1在XY地址写显示
                              }
                             temp<<=1;                       //左移一位
                         x0++;                           //水平位置加1共0--15计16个点
                         }
                         s++;                                                  // 写完1字节八个点 字符表位置加1
                         delay_ms(600);
                         }
                        y++;                                                     //两个字节换一行
               }
                      }               
/*************************************/
                      int main(void)
                      {                 
                           u8 i;
                             Stm32_Clock_Init(9);              //系统时钟设置
                           delay_init(72);                             //延时初始化
                           uart_init(72,9600);               //串口1初始化            
                           LCD_Init();                                     //初始化液晶                  
                              LED_Init();                       //LED初始化       
                           SPI_Flash_Init();                     //SPI FLASH初始化
                    if(Font_Init())                  //字库不存在,则更新字库
                    {       
                POINT_COLOR=RED;      
                    LCD_Clear(WHITE);
                    LCD_ShowString(60,50,"Mini STM32");       
                    LCD_ShowString(60,70,"Font Updating...");                   
//字体更新
                    SD_Initialize();                        //初始化SD卡                                               
                     while(FAT_Init())                        //FAT 错误
                     {
                              LCD_ShowString(60,90,"FAT SYS ERROR");  
                              i=SD_Initialize();
                             if(i)//SD卡初始化
                             {                                                  
                                 LCD_ShowString(60,110,"SD_CARD ERROR");
                             }          
                             delay_ms(500);
                             LCD_Fill(60,90,240,126,WHITE);//清除显示                          
                             delay_ms(500);
                             LED0=!LED0;          
                         }         
                        LCD_Fill(60,90,240,126,WHITE);//清除显示                          
                         while(Update_Font()!=0)//字体更新出错
                        {                                                  
                             LCD_ShowString(60,90,"SYSTEM FILE LOST");                  
                             delay_ms(500);   
                             LCD_ShowString(60,90,"Please Check....");
                             delay_ms(500);   
                             LED0=!LED0;       
                        };                         
                        LCD_Clear(WHITE);
                   }  
                       while(1)
                           {       
                           POINT_COLOR=BLUE;     
                            Show_Str(60,50,"2016 10 5",16,0);                                             
                           Show_Str(10,70,"蔡沁钰 常州市北实验中学",16,0);                                             
                           Show_Str(60,90,"八(8)班",16,0);
                           delay_ms(5000);
                           delay_ms(5000);
                           LCD_Clear(WHITE);                                 //清除显示       
                           delay_ms(5000);                                     
                       POINT_COLOR=RED;  
                           Show_Str(60,32,"1",16,0);         //1
                           LcdShowHz1(00,00);                                 //画横线         已实现
                            for(i=0;i<20;i++)                                  
                            {
                               delay_ms(200);
                            LED0=!LED0;
                            LED1=!LED1;
                            }                        
                            LCD_Clear(WHITE);                                 //清除显示
                            for(i=0;i<50;i++)                                 //已实现
                            {
                            delay_ms(20);
                            LED1=!LED1;
                            }
                                Show_Str(60,32,"2",16,0);        //2
                              LcdShowHz2(00,00);                                 //画横线         已实现
                            for(i=0;i<20;i++)                                  
                            {
                            delay_ms(200);
                            LED0=!LED0;
                            LED1=!LED1;
                            }                        
                            LCD_Clear(WHITE);                                 //清除显示
                            Show_Str(60,32,"3",16,0);        //3
                            LcdShowHz3(00,00);                                 //画横线         已实现
                            for(i=0;i<20;i++)                                  
                            {
                            delay_ms(200);
                            LED0=!LED0;
                            LED1=!LED1;
                            }                                                          
                           }
                      }
a496298685
3楼-- · 2019-07-22 11:28
czhaii 发表于 2018-2-9 18:46
给你一个写汉字过程自己分析

/***写汉字 同步显示0-32字节写过程程序测试***/

你有毒吧。。。

你倒是显示个大的呀,你这不也是小的吗。才16x16的。。。然后你那个钰呀沁呀的是女朋友名字吧hhhhh
czhaii
4楼-- · 2019-07-22 17:21
a496298685 发表于 2018-2-9 20:25
你有毒吧。。。

你倒是显示个大的呀,你这不也是小的吗。才16x16的。。。然后你那个钰呀沁呀的是女朋 ...

自己动一点点脑子很难么?
backup2k
5楼-- · 2019-07-22 21:55
 精彩回答 2  元偷偷看……
backup2k
6楼-- · 2019-07-22 22:45
电脑上有任意点阵字符生成软件。原子哥的光盘里应该有!

一周热门 更多>