找回密码
 立即注册
查看: 4618|回复: 13

LCM功能

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-12 11:44:58

14

主题

39

回帖

304

积分

中级会员

积分
304
发表于 2022-11-29 10:19:05 | 显示全部楼层 |阅读模式
手册上LCM部分没有例程,说明不够详细,只能靠猜测自己写,结果失败了,软件模拟没问题。


#if MY_FUN_ENABLE_C1602
/*
void my_fun_c1602_busy(void)
{
        unsigned char t;

        t = 0x80;
        P_SW2 |= 0x80;
        while (t & 0x80)
        {
                LCMIFCR = 0x86;                        // Read Command
                t = LCMIFDATL;
        }
        P_SW2 &= 0x7f;
}

void my_fun_c1602_write_command(unsigned x)
{
        my_fun_c1602_busy();
        P_SW2 |= 0x80;
        LCMIFDATL = x;
        LCMIFCR = 0x84;                        // Write Command
        P_SW2 &= 0x7f;
}

void my_fun_c1602_write_data(unsigned x)
{
        my_fun_c1602_busy();
        P_SW2 |= 0x80;
        LCMIFDATL = x;
        LCMIFCR = 0x85;                        // Write Data
        P_SW2 &= 0x7f;
}

void my_fun_c1602_initialization(void)
{
        P_SW2 |= 0x80;
        LCMIFCFG = 0x01;                // 禁止中断, P2数据口, M6800模式
        LCMIFCFG2 = 0x5f;                // E = P42, RS = P41, RW = P40
        LCMIFDATL = 0x38;                // 初始化, 8 Bit bus, 双行显示, 5x7 点阵
        LCMIFCR = 0x84;                        // Write Command
        INSIDE_TIME_BEEP = 5;        // 延时40-50ms
        while(INSIDE_TIME_BEEP);
        P_SW2 &= 0x7f;
        my_fun_c1602_write_command(0x01);
        my_fun_c1602_write_command(0x02);
        my_fun_c1602_write_command(0x06);
        my_fun_c1602_write_command(0x0f);        //6c
}
*/

void my_fun_c1602_busy(void)
{
        unsigned char t;

        t = 0x80;
        while (t & 0x80)
        {
                LCD_EN = 0;
                LCD_RS = 0;                                        // Write Command
                LCD_RW = 1;
                LCD_DAT = 0xff;
                my_fun_public_delay();
                LCD_EN = 1;
                my_fun_public_delay();
                t = LCD_DAT;
                LCD_EN = 0;
                my_fun_public_delay();
        }
}

void my_fun_c1602_write_command(unsigned char x)
{
        my_fun_c1602_busy();
        LCD_RS = 0;                                        // Write Command
        LCD_RW = 0;
        LCD_EN = 0;
        LCD_DAT = x;
        my_fun_public_delay();
        LCD_EN = 1;
        my_fun_public_delay();
        LCD_EN = 0;
        my_fun_public_delay();
        LCD_DAT = 0xff;
}

void my_fun_c1602_write_data(unsigned char x)
{
        my_fun_c1602_busy();
        LCD_RS = 1;                                        // Write Data
        LCD_RW = 0;
        LCD_EN = 0;
        LCD_DAT = x;
        my_fun_public_delay();
        LCD_EN = 1;
        my_fun_public_delay();
        LCD_EN = 0;
        my_fun_public_delay();
        LCD_DAT = 0xff;
}

void my_fun_c1602_printf(unsigned char x, unsigned char y, unsigned char *s)
{
        unsigned char i;

        x = x & 0x3f;
        y = y & 0x01;
        my_fun_c1602_write_command(x + (y * 0x40) + 0x80);
        for (i = 0; i < strlen(s); i++) my_fun_c1602_write_data(s[i]);
}

void my_fun_c1602_initialization(void)
{
        my_fun_c1602_write_command(0x38);
        INSIDE_TIME_BEEP = 5;
        while(INSIDE_TIME_BEEP);
        my_fun_c1602_write_command(0x01);
        my_fun_c1602_write_command(0x02);
        my_fun_c1602_write_command(0x06);
        my_fun_c1602_write_command(0x0c);
}

#endif


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:45
  • 最近打卡:2025-02-14 13:39:49
已绑定手机

19

主题

273

回帖

2152

积分

金牌会员

积分
2152
QQ
发表于 2022-11-29 11:21:18 | 显示全部楼层
STC32G实验箱例程包里面有LCM接口驱动TFT屏的例子可以参考
123456.png
这个压缩包在官网https://www.stcai.com/yyfa上有


QQ:1638975601
手机:19952583876(微信同号)
  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-30 14:38:57

25

主题

977

回帖

3599

积分

超级版主

积分
3599
发表于 2022-11-29 12:33:09 | 显示全部楼层
本帖最后由 zhp 于 2022-11-29 12:37 编辑

