找回密码
 立即注册
楼主: 浦江一水

SPI-TFT(240x240)彩屏@屠龙刀-32G12K128 驱动 | TFT取代OLED12864,ST7789

[复制链接]
  • 打卡等级:常住居民I
  • 打卡总天数:73
  • 最近打卡:2025-11-04 09:07:32

17

主题

38

回帖

497

积分

中级会员

积分
497
发表于 2025-10-6 15:08:44 | 显示全部楼层
你好版主,又要麻烦你了根据你的函数我照猫画虎显示大数字函数128*64,背景色时80透明不能正常显示,你帮我看看怎么改合适
///*===================================================================================================
//** 在单色LCD液晶显示屏显示128*64点阵数字串函数
//** 调用参数: X列Y行坐标, * str串指针, Fcolor字前景色,Bcolor字背景色,约定:色号80为透明,Len指定长度
//=====================================================================================================*/
void LCD_A128(u16 X,u16 Y, char *str,u8 Fcolor,u8 Bcolor,u8 Len)/* X(0-319) Y(0-479) */
{  
  u8 m,n,C,ZM[8];
  u16 i,j,L,Lw=0;
  L=Len;                             //strlen(str);
  for(j=0;j<L;j++)
  {
                C=str[j];                        /* 逐个显示字符串 */
    for(i=0;i<128;i++)  /* 写24行 */
    {
                        ZM[0]=ASC128[C-48][i*8];    /* 取字模码1 */
                        ZM[1]=ASC128[C-48][i*8+1];  /* 取字模码2 */
                        ZM[2]=ASC128[C-48][i*8+2];  /* 取字模码3 */
                        ZM[3]=ASC128[C-48][i*8+3];  /* 取字模码4 */
                        ZM[4]=ASC128[C-48][i*8+4];  /* 取字模码4 */
                        ZM[5]=ASC128[C-48][i*8+5];  /* 取字模码4 */
                        ZM[6]=ASC128[C-48][i*8+6];  /* 取字模码4 */
                        ZM[7]=ASC128[C-48][i*8+7];  /* 取字模码4 */
                                
                        LCD_MoveTo(X+Lw,Y+i);          /* 定位左上角 */
                        for(m=0;m<8;m++)
                                {        
                                        for(n=0;n<8;n++)
                                        {
                                                if((ZM[m] & 0x80)==0x80)
                                                        LCD_DATA(COLOR[Fcolor]);/* 字模点为1显示前景色 */
                                                else                                           /* 字模点为0显示原底色或背景色 */
                                                { if(Bcolor==80)  LCD_MoveTo(X+Lw+j*64+m*8+n,Y+i);   /* 透明显示模式: 仅地址+1定位 */
                                                         else LCD_DATA(COLOR[Bcolor]);               /* 正常显示模式:背景色 */
                                                }
                                                ZM[m]<<=1;
                                        }
                                }/* 水平16点显示完毕 */
    } Lw=Lw+64; /* 水平坐标位移 */
  }             /* 一位数字显示完毕  */
}

回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:73
  • 最近打卡:2025-11-04 09:07:32

17

主题

38

回帖

497

积分

中级会员

积分
497
发表于 2025-10-6 15:36:46 | 显示全部楼层
你好版主,我刚才发了一遍,没看见在哪里,再发一遍吧,我按你的函数照猫画虎写了一个显示128*64大的数字,其他都正常,只是背景是透明色不能正常显示,想了很长时间不知道怎么改,麻烦给我看看

程序如下;

