找回密码
 立即注册
查看: 10069|回复: 56

8H4K64TLCD驱动段码LCD屏教程(一)点亮段码LCD屏

  [复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2024-3-8 10:02:28 | 显示全部楼层 |阅读模式
8H4K64TLCD驱动段码LCD教程(一)点亮段码LCD屏
截图202403081029363965.jpg
截图202404030813532610.jpg
截图202403080823368131.jpg

    新版段码屏已到货,本系列文章均以这个板子围绕展开,有需要的可以自己打板测试,或者通过这个链接购买成品跟着测试:https://item.taobao.com/item.htm ... 97.7.40763d46EWIlaN

一、原理分析
   首先对于一个程序员来说,拿到一个段码屏要先看他的段码表和点亮效果图(每一个图标里的序号和第二个段码表里的序号对应)
截图202403080828499821.jpg

截图202403080829142728.jpg

    第一张图能看到他整个的显示内容,第二张图就是他的段码和位码,这里需要重点注意STC的com是四线的,屏也需要是最大是四com的,整体来说其实和数码管的操作原理类似,就是com和seg的一系列操作,但是区别的是数码管只输出高低电平,但是段码的输出不单单是高低电平,这里需要插入下他的原理介绍

截图202403080836058995.jpg

截图202403080836186949.jpg

截图202403080836349099.jpg
截图202403080836466306.jpg

    当然上述的这些不需要完全掌握,只需要知道他的意思就是说虽然同是com和seg,但是我们不能像数码管那样直接高低电平去点(虽然能点亮,但是很容易坏),当然,由于单片机内部有LCD的驱动器,我们也不需要自己搭电路去控制了,能省下不少的成本

截图202403080903364794.jpg

    这里只需要考虑这里段码屏的com接单片机的com脚,如上图手册描述的一样,段码屏的seg接单片机的seg(可以随意接,不需要考虑顺序什么的,只是要方便写程序就行),由于这个原理图特别大不好截图,原理图请从qq群文件自行下载。

    这里段码屏还一个非常重要的参数,就是电压。这个屏的电压是3.3V,所以注意单片机的供电电压不能小于这个屏幕的驱动电压。




二、手册分析
    首先先对这个内部的LCD的驱动模块进行初始化;开始查阅手册
截图202403080847389263.jpg

    1.从首页的介绍可以知道,目前stc能带段码屏的只有这个型号,其次他最大驱动4*40的段码屏,基本上绝大多数场合是完全够用了的。

截图202403080849184319.jpg

由此我们可以编写如下代码

  1. LCDCFG2 = 0x0f;                        // SEG0~3切换到P7.7~7.4
复制代码




    2.功能脚切换,这里我们用的引脚是P7.7~7.4,所以这个寄存器的低4位全都选1

截图202403080854008702.jpg

截图202403080854155032.jpg

    3.时钟配置,可以看到这里有四种模式选择,第一种内部高速IRC在省电模式会停震导致无法刷新,所以实际做产品的话不建议用这个,但是我们测试的时候可以用!!第二种模式不让用,跳过!第三种模式在省电模式下依然可以使用,且用外部晶振可以省去1.5ua的内部低速时钟的功耗,推荐使用这个(这个模式下一章细讲)!

截图202403080854259059.jpg

    4.电压配置,这里单片机VCC是5v,屏的电压是3.3v,所以VLCDSEL可以直接设置为0,即5*0.65 = 3.25V。

截图202403080904166324.jpg

由此可以得出,这个寄存器的代码可以这样写

  1. LCDCFG  = 0x00 + 0;        // 0x00:选择CPU时钟为LCD时钟, 0x80: 选择外部32K晶振做时钟. VLCD电压选择0~7对应0.65+VLCD*0.05.
复制代码


    5.这里还有一个比较重要的概念,刷新率,基本上在60hz的时候人眼就已经基本无法看出屏闪了,所以这里刷新率可以给他配置为60hz,这里我们选择手册说的24Mhz的情况下考虑的话,60hz所需要的参数都已经给出了,我们就按这个操作即可,我们就可以编写如下代码

  1. DBLNTH   = 2;                // 设置LCD显示时的死区时间长度, 取值0~7.
  2.         COMLNTHH        = 0x01;                // COM时间长度设置 高字节COMLEN[19:16],  一共20bit.
  3.         COMLNTHM        = 0x86;                // COM时间长度设置 中字节COMLEN[15:8]        LCD刷新率 = LCD时钟频率 / ((DBLEN[2:0]+COMLEN[19:0]+1) *2 * COM数)
  4.         COMLNTHL        = 0x9d;                // COM时间长度设置 低字节COMLEN[7:0]        LCD刷新率 = 32768/((2+65+1)*2*4) = 60Hz
  5.         BLINKFRPS = 60;                // 闪烁率配置寄存器, LCD闪烁率 = LCD刷新率 / BLINKRATE[7:0] Hz
复制代码




三、代码编写

    1.初始化函数

  1. void        LCD_config(void)
  2. {
  3.         u8        i;
  4.         
  5.         LCDCFG  = 0x00 + 0;        // 0x00:选择CPU时钟为LCD时钟, 0x80: 选择外部32K晶振做时钟. VLCD电压选择0~7对应0.65+VLCD*0.05.
  6.         DBLNTH   = 2;                // 设置LCD显示时的死区时间长度, 取值0~7.
  7.         COMLNTHH        = 0x01;                // COM时间长度设置 高字节COMLEN[19:16],  一共20bit.
  8.         COMLNTHM        = 0x86;                // COM时间长度设置 中字节COMLEN[15:8]        LCD刷新率 = LCD时钟频率 / ((DBLEN[2:0]+COMLEN[19:0]+1) *2 * COM数)
  9.         COMLNTHL        = 0x9d;                // COM时间长度设置 低字节COMLEN[7:0]        LCD刷新率 = 32768/((2+65+1)*2*4) = 60Hz
  10.         BLINKFRPS = 60;                // 闪烁率配置寄存器, LCD闪烁率 = LCD刷新率 / BLINKRATE[7:0] Hz
  11.         
  12.         COM_ON_A  = 0x0f;                // COM使能寄存器
  13.         SEG_ON_A = 0xff;                // SEG线使能寄存器1, SEG7~SEG0
  14.         SEG_ON_B = 0xff;                // SEG线使能寄存器2, SEG15~SEG8
  15.         SEG_ON_C = 0xff;                // SEG线使能寄存器3, SEG23~SEG16
  16.         SEG_ON_D = 0xff;                // SEG线使能寄存器4, SEG31~SEG24
  17.         SEG_ON_E = 0xff;                // SEG线使能寄存器5, SEG39~SEG32
  18.         
  19.         P5n_pure_input(0x03);        //P5.0 P5.1 设置为高阻输入        COM0 COM1
  20.         P3n_pure_input(0x60);        //P3.5 P3.6 设置为高阻输入        COM2 COM3
  21.         LCDCFG2 = 0x0f;                        // SEG0~3切换到P7.7~7.4
  22.         P7n_pure_input(0xf0);        //P7.7~P7.4 设置为高阻输入        SEG0~SEG3 (对应P7.7~7.4)
  23.         P4n_pure_input(0x80);        //P4.7      设置为高阻输入        SEG4
  24.         P1n_pure_input(0x03);        //P1.1~P1.0 设置为高阻输入        SEG5 SEG6       (对应P1.1 P1.0)
  25.         P0n_pure_input(0xe0);        //P0.7~P0.5 设置为高阻输入        SEG7 SEG8 SEG9  (对应P0.7 P0.6 P0.5)
  26.         P5n_pure_input(0x0C);        //P5.3 P5.2 设置为高阻输入        SEG10 SEG11     (对应P5.3 P5.2)
  27.         P0n_pure_input(0x1f);        //P0.4~P0.0 设置为高阻输入        SEG12~SEG16  (对应P0.4 ~ 0.0)
  28.         P4n_pure_input(0x60);        //P4.6 P4.5 设置为高阻输入        SEG17 SEG18
  29.         P2n_pure_input(0xff);        //P2.7~P2.0 设置为高阻输入        SEG19~SEG26  (对应P2.7~2.0)
  30.         P4n_pure_input(0x1e);        //P4.4~P4.1 设置为高阻输入        SEG27~SEG30  (对应P4.4~4.1)
  31.         P3n_pure_input(0x80);        //P3.7      设置为高阻输入        SEG31
  32.         P7n_pure_input(0x0f);        //P7.3~P7.0 设置为高阻输入        SEG32~SEG35  (对应P7.3~7.0)
  33.         P6n_pure_input(0x0f);        //P6.0~P6.3 设置为高阻输入        SEG36~SEG39  (对应P6.3~6.0)
  34.         for(i=0; i<20; i++)        
  35.                 LCD_buff[i] = 0x00;        //清除显示内容
  36.         
  37.         LoadToLcd();        //将显示内容导入显存
  38.         LCDCR = (0<<1) + 1;        // LCD控制寄存器, 0:普通模式, 1:长暗模式, 2:长亮模式, 3:闪烁模式.  +0:禁止LCD模块,  +1:允许LCD模块.
复制代码
   可以看到最上面的几行是不是就是第二快内容分析的寄存器配置,这里就不在赘述了。

    紧接着就是com和seg的使能了,这里就是写1使能,写0关闭,因为这里4个com和40个seg都用上了,所以这里全都写1了。

    在下面就是将所有使用的com和seg口都设置为高阻输入模式

    在下面一个for语句将LCD_buff的数组清0,后面我们点亮和熄灭屏的操作都是靠这个数组来的

    在下面的LoadToLcd函数是将我们的LCD_buff里的内容全都写入到lcd的数据寄存器里去,即直接显示

    最后开启数码管为常亮显示,这个初始化就结束了。



    下面就到了大家最关心的,我怎么去点亮段码屏的指定的某一段了,首先我们来看下这个段码屏是怎么和单片机连接的:

截图202403080918067794.jpg

这里帮大家整理好了一个表格,分为了三块显示,每块的第一行是段码屏的引脚号,第二三四五行使单片机的com对应的显示的图标号,最后一行就是连接的单片机的引脚,因为这个图是按照段码屏的序号排布的不太好看,我给他整理了下,按照单片机的seg号排布,排列玩之后如下:

截图202403080923398283.jpg

可以看到这里还是三块,第一块16个seg口就是,从seg0-seg15,可以看到这里最上面多可一行16进制数,最下面一行多了个中文。这个怎么理解呢,以第一个为例,看到“从上到下为 0 5 10 15”这个文字所在的那八列,其中横着的COM0对应的那一行就是对应的LCD_buff[0]数组对应的显示内容,横着的COM1对应的那一行就是对应的LCD_buff[5]数组对应的显示内容,横着的COM2对应的那一行就是对应的LCD_buff[10]数组对应的显示内容,横着的COM3对应的那一行就是对应的LCD_buff[15]数组对应的显示内容,且写1点亮

例1:要想点亮“P2”所在的图标就是LCD_buff[0] |= 0x08;

截图202403080935513483.jpg

例2:要想点亮“-2”所在的图标就是LCD_buff[10] |= 0x10;

截图202403080937506318.jpg



例3:要想点亮“L1”所在的图标就是LCD_buff[16] |= 0x02;

截图202403080939309625.jpg


这样子是不是就能点亮单个的段了!!



    2.再来点亮一个数字"8"

    截图202403080953156903.jpg


    每个数字8的段码和数码管一样,都是A-G,这里对应码表,假设我需要点亮一个1,是不是就是点亮表中的这两个段

截图202403080954542670.jpg

  换成代码就是这样子

    LCD_buff[5] |= 0x02;

    LCD_buff[15] |= 0x02;

    当然每次点亮都这么写太麻烦了,这里换成函数的写法

  1. void        LCD_load(u8 n, u8 dat)                //n为第几个数字,为1~5,dat为要显示的数字
  2. {
  3.         u8        i,k;
  4.         if((n == 0) || (n >= 15))        
  5.                 return;        //合法值 1~5
  6.         dat =  t_display[dat];
  7.         switch( n )
  8.         {
  9.                 case 1:
  10.                 case 2:
  11.                 case 3:
  12.                         LCD_buff[0]  &= ~(1<<seg_pos[n-1]);
  13.                         LCD_buff[5]  &= ~(3<<seg_pos[n-1]);
  14.                         LCD_buff[10] &= ~(3<<seg_pos[n-1]);
  15.                         LCD_buff[15] &= ~(3<<seg_pos[n-1]);
  16.                
  17.                         if(dat & 0x01)                LCD_buff[15] |= (1<<seg_pos[n-1]);        //T_SEG_ABC[n];                //A
  18.                         if(dat & 0x02)                LCD_buff[15] |= (2<<seg_pos[n-1]);        //T_SEG_ABC[n];                //B
  19.                         if(dat & 0x04)                LCD_buff[5]  |= (2<<seg_pos[n-1]);        //T_SEG_ABC[n];                //C
  20.                         if(dat & 0x08)                LCD_buff[0]  |= (1<<seg_pos[n-1]);        //T_SEG_DEFG[n];        //D
  21.                         if(dat & 0x10)                LCD_buff[5]  |= (1<<seg_pos[n-1]);        //T_SEG_DEFG[n];        //E
  22.                         if(dat & 0x20)                LCD_buff[10] |= (1<<seg_pos[n-1]);        //T_SEG_DEFG[n];        //F
  23.                         if(dat & 0x40)                LCD_buff[10] |= (2<<seg_pos[n-1]);        //T_SEG_DEFG[n];        //G               
  24.                         break;
  25.                
  26.                 case 4:
  27.                         LCD_buff[0]  &= ~(1<<7);
  28.                         LCD_buff[5]  &= ~(1<<7);
  29.                         LCD_buff[10] &= ~(1<<7);
  30.                         LCD_buff[15] &= ~(1<<7);
  31. //                        LCD_buff[1]  &= ~(1<<0);
  32.                         LCD_buff[6]  &= ~(1<<0);
  33.                         LCD_buff[11] &= ~(1<<0);
  34.                         LCD_buff[16] &= ~(1<<0);
  35.                
  36.                         if(dat & 0x01)                LCD_buff[15] |= (1<<7);        //T_SEG_ABC[n];                //A
  37.                         if(dat & 0x02)                LCD_buff[16] |= (1<<0);        //T_SEG_ABC[n];                //B
  38.                         if(dat & 0x04)                LCD_buff[6]  |= (1<<0);        //T_SEG_ABC[n];                //C
  39.                         if(dat & 0x08)                LCD_buff[0]  |= (1<<7);        //T_SEG_DEFG[n];        //D
  40.                         if(dat & 0x10)                LCD_buff[5]  |= (1<<7);        //T_SEG_DEFG[n];        //E
  41.                         if(dat & 0x20)                LCD_buff[10] |= (1<<7);        //T_SEG_DEFG[n];        //F
  42.                         if(dat & 0x40)                LCD_buff[11] |= (1<<0);        //T_SEG_DEFG[n];        //G                                
  43.                         break;
  44.                
  45.                 case 5:
  46.                 case 6:                        
  47.                         LCD_buff[1]  &= ~(1<<seg_pos[n-1]);
  48.                         LCD_buff[6]  &= ~(3<<seg_pos[n-1]);
  49.                         LCD_buff[11] &= ~(3<<seg_pos[n-1]);
  50.                         LCD_buff[16] &= ~(3<<seg_pos[n-1]);
  51.                
  52.                         if(dat & 0x01)                LCD_buff[16] |= (1<<seg_pos[n-1]);        //T_SEG_ABC[n];                //A
  53.                         if(dat & 0x02)                LCD_buff[16] |= (2<<seg_pos[n-1]);        //T_SEG_ABC[n];                //B
  54.                         if(dat & 0x04)                LCD_buff[6]  |= (2<<seg_pos[n-1]);        //T_SEG_ABC[n];                //C
  55.                         if(dat & 0x08)                LCD_buff[1]  |= (1<<seg_pos[n-1]);        //T_SEG_DEFG[n];        //D
  56.                         if(dat & 0x10)                LCD_buff[6]  |= (1<<seg_pos[n-1]);        //T_SEG_DEFG[n];        //E
  57.                         if(dat & 0x20)                LCD_buff[11] |= (1<<seg_pos[n-1]);        //T_SEG_DEFG[n];        //F
  58.                         if(dat & 0x40)                LCD_buff[11] |= (2<<seg_pos[n-1]);        //T_SEG_DEFG[n];        //G               
  59.                         break;
  60.                
  61.                 case 14:                        
  62.                         LCD_buff[1]  &= ~(3<<seg_pos[n-1]);
  63.                         LCD_buff[6]  &= ~(3<<seg_pos[n-1]);
  64.                         LCD_buff[11] &= ~(3<<seg_pos[n-1]);
  65.                         LCD_buff[16] &= ~(2<<seg_pos[n-1]);
  66.                
  67.                         if(dat & 0x01)                LCD_buff[1]   |= (2<<seg_pos[n-1]);        //T_SEG_ABC[n];                //A
  68.                         if(dat & 0x02)                LCD_buff[1]   |= (1<<seg_pos[n-1]);        //T_SEG_ABC[n];                //B
  69.                         if(dat & 0x04)                LCD_buff[11]  |= (1<<seg_pos[n-1]);        //T_SEG_ABC[n];                //C
  70.                         if(dat & 0x08)                LCD_buff[16]  |= (2<<seg_pos[n-1]);        //T_SEG_DEFG[n];        //D
  71.                         if(dat & 0x10)                LCD_buff[11]  |= (2<<seg_pos[n-1]);        //T_SEG_DEFG[n];        //E
  72.                         if(dat & 0x20)                LCD_buff[6]   |= (2<<seg_pos[n-1]);        //T_SEG_DEFG[n];        //F
  73.                         if(dat & 0x40)                LCD_buff[6]   |= (1<<seg_pos[n-1]);        //T_SEG_DEFG[n];        //G               
  74.                         break;               
  75.                
  76.                 case 13:        
  77.                 case 12:
  78.                 case 11:
  79.                 case 10:                        
  80.                         LCD_buff[2]  &= ~(3<<seg_pos[n-1]);
  81.                         LCD_buff[7]  &= ~(3<<seg_pos[n-1]);
  82.                         LCD_buff[12] &= ~(3<<seg_pos[n-1]);
  83.                         LCD_buff[17] &= ~(2<<seg_pos[n-1]);
  84.                
  85.                         if(dat & 0x01)                LCD_buff[2]   |= (2<<seg_pos[n-1]);        //T_SEG_ABC[n];                //A
  86.                         if(dat & 0x02)                LCD_buff[2]   |= (1<<seg_pos[n-1]);        //T_SEG_ABC[n];                //B
  87.                         if(dat & 0x04)                LCD_buff[12]  |= (1<<seg_pos[n-1]);        //T_SEG_ABC[n];                //C
  88.                         if(dat & 0x08)                LCD_buff[17]  |= (2<<seg_pos[n-1]);        //T_SEG_DEFG[n];        //D
  89.                         if(dat & 0x10)                LCD_buff[12]  |= (2<<seg_pos[n-1]);        //T_SEG_DEFG[n];        //E
  90.                         if(dat & 0x20)                LCD_buff[7]   |= (2<<seg_pos[n-1]);        //T_SEG_DEFG[n];        //F
  91.                         if(dat & 0x40)                LCD_buff[7]   |= (1<<seg_pos[n-1]);        //T_SEG_DEFG[n];        //G               
  92.                         break;        
  93.                
  94.                 case 9:        
  95.                 case 8:
  96.                 case 7:        
  97.                         LCD_buff[3]  &= ~(3<<seg_pos[n-1]);
  98.                         LCD_buff[8]  &= ~(3<<seg_pos[n-1]);
  99.                         LCD_buff[13] &= ~(3<<seg_pos[n-1]);
  100.                         LCD_buff[14] &= ~(2<<seg_pos[n-1]);
  101.                
  102.                         if(dat & 0x01)                LCD_buff[3]   |= (2<<seg_pos[n-1]);        //T_SEG_ABC[n];                //A
  103.                         if(dat & 0x02)                LCD_buff[3]   |= (1<<seg_pos[n-1]);        //T_SEG_ABC[n];                //B
  104.                         if(dat & 0x04)                LCD_buff[13]  |= (1<<seg_pos[n-1]);        //T_SEG_ABC[n];                //C
  105.                         if(dat & 0x08)                LCD_buff[18]  |= (2<<seg_pos[n-1]);        //T_SEG_DEFG[n];        //D
  106.                         if(dat & 0x10)                LCD_buff[13]  |= (2<<seg_pos[n-1]);        //T_SEG_DEFG[n];        //E
  107.                         if(dat & 0x20)                LCD_buff[8]   |= (2<<seg_pos[n-1]);        //T_SEG_DEFG[n];        //F
  108.                         if(dat & 0x40)                LCD_buff[8]   |= (1<<seg_pos[n-1]);        //T_SEG_DEFG[n];        //G               
  109.                         break;        
  110.                
  111.                 default:
  112.                         break;
  113.                
  114.         }
  115. }
复制代码
入口参数的n表示第几个数字8,dat表示当前要写入的数,写入的数据包含这些:

截图202403081000075071.jpg

这个函数主要就是先把指定的第几个8所在的位置的数据先清空,

截图202403081001031119.jpg

例如第一个数字8他会先清空这7个位,在判断当前要显示的内容,在分别写入这七个位即可点亮,后面的数码管一次类推。函数写个LCD_load(1,0);        就可以让第一个数字8显示0;

段码LCD触摸按键演示程序-20240525
段码屏测试代码.rar (115.6 KB, 下载次数: 292)

2 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:143
  • 最近打卡:2025-03-18 22:14:06

0

主题

18

回帖

366

积分

中级会员

积分
366
发表于 2024-3-8 10:07:02 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2024-3-8 10:19:17 | 显示全部楼层
冲哥 威武
截图202403081020365191.jpg
截图202403081024457044.jpg

截图202403081024163302.jpg



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2024-3-8 10:27:32 | 显示全部楼层
有疑问的可以下面留言,章节预告:

第二章,讲触摸

STC8H4K64TLCD驱动段码LCD屏教程(二)触摸按键

STC8H4K64TLCD驱动段码LCD屏教程(二)触摸按键 - 触摸按键/80mA大电流LED数码管自动刷新显示/段码LCD/RTC实时时钟/低功耗 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)

第三章,主要讲【外部32.768K晶振+RTC】,驱动屏


回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:41
  • 最近打卡:2025-03-13 12:10:59

3

主题

20

回帖

731

积分

高级会员

积分
731
发表于 2024-3-8 10:35:12 | 显示全部楼层
{:5_332:}
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:464
  • 最近打卡:2025-04-29 08:25:45

10

主题

130

回帖

564

积分

高级会员

积分
564
发表于 2024-3-10 17:42:57 | 显示全部楼层
摆好小板凳等开讲
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:413
  • 最近打卡:2025-05-01 08:31:52

5

主题

296

回帖

2030

积分

金牌会员

积分
2030
发表于 2024-3-12 00:39:17 | 显示全部楼层
以前用89c52驱动过位数少的,当时用的电阻分压做的,现在STC有专用芯片方便多了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:502
  • 最近打卡:2025-05-01 08:01:38
已绑定手机

1

主题

833

回帖

1441

积分

金牌会员

积分
1441
发表于 2024-3-12 01:29:08 | 显示全部楼层
讲的真好
靡不有初,鲜克有终
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:412
  • 最近打卡:2025-04-30 07:57:12

4

主题

80

回帖

1885

积分

金牌会员

积分
1885
发表于 2024-3-12 08:09:00 | 显示全部楼层
受教了,等下一节课!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:304
  • 最近打卡:2025-05-01 08:18:48

2

主题

55

回帖

1081

积分

金牌会员

积分
1081
发表于 2024-3-12 08:36:34 | 显示全部楼层
{:5_332:}
活到老学到老
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 01:50 , Processed in 0.176738 second(s), 125 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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