使用LCM读写数据和命令,可参考下面的代码
  1. void lcm_wait()
  2. {
  3.     while (!(LCMIFSTA & 0x01));
  4.     LCMIFSTA &= ~0x01;
  5. }
  6. void lcm_write_cmd(char cmd)
  7. {
  8.     LCMIFDATL = (cmd);
  9.     LCMIFCR = 0x84;
  10.     lcm_wait();
  11. }
  12. void lcm_write_data(char dat)
  13. {
  14.     LCMIFDATL = (dat);
  15.     LCMIFCR = 0x85;
  16.     lcm_wait();
  17. }
  18. char lcm_read_status()
  19. {
  20.     LCMIFCR = 0x86;
  21.     lcm_wait();
  22.    
  23.     return LCMIFDATL;
  24. }
  25. char lcm_read_data()
  26. {
  27.     LCMIFCR = 0x87;
  28.     lcm_wait();
  29.    
  30.     return LCMIFDATL;
  31. }
复制代码

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-12 11:44:58

14

主题

39

回帖

304

积分

中级会员

积分
304
发表于 2022-11-29 16:33:38 | 显示全部楼层
谢谢,示例藏得够深:D
我先核对下楼上得
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-12 11:44:58

14

主题

39

回帖

304

积分

中级会员

积分
304
发表于 2022-11-30 12:15:44 | 显示全部楼层
研究一上午任然失败,液晶没任何反应,看了下二楼提供的65号DEMO,检测LCD忙部分都被注释掉了,用得还是常规方法,难道你们自己也没成功?
下面是修改过的程序,有空的话帮忙看看哪里还有错。
LCM暂时不用了
void my_fun_c1602_end(void)
{
        while (!(LCMIFSTA & 0x01));
        LCMIFSTA &= ~0x01;
}

void my_fun_c1602_busy(void)
{
        do {LCMIFCR = 0x86; my_fun_c1602_end();} while (LCMIFDATL & 0x80);
}

void my_fun_c1602_write_command(unsigned char x)
{
        P_SW2 |= 0x80;
        my_fun_c1602_busy();
        LCMIFDATL = x;
        LCMIFCR = 0x84;                        // Write Command
        my_fun_c1602_end();
        P_SW2 &= 0x7f;
}

void my_fun_c1602_write_data(unsigned char x)
{
        P_SW2 |= 0x80;
        my_fun_c1602_busy();
        LCMIFDATL = x;
        LCMIFCR = 0x85;                        // Write Data
        my_fun_c1602_end();
        P_SW2 &= 0x7f;
}

void my_fun_c1602_initialization(void)
{
        P_SW2 |= 0x80;
        LCMIFCFG = 0x01;                // 禁止中断, P2数据口, M6800模式
        LCMIFCFG2 = 0x5f;        //0x45        // E = P42, RS = P41, RW = P40
        LCMIFSTA &= ~0x01;
        LCMIFDATL = 0x38;                // 初始化, 8 Bit bus, 双行显示, 5x8 点阵
        LCMIFCR = 0x84;                        // Write Command
        my_fun_c1602_end();
        P_SW2 &= 0x7f;
        INSIDE_TIME_BEEP = 5;        // 延时50ms
        while(INSIDE_TIME_BEEP);
        my_fun_c1602_write_command(0x01);
        my_fun_c1602_write_command(0x02);
        my_fun_c1602_write_command(0x06);
        my_fun_c1602_write_command(0x0c);
}
  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2022-12-1 13:19:42 | 显示全部楼层
实验箱例程驱动LCD接口原先都是使用推挽输出模式,读取状态时用IO口驱动方式方便调整输入输出模式。其实使用LCM接口检测忙状态也是可以的,附件例程已经通过测试验证,请参考。

LCM_Test_6800_DMA_8bit_ST7920.zip (12.06 KB, 下载次数: 203)

另外,再发一份IO口驱动1602的例程供参考,效果如下:
1602-2.jpg
LCD1602显示程序.zip (13.16 KB, 下载次数: 191)

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-12 11:44:58

14

主题

39

回帖

304

积分

中级会员

积分
304
发表于 2022-12-3 09:43:14 | 显示全部楼层
谢谢,我不会为了某个功能专门试验,这次要用到LCD,想起有LCM这个功能,就按照相应硬件连线,就算试验失败也不影响使用,等有机会再继续。
STC挺好用的,目前用的8A8K64S4A12和8A8K64D4,就是内存太小,能加到32K就好了。
  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2022-12-3 21:43:00 | 显示全部楼层
STC32G12K128, SRAM 是 12K, FLASH 是 128K
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-12 11:44:58

14

主题

39

回帖

304

积分

中级会员

积分
304
发表于 2022-12-5 16:31:26 | 显示全部楼层
12K还是太小,目前大约用到20K,只好加了一片IDT71V256,好像没有国产的3.3V的62256,5V的也都是拆机片,不符合主要芯片使用国产的政策;FLASH倒是够了,40K不到,能不能设计少量大内存的种类,比如64D4/32G等,内存32K-48K最好,价格翻倍也能接受,当ARM用。
  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2022-12-5 18:00:15 | 显示全部楼层
整个系统都用 3.3V 的 可能更容易买到 相应的器件,STC 现在都是 1.9V ~ 5.5V, SRAM 3.3V 的更多, 5V 也是可以跑 3.3V 的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-5-2 06:27 , Processed in 0.130133 second(s), 109 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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