///*===================================================================================================
//** 在单色LCD液晶显示屏显示128*64点阵数字串函数
//** 调用参数: X列Y行坐标, * str串指针, Fcolor字前景色,Bcolor字背景色,约定:色号80为透明,Len指定长度
//=====================================================================================================*/
void LCD_A128(u16 X,u16 Y, char *str,u8 Fcolor,u8 Bcolor,u8 Len)/* X(0-319) Y(0-479) */
{  
  u8 m,n,C,ZM[8];
  u16 i,j,L,Lw=0;
  L=Len;                             //strlen(str);
  for(j=0;j<L;j++)
  {
                C=str[j];                        /* 逐个显示字符串 */
    for(i=0;i<128;i++)  /* 写24行 */
    {
                        ZM[0]=ASC128[C-48][i*8];    /* 取字模码1 */
                        ZM[1]=ASC128[C-48][i*8+1];  /* 取字模码2 */
                        ZM[2]=ASC128[C-48][i*8+2];  /* 取字模码3 */
                        ZM[3]=ASC128[C-48][i*8+3];  /* 取字模码4 */
                        ZM[4]=ASC128[C-48][i*8+4];  /* 取字模码4 */
                        ZM[5]=ASC128[C-48][i*8+5];  /* 取字模码4 */
                        ZM[6]=ASC128[C-48][i*8+6];  /* 取字模码4 */
                        ZM[7]=ASC128[C-48][i*8+7];  /* 取字模码4 */
                                
                        LCD_MoveTo(X+Lw,Y+i);          /* 定位左上角 */
                        for(m=0;m<8;m++)
                                {        
                                        for(n=0;n<8;n++)
                                        {
                                                if((ZM[m] & 0x80)==0x80)
                                                        LCD_DATA(COLOR[Fcolor]);/* 字模点为1显示前景色 */
                                                else                                           /* 字模点为0显示原底色或背景色 */
                                                { if(Bcolor==80)  LCD_MoveTo(X+Lw+j*64+m*8+n,Y+i);   /* 透明显示模式: 仅地址+1定位 */
                                                         else LCD_DATA(COLOR[Bcolor]);               /* 正常显示模式:背景色 */
                                                }
                                                ZM[m]<<=1;
                                        }
                                }/* 水平16点显示完毕 */
    } Lw=Lw+64; /* 水平坐标位移 */
  }             /* 一位数字显示完毕  */
}
现在这个式子背景色80时只显示前两位,中间一个空格,第三位无法显示,

123.jpg
12.jpg

点评

未经跟踪调试, 仅粗看了一下源程序代码, 基本是无大问题. 这个函数新增了一个约定, 就是当色号为80时, 可实现背景色透明, 以适应某种需要. 根据上述图片看, 当采用80色号时, 字符的间隔变大了, 如果屏幕像素足够大的  详情 回复 发表于 2025-10-7 15:33
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:661
  • 最近打卡:2025-11-04 07:56:51

31

主题

374

回帖

4485

积分

荣誉版主

积分
4485
发表于 2025-10-7 15:33:20 | 显示全部楼层
dong*** 发表于 2025-10-6 15:36
你好版主,我刚才发了一遍,没看见在哪里,再发一遍吧,我按你的函数照猫画虎写了一个显示128*64大的数字, ...

未经跟踪调试, 仅粗看了一下源程序代码, 基本是无大问题.
这个函数新增了一个约定, 就是当色号为80时, 可实现背景色透明, 以适应某种需要.
根据上述图片看, 当采用80色号时, 字符的间隔变大了, 如果屏幕像素足够大的话, 1 2 3 也是能显示的.
现在的问题主要看来是在于红色字体部分...
你新增了一个Lw的变量, 可能是多于的.
当一个字符显示完毕后, 又执行了 Lw=Lw+64;
其实x坐标的右移动作已经包含在j变量之中了, 后面有j*64就是解决位移的.
再执行Lw=Lw+64; 再右移64点, 就使得字符间隔不变大了.
因此我估计可省去Lw变量和Lw=Lw+64;语句..
那么为什么当使用非80色号时, 显示是正常的呢? 因为不需要空移坐标, 只管显示色点,坐标地址是自动递增的,红色部分语句是不执行的. 所以显示正常.

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:181
  • 最近打卡:2025-11-03 11:14:05

2

主题

46

回帖

843

积分

高级会员

积分
843
发表于 2025-10-9 19:12:10 | 显示全部楼层
感谢版主提供的例程,已在屠龙刀上验证成功

Screenshot_2025-10-09-19-01-59-595_com.miui.mediaviewer.jpg
Screenshot_2025-10-09-19-02-12-996_com.miui.mediaviewer.jpg
Screenshot_2025-10-09-19-02-22-306_com.miui.mediaviewer.jpg

Screenshot_2025-10-09-19-02-28-689_com.miui.mediaviewer.jpg



另,编程时左边栏确实存在两个STG32.h的情况,是因为

Main.C : #include "STC32G.h"

LCD_7789.H : #include <STC32G.h>

LCD_7789.C : #include <STC32G.h>

这三处引用的写法不同,不影响使用

回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:661
  • 最近打卡:2025-11-04 07:56:51

31

主题

374

回帖

4485

积分

荣誉版主

积分
4485
发表于 2025-10-9 21:59:11 | 显示全部楼层
ygy*** 发表于 2025-10-9 19:12
感谢版主提供的例程,已在屠龙刀上验证成功

回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:73
  • 最近打卡:2025-11-04 09:07:32

17

主题

38

回帖

497

积分

中级会员

