找回密码
 立即注册
楼主: 大刀阔斧

【开源】GUI-OLED12864: U8g2/OLED12864 for STC32G12K128

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2024-5-19 09:14:38 | 显示全部楼层
李*** 发表于 2023-6-7 23:19
已经通过GitHub源码那里下载了原作者对应的代码,然后根据说明改了SPI+DMA控制12864的OLED,跑图有效但是 ...

可以,有第三方 爱好者 有这个 并口 OLED12864 销售:
1,支持 普通 8051并口;
2,支持 i8080并口;
3,  支持 M6800并口
第三方 SPI/I2C/并口 OLED12864,STC开源示波器配套 TFT  

销售淘宝店 :https://KCER001.taobao.com
回复 支持 反对

使用道具 举报 送花

0

主题

10

回帖

62

积分

等待验证会员

积分
62
发表于 2024-5-22 09:36:33 | 显示全部楼层
谢谢,我试了,能支持中文字体,再次称赞。
分享方法:
只要在设置字体,需要解除注释: u8g2_fonts.c    u8g2.h 两个文件中对应的字体两端加上    #endif  要用的字体 #if 0
然后u8g2_SetFont(&u8g2, u8g2_font_unifont_t_chinese1);   u8g2_DrawUTF8(&u8g2, 40, 23, "你好");


我现在想把它与STC32G的综合例程合并,来写代码。但是打开SPI,和SPI DMA时编译会报错:关掉SPI DMA不报错, 打开SPI DMA 并且注释掉下述代码也不报错:

#if (SPI_DMA_CFG == 1)
void SPI_DMA_Interrupt(void) interrupt 13               
{
        DMA_SPI_STA = 0;
        SpiDmaFlag = 0;
}
#endif

查了论坛说是要删除isr.asm文件,我删除了还是编不过,请问下应该怎么处理呀?


报错信息如下:
Build started: Project: STC32G-LIB
Build target 'Target 1'
compiling spi.c...
..\lcd\SPI\spi.c(129): warning C47: 'Timeout': unreferenced parameter
linking...
*** ERROR L101: SEGMENT COMBINATION ERROR
    SEGMENT: ?PR?IV?1
    MODULE:  .\list\spi.obj (spi)
*** ERROR L120: CONTENT BELONGS TO ERRONEOUS SEGMENT
    SEGMENT: ?PR?IV?1
*** ERROR L121: IMPROPER FIXUP
    MODULE:  .\list\STC32G_Timer_Isr.obj (STC32G_Timer_Isr)
    SEGMENT: ?PR?IV?1
    OFFSET:  00000CH
*** ERROR L121: IMPROPER FIXUP
    MODULE:  .\list\spi.obj (spi)
    SEGMENT: ?PR?IV?1
    OFFSET:  00000CH
Program Size: data=12.0 edata+hdata=2579 xdata=320 const=910 code=31571
Target not created.
Build Time Elapsed:  00:00:01
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2024-5-22 10:13:14 | 显示全部楼层
11318*** 发表于 2024-5-22 09:36
谢谢,我试了,能支持中文字体,再次称赞。
分享方法:
只要在设置字体,需要解除注释: u8g2_fonts.c    u ...

如果你的DMA中断是借用13号中断向量的话,isr.asm文件就不能随便删除。
另外,合并项目时要注意两者同时用到的资源要进行整合,例如综合例程里面有定时器0中断函数,如果你合并进来的程序里面也有定时器0中断函数的话就要对功能进行整合,不能写两个定时器0中断函数。
回复 支持 反对

使用道具 举报 送花

0

主题

10

回帖

62

积分

等待验证会员

积分
62
发表于 2024-5-22 11:17:20 | 显示全部楼层
明白了,是我晕头了
原来的工程代码里,这个中断号是13,原来工程里有ISR.ASM文件。
新工程里没有ISR.ASM文件,所以新工程需要重新设置这个DMA的中断号,并把重复的那个中断服务程序删除掉,请问是设成DMA_SPI_VECTOR对吗?
回复 支持 反对