积分
497
发表于 2025-10-10 19:17:01 | 显示全部楼层
版主你好,我遇到两个问题,帮忙分析分析
1、有几种颜色刷屏,屏幕就不能正常工作了,把他放能刷屏颜色后面(多颜色刷屏)他就能正常刷屏,放到第一就不行,
2、定时器无法正常工作,有几个数据我用定时器200ms更新一次,刚开始行,现在又不行了,(需要等上1-2分钟才能显示200ms刷新的内容)最后我把pwm,AD,都删除,只剩下屏幕和定时器,把屏幕的语句都屏蔽了,定时器0刚开始就工作,加上几条显示语句,定时器就又不工作了等上12分钟才能工作,你帮忙分析分析什么原因(这个问题我找到了。是刷新的时间太短,而且我用的是if(t1==200),屏幕任何一个传输数据都可能超过200ms,运行到if(t1==200),t1已经大于200ms就无法进入if语句了,应使用t1>200ms就可以了)今晚上弄了两个多小时

点评

遇到两个问题? 第一个问题表述得比较抽象, 不太理解是啥意思. 若有源代码列出, 可能好思考和解释一些. 第二个问题原因已经找到了(红色字描述的),就不需要分析解释了吧. 不过用 if(t1==200)这样的语句, 好像不是  详情 回复 发表于 2025-10-11 21:13
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:661
  • 最近打卡:2025-11-04 07:56:51

31

主题

374

回帖

4485

积分

荣誉版主

积分
4485
发表于 2025-10-11 21:13:30 | 显示全部楼层
dong*** 发表于 2025-10-10 19:17
版主你好,我遇到两个问题,帮忙分析分析
1、有几种颜色刷屏,屏幕就不能正常工作了,把他放能刷屏颜色后面 ...

遇到两个问题?
第一个问题表述得比较抽象, 不太理解是啥意思. 若有源代码列出, 可能好思考和解释一些.
第二个问题原因已经找到了(红色字描述的),就不需要分析解释了吧.
不过用  if(t1==200)这样的语句, 好像不是定时器中断方式. 而像是软件循环延时方式.为了确保运行可靠不漏掉执行时机, 一般用if(t1>=200){ ... ; t1=0;  } 较好些.... 若有具体代码,就好说一些.
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:181
  • 最近打卡:2025-11-03 11:14:05

2

主题

46

回帖

843

积分

高级会员

积分
843
发表于 5 天前 | 显示全部楼层
浦版,请问如何在显示屏屏幕上显示数组中的16进制?如一个数组的A[0][0]里面是05f0,我这显示出来是它的十进制1520,该怎么让它显示0x5f0或者是05f0或者5f0也行

点评

这位朋友你好! 如果A[0][0]里面的数据是0x05F0, 首先如果是一个2字节的数据, 常言是无符号短整型数据. 那么,它的十进制数值确实就是1520. 那么如果要想让它以16进制的形式显示, 可以利用标准C语言中的格式化语句,就  详情 回复 发表于 5 天前
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:661
  • 最近打卡:2025-11-04 07:56:51

31

主题

374

回帖

4485

积分

荣誉版主

积分
4485
发表于 5 天前 | 显示全部楼层
ygy*** 发表于 2025-10-30 08:47
浦版,请问如何在显示屏屏幕上显示数组中的16进制?如一个数组的A[0][0]里面是05f0,我这显示出来是它的十 ...

这位朋友你好!
如果A[0][0]里面的数据是0x05F0, 首先如果是一个2字节的数据, 常言是无符号短整型数据.
那么,它的十进制数值确实就是1520.
那么如果要想让它以16进制的形式显示, 可以利用标准C语言中的格式化语句,就是sprintf()函数.
具体是这样的:
先定一个字符串变量, 比如:
char S[16];                         //长度为16个字节的字符串S. 大于你要显示的位数即可..
再把一个0x05F0的数据, 格式化地转到字符串S中去,
sprintf(S,"%04X",A[0][0]);   //以"05F0"的格式显示
最后显示这个字符串就好啦.   比如:
LCD_A16(10,10,S,15,0,4);   //这样就在屏幕的x=10,y=10坐标处开始显示"05F0"了.4个字符.
更进一步的理解:   
这 "%04X",就是格式化指令:
%  后说明将要显示的变量所占的位置,
04  表示4个字符, 前面有0,表示前导0要显示的
X   表示是16进制格式(大写)
如果把"%04X"写成"%4X", 那么前导0熄灭了. 就是显示  5F0, 也占4字符宽度位置, 不过前面是用空格填充的.
如果想显示: A[0][0]=0x05F0, 上述语句可以这样写:
sprintf(S,"A[0][0]=0x%04X",A[0][0]);   //这种情况更常用和实用.
LCD_A16(10,10,S,15,0,14);   //这样就在屏幕的x=10,y=10坐标处开始显示"A[0][0]=0x05F0",一共14字符.

这样说,清楚吗?
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-11-4 16:31 , Processed in 0.155151 second(s), 99 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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