使用道具 举报 送花

0

主题

10

回帖

62

积分

等待验证会员

积分
62
发表于 2024-5-28 11:09:22 | 显示全部楼层
大佬,请问能详细讲解一下怎么用STC的工具生成U8G2的中文字体吗?
我上百度找了都是其它的软件, 有些复杂的使用流程,想尝试一下STC这个工具,但是它生成的数据怎么看跟U8G2的字体文件数据格式也完全不一样呀。
回复 支持 反对

使用道具 举报 送花

0

主题

10

回帖

62

积分

等待验证会员

积分
62
发表于 2024-5-28 16:16:05 | 显示全部楼层
我现在只研究明白用位图显示文字的方法:u8g2_DrawXBMP(&u8g2, x, y, width, height, 位图的数组名);
把取模工具设成下面这样,然后把数据部分复制到KEIL里变成一个CODE型的数组,就可以显示出来了
截图202405281615285765.jpg
回复 支持 反对

使用道具 举报 送花

0

主题

10

回帖

62

积分

等待验证会员

积分
62
发表于 2024-5-28 16:18:36 | 显示全部楼层
但是这样使用显示文字串,就巨麻烦,岂不是每个文字显示都要一行代码,还要找位置。
还是用u8g2_DrawUTF8()写代码更合理,但是不知道彼用这个工具道理成字体数组,求高人解答
回复 支持 反对

使用道具 举报 送花

0

主题

10

回帖

62

积分

等待验证会员

积分
62
发表于 2024-5-29 15:56:31 | 显示全部楼层
分享自己研究方法如下:
画位图原理自定义画中文字符:
取模方法如下,在C表格-紧凑格式后索引的基础上简单修改,把中文字与字模用大括号分开,得到如下数据格式。调用打印函数时,会先搜索中文字符的UTF8码做索引;
拷到.C文件中生成数组:
//打印单个字符的调用方法:u8g2_DrawXBMP(&u8g2, x, y, 12, 12, lc1212c[0]);

static u8 code lc1212c[][] = {
          {0x00,0x00,0x08,0x01,0x88,0x00,0x48,0x00,0x28,0x00,0xfe,0x07,0x48,0x00,0x48,0x00,
    0x88,0x00,0x28,0x01,0x38,0x06,0x08,0x00},{"长"}, /* 0 */
    {0x80,0x00,0x84,0x00,0xe4,0x07,0x2e,0x04,0xa4,0x04,0x84,0x00,0xec,0x07,0x47,0x02,
    0x24,0x01,0xc4,0x01,0x84,0x03,0x76,0x04},{"按"}, /* 1 */
    {0x00,0x00,0xe4,0x01,0x2c,0x01,0x20,0x01,0x36,0x07,0x14,0x00,0xf4,0x03,0x24,0x02,
    0x44,0x01,0xcc,0x00,0xcc,0x01,0x3c,0x06},{"设"}, /* 2 */
    {0x00,0x00,0xfc,0x03,0x94,0x02,0x68,0x01,0xfe,0x07,0x20,0x00,0xdc,0x01,0xf8,0x01,
    0xf8,0x01,0x04,0x01,0xfc,0x01,0xfe,0x07},{"置"}, /* 3 */
    {0x00,0x00,0xe8,0x03,0x24,0x02,0x24,0x02,0xe6,0x03,0x86,0x00,0xf4,0x07,0xc4,0x01,
    0xa4,0x01,0xa4,0x02,0x94,0x04,0x8c,0x00},{"保"}, /* 4 */
    {0x20,0x00,0x20,0x00,0xfe,0x07,0x10,0x00,0x08,0x00,0xe8,0x07,0x0c,0x01,0x8a,0x00,
    0xf8,0x07,0x88,0x00,0x88,0x00,0xc8,0x00},{"存"}, /* 5 */
    {0x00,0x00,0xfc,0x07,0x44,0x00,0x44,0x00,0x44,0x00,0xf4,0x07,0x44,0x02,0x44,0x02,
    0x24,0x02,0x22,0x02,0x32,0x02,0x1a,0x03},{"历"}, /* 6 */
    {0x40,0x00,0x40,0x00,0xfc,0x03,0x44,0x02,0x44,0x02,0x44,0x02,0xfc,0x03,0x2c,0x00,
    0x28,0x00,0x30,0x00,0xf8,0x00,0x06,0x07},{"史"}, /* 7 */
    {0x00,0x00,0xe4,0x03,0x08,0x02,0x00,0x02,0x06,0x02,0xe4,0x03,0x24,0x02,0x24,0x00,
    0x24,0x00,0x34,0x04,0x2c,0x04,0xc4,0x07},{"记"}, /* 8 */
    {0x00,0x00,0xfc,0x03,0x00,0x02,0xfc,0x03,0x00,0x01,0xfe,0x07,0x42,0x01,0x4c,0x03,
    0xc8,0x00,0xd8,0x01,0x46,0x06,0x30,0x04},{"录"}, /* 9 */
};

//定义打印字符串的函数:
//打印自定义的中文字符串到坐标X,Y处,
//参数定义: cWith,cHeight 字符取模时的宽 和 高度为,
//                                                str 中文字符串        strLen中文字符串长度
//                                        bmpA: 取模得到的二维数组,bmpALen:此二维数组第一维的大小,bmpACharSize:第二维的大小
void lcDrawUtf8Str(u8 x,u8 y,u8 cWith,u8 cHeight,u8* str,u8 strLen,u8* bmpA,u8 bmpALen,u8 bmpACharSize)
{
        u8 i =0,j=0;
        //LOGINF(1,"in  %d %d\r\n",bmpALen,bmpACharSize);
        for(;i<strLen;)
        {
                for(j=0;j<=bmpALen/2;)
                {
//                        LOGINF(1,"bmpa %02x\r\n",(i*2-1)*bmpACharSize);
                        if(memcmp(&str[3*i],&bmpA[(j*2+1)*bmpACharSize],3) == 0){        //比对UTF8码是否相同
                                //LOGINF(1,"cmp ok %d %d\r\n",i,j);
                                u8g2_DrawXBMP(&u8g2, x+cWith*i, y, cWith, cHeight, &bmpA[j*2*bmpACharSize]);
                        }
                        j++;
                }
                i++;
        }
}

//调用打印输出
lcDrawUtf8Str(20,30,12,12,"长按记录",4,lc1212c,sizeof(lc1212c)/sizeof(lc1212c[0]),sizeof(lc1212c[0]));
截图202405291554451354.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:35
  • 最近打卡:2025-04-30 11:28:17
已绑定手机

7

主题

48

回帖

557

积分

高级会员

积分
557
发表于 2024-11-4 18:20:14 | 显示全部楼层
我下载了程序,编译62个警告,未引用啥的,正常就这样吗?如何消除掉警告?谢谢

Build started: Project: ssd1306
Build target 'Target 1'
compiling main.c...
compiling system.c...
compiling iic.c...
compiling putchar.c...
compiling mui.c...
compiling mui_u8g2.c...
u8g2\mui_u8g2.c(897): warning C188: 'parameter 2': value truncated
u8g2\mui_u8g2.c(930): warning C188: 'parameter 2': value truncated
u8g2\mui_u8g2.c(981): warning C188: 'parameter 2': value truncated
u8g2\mui_u8g2.c(1013): warning C188: 'parameter 2': value truncated
u8g2\mui_u8g2.c(1571): warning C188: 'parameter 3': value truncated
u8g2\mui_u8g2.c(1617): warning C188: 'parameter 3': value truncated
u8g2\mui_u8g2.c(1663): warning C188: 'parameter 3': value truncated
u8g2\mui_u8g2.c(1726): warning C188: 'parameter 3': value truncated
u8g2\mui_u8g2.c(1730): warning C188: 'parameter 3': value truncated
u8g2\mui_u8g2.c(1746): warning C188: 'parameter 3': value truncated
u8g2\mui_u8g2.c(1750): warning C188: 'parameter 3': value truncated
u8g2\mui_u8g2.c(1886): warning C188: 'parameter 3': value truncated
compiling u8g2_bitmap.c...
compiling u8g2_box.c...
compiling u8g2_buffer.c...
compiling u8g2_button.c...
compiling u8g2_circle.c...
compiling u8g2_cleardisplay.c...
compiling u8g2_d_memory.c...
compiling u8g2_d_setup.c...
compiling u8g2_font.c...
u8g2\u8g2_font.c(537): warning C188: 'parameter 3': value truncated
u8g2\u8g2_font.c(538): warning C188: 'parameter 3': value truncated
u8g2\u8g2_font.c(1028): warning C47: 'u8g2': unreferenced parameter
compiling u8g2_fonts.c...
compiling u8g2_hvline.c...
compiling u8g2_input_value.c...
compiling u8g2_intersection.c...
compiling u8g2_kerning.c...
u8g2\u8g2_kerning.c(47): warning C47: 'u8g2': unreferenced parameter
u8g2\u8g2_kerning.c(78): warning C47: 'u8g2': unreferenced parameter
compiling u8g2_line.c...
compiling u8g2_ll_hvline.c...
compiling u8g2_message.c...
compiling u8g2_polygon.c...
u8g2\u8g2_polygon.c(328): warning C47: 'u8g2': unreferenced parameter
compiling u8g2_selection_list.c...
u8g2\u8g2_selection_list.c(187): warning C188: 'parameter 4': value truncated
compiling u8g2_setup.c...
compiling u8log.c...
u8g2\u8log.c(227): warning C188: 'parameter 2': value truncated
u8g2\u8log.c(229): warning C188: 'parameter 2': value truncated
u8g2\u8log.c(240): warning C188: 'parameter 2': value truncated
u8g2\u8log.c(241): warning C188: 'parameter 2': value truncated
u8g2\u8log.c(246): warning C188: 'parameter 2': value truncated
u8g2\u8log.c(247): warning C188: 'parameter 2': value truncated
compiling u8log_u8g2.c...
compiling u8log_u8x8.c...
compiling u8x8_8x8.c...
u8g2\u8x8_8x8.c(197): warning C188: 'parameter 2': value truncated
u8g2\u8x8_8x8.c(200): warning C188: 'parameter 3': value truncated
u8g2\u8x8_8x8.c(203): warning C188: 'parameter 2': value truncated
u8g2\u8x8_8x8.c(203): warning C188: 'parameter 3': value truncated
u8g2\u8x8_8x8.c(246): warning C188: 'parameter 3': value truncated
u8g2\u8x8_8x8.c(290): warning C47: 'u8x8': unreferenced parameter
u8g2\u8x8_8x8.c(374): warning C188: 'parameter 4': value truncated
u8g2\u8x8_8x8.c(415): warning C188: 'parameter 4': value truncated
u8g2\u8x8_8x8.c(453): warning C188: 'parameter 4': value truncated
compiling u8x8_byte.c...
u8g2\u8x8_byte.c(66): warning C47: 'u8x8': unreferenced parameter
u8g2\u8x8_byte.c(66): warning C47: 'arg_int': unreferenced parameter
u8g2\u8x8_byte.c(66): warning C47: 'arg_ptr': unreferenced parameter
compiling u8x8_cad.c...
compiling u8x8_capture.c...
compiling u8x8_debounce.c...
u8g2\u8x8_debounce.c(52): warning C188: 'parameter 2': value truncated
compiling u8x8_display.c...
compiling u8x8_fonts.c...
compiling u8x8_gpio.c...
compiling u8x8_input_value.c...
u8g2\u8x8_input_value.c(84): warning C188: 'parameter 2': value truncated
compiling u8x8_message.c...
compiling u8x8_selection_list.c...
u8g2\u8x8_selection_list.c(82): warning C188: 'parameter 3': value truncated
compiling u8x8_setup.c...
u8g2\u8x8_setup.c(40): warning C47: 'u8x8': unreferenced parameter
u8g2\u8x8_setup.c(40): warning C47: 'msg': unreferenced parameter
u8g2\u8x8_setup.c(40): warning C47: 'arg_int': unreferenced parameter
u8g2\u8x8_setup.c(40): warning C47: 'arg_ptr': unreferenced parameter
u8g2\u8x8_setup.c(73): warning C47: 'arg_int': unreferenced parameter
u8g2\u8x8_setup.c(73): warning C47: 'arg_ptr': unreferenced parameter
compiling u8x8_string.c...
compiling u8x8_u8toa.c...
compiling u8x8_u16toa.c...
compiling u8x8_d_ssd1306_128x64_noname.c...
u8g2\u8x8_d_ssd1306_128x64_noname.c(267): warning C188: 'parameter 2': value truncated
compiling u8g2_porting.c...
u8g2_porting.c(53): warning C47: 'u8x8': unreferenced parameter
u8g2_porting.c(53): warning C47: 'msg': unreferenced parameter
u8g2_porting.c(53): warning C47: 'arg_int': unreferenced parameter
u8g2_porting.c(54): warning C47: 'arg_ptr': unreferenced parameter
u8g2_porting.c(84): warning C47: 'u8x8': unreferenced parameter
u8g2_porting.c(86): warning C47: 'arg_ptr': unreferenced parameter
u8g2_porting.c(148): warning C98: parameter 4: pointer to different objects
u8g2_porting.c(148): warning C91: '&': pointer to different objects
u8g2_porting.c(53): warning C174: 'u8x8_byte_4wire_hw_spi': unreferenced 'static' function
compiling u8g2_test.c...
u8g2_test.c(451): warning C98: parameter 1: pointer to different objects
u8g2_test.c(451): warning C91: '&': pointer to different objects
u8g2_test.c(653): warning C96: 'u8g2_DrawStr': too few actual parameters
u8g2_test.c(653): warning C161: 'huge const' pointer truncated to 'unsigned int'
u8g2_test.c(653): warning C10: conversion: 'pointer' to 'unsigned int'
u8g2_test.c(706): warning C96: 'u8g2_prepare': too few actual parameters
linking...
Program Size: data=8.0 edata+hdata=1685 xdata=32 const=812 code=24441
creating hex file from ".\Objects\SSD1306"...
".\Objects\SSD1306" - 0 Error(s), 62 Warning(s).
Build Time Elapsed:  00:00:06
Load "C:\\学习文件\\30-STC32_U8G2_DMA_OLED\\1-STC32_U8G2_I2C_DMA_OLED\\Objects\\SSD1306"
Error: Flash Download failed  -  Target DLL has been cancelled
Flash Load finished at 18:00:55
回复 支持 反对

使用道具 举报 送花

0

主题

10

回帖

62

积分

等待验证会员

积分
62
发表于 2025-1-16 12:11:26 | 显示全部楼层
使用DMA是为了空出CPU时间来。 我用SPI DMA的U8G2例程做了测试,发现每次刷屏,即完成调用 u8g2.firstPage()到 u8g2.nextPage()循环的时间在20~50MS不等,所以U8G2内部应该是在等待数据发送完。 然后我查询了SPI DMA BUF的大小,发现I2C工程是32,SPI工程是256。  假如常用屏幕分辨率是128*64 = 8192,  如果U8G2里一个像素由一个位表示,则需要8192/8 = 1024字节的缓冲区才刷完一屏对吧。

那如果我想在本工程基础上实现DMA零等待的刷128*64的屏,是不是必须要做如下工作:
1 将DMA buf改成大于1024
2 将u8g2.firstPage()+ u8g2.nextPage() 的刷屏方式改为 u8g2.clearBuffer()   u8g2.sendBuffer()的方式

因为本人对U8G2了解不太深,敬请指导一下有什么简单的方式使刷屏等待时间尽量的小。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:42 , Processed in 0.141423 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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