中微SC8F6790内置的LCD模块怎么驱动段码屏程序

中微SC8F6790内置的LCD模块怎么驱动段码屏程序,最好用c编写

img

img

img

你可以这样试试:

  • 第一步,需要设置LCD模块的端口方向。假设使用P1端口,可以使用以下代码设置P1为输出端口:
P1_DIR |= 0xFF;    // 将P1端口全部设置为输出
  • 第二步,需要定义一个数组来存储LCD的字符数据和位置信息:
uint8_t lcd[4][8] = {
    {0x00, 0x18, 0x24, 0x42, 0x42, 0x24, 0x18, 0x00},  // 第一行数据
    {0x00, 0x18, 0x24, 0x42, 0x42, 0x24, 0x18, 0x00},  // 第二行数据
    {0x00, 0x18, 0x24, 0x42, 0x42, 0x24, 0x18, 0x00},  // 第三行数据
    {0x00, 0x18, 0x24, 0x42, 0x42, 0x24, 0x18, 0x00}   // 第四行数据
};

// 定义一个变量来存储当前LCD的位置信息
uint8_t lcd_pos = 0;
  • 第三步,需要编写一个函数来显示LCD的字符数据。假设每个字符占用8个像素,可以使用以下代码来显示字符数据:
void lcd_show() {
    uint8_t i, j;
    for (i = 0; i < 4; i++) {       // 遍历每行数据
        for (j = 0; j < 8; j++) {   // 遍历每个像素点
            if (lcd[i][j] & (1 << lcd_pos)) {     // 判断当前像素点是否需要显示
                P1 |= 1 << j;   // 设置P1端口对应位置为高电平
            } else {
                P1 &= ~(1 << j);    // 设置P1端口对应位置为低电平
            }
        }
        // 根据LCD模块的工作方式,在每行数据显示完成后需要延时一定的时间
        delay_ms(1);
    }
    // 更新LCD的位置信息
    lcd_pos++;
    if (lcd_pos >= 8) {
        lcd_pos = 0;
    }
}

最后,在主程序中循环调用lcd_show()函数即可实现LCD的字符数据显示。当然,还需要编写其他辅助函数,如延时函数等,针对你具体的硬件平台进行适配。

不用通用gpio控制就可以了吗?

#include <sc8f.h>

// 定义段码表
unsigned char seg_table[] = {
    0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
};

void delay() {
    unsigned int i, j;
    for (i = 0; i < 100; i++) {
        for (j = 0; j < 1000; j++) {
            ;
        }
    }
}

void main() {
    // 初始化LCD模块
    LCDCON = 0x80;  // 使能LCD模块
    LCDSEG = 0x00;  // 清空段码

    // 显示数字0
    LCDSEG = seg_table[0];

    // 程序延时
    delay();

    // 显示数字1
    LCDSEG = seg_table[1];

    // 程序延时
    delay();

    // 显示数字2
    LCDSEG = seg_table[2];

    // 程序延时
    delay();

    // 显示数字3
    LCDSEG = seg_table[3];

    // 程序延时
    delay();

    // 关闭LCD模块
    LCDCON = 0x00;
}

首先定义了一个段码表,用于将数字转换为对应的段码。然后,我们使用LCDCON寄存器使能LCD模块,并使用LCDSEG寄存器设置要显示的段码。最后,我们使用一个简单的延时函数来控制数字的显示时间,并在显示完所有数字后关闭LCD模块。
需要注意的是,具体的驱动程序实现会因不同的段码屏而有所不同,因此需要根据具体的硬件和需求进行适当的修改。

中微SC8F6790芯片内置的LCD模块可以驱动各种类型的液晶显示器,包括段码屏。以下是一些基本步骤:

初始化LCD控制器寄存器,以选择适当的工作模式和接口参数。这需要根据具体的LCD屏幕型号进行设置。
设置LCD屏幕的硬件连接,如引脚和电源线路。
使用C语言编写程序,通过LCD控制器的寄存器来控制LCD屏幕的操作。例如,您可以使用LCD控制器的命令来设置像素点的颜色,或者打开/关闭特定的显示区域。
以下是一个示例代码,该代码使用了中微SC8F6790芯片内置的LCD模块并与一个16x2字符液晶显示器配合使用:

c

#include <sc.h>

// LCD控制器初始化函数
void lcd_init(void)
{
    // 配置LCD时钟频率、显示模式等参数
    LCD_CLK = 0;        // PLL=OFF
    LCD_CTL &= ~0x01;   // 取消休眠模式
    LCD_CTL |= 0x02;    // 应用VCC发生器
    LCD_CTL |= 0x10;    // 像素时钟下降沿采样
    LCD_CTL |= 0x20;    // 单行扫描
    LCD_CTL |= 0x40;    // 垂直脉冲高电平有效
    LCD_CTL |= 0x80;    // 水平脉冲低电平有效

    // 配置LCD屏幕的行数和列数
    LCD_CTRL1 = ((2 - 1) << 4) | (16 - 1);
}

// 在LCD屏幕上显示字符函数
void lcd_show_char(unsigned char x, unsigned char y, unsigned char c)
{
    unsigned char *addr;
    addr = (unsigned char *)0x2000 + (y * 16 + x) / 2;

    if(x % 2 == 0)
    {
        *addr = (*addr & 0x0F) | (c << 4);
    }
    else
    {
        *addr = (*addr & 0xF0) | (c & 0x0F);
    }
}

// 主函数
int main()
{
    // 初始化LCD控制器
    lcd_init();

    // 在LCD屏幕上显示字符串
    lcd_show_char(0, 0, 'H');
    lcd_show_char(1, 0, 'e');
    lcd_show_char(2, 0, 'l');
    lcd_show_char(3, 0, 'l');
    lcd_show_char(4, 0, 'o');
    lcd_show_char(5, 0, ',');
    lcd_show_char(6, 0, 'W');
    lcd_show_char(7, 0, 'o');
    lcd_show_char(8, 0, 'r');
    lcd_show_char(9, 0, 'l');
    lcd_show_char(10, 0, 'd');
    lcd_show_char(11, 0, '!');

    // 等待一段时间后退出程序
    delay_ms(5000);

    return 0;
}

这段示例代码仅供参考,实际的实现会根据具体的LCD屏幕型号和硬件连接方式进行调整。

可以借鉴下

 第一步:段码液晶屏最重要的参数:占空比、工作电压、偏压比。这三个参数都是非常重要的,都必须要满足。
  第二步:驱动的方式:我们根据 LCD 的驱动原理可以知道,LCD的像素点上面只能够加上 AC的电压,LCD显示器的对比度则是由 COM脚上的电压值减去 SEG 脚上的电压值来决定,当这个电压差在大于 LCD 饱和电压时就能够打开像素点,小于 LCD 阈值电压时就能关闭像素点了,LCD 型的MCU 已经由内建的 LCD 驱动电路自动产生出LCD驱动信号了,因此只需要 I/O 口能仿真输
  出该驱动的信号,就能够完成 LCD 的驱动了。
  段码液晶屏主要是有两种引脚,COM和SEG,和数码管比较像,但是,压差必须要是交替变化的,例:第一时刻是正向的3V,那么第二时刻就必须要是反向的3V,注意一点,如果你给段码液晶屏通直流电,那么不用多久这个屏幕就会报废,所以千万要注意。下面我们就来考虑如何模拟COM口的波形,我们以1/4D,1/2B为例子:
  段码LCD屏的驱动方法
  只要模拟出以上的波形,你的液晶屏就已经成功了一大半。
  void display_sub(u8 y) //lcd display subroutine
  {
   switch(y) //4*com,VDD and -VDD LCD display,so 8 timebase interrupt one sacn period
   {
   case 1:
   {com1_output_high();break;}
   case 2:
   {com1_output_low();break;}
   case 3:
   {com2_output_high();break;}
   case 4:
   {com2_output_low();break;}
   case 5:
   {com3_output_high();break;}
   case 6:
   {com3_output_low();break;}
   case 7:
   {com4_output_high();break;}
   case 8:
   {com4_output_low();break;}
   default:
   {LCDPluseStep=0;
   get_display_code(AD_Value,KeyScanRetVal);
   break;}
   }
  }
 
  同时我们还要注意,在COM的输出较高的时候,如果要屏幕亮,那么SEG就要输出低,那么在COM输出低的时候,SEG就要输出高了,保证COM和SEG的压差大于1/2B工作电压就可以正常显示了
  下面我们看其中一个com口输出时的函数
  static void seg1_output(void) //seg1 output subroutine
  {
   if(1 == (LCDPluseStep%2)) //com_pulse is odd,com output high (VDD)
   {
   if(0 == (DisplayCode1&0x10))
   {SEG1=1;}
   else
   {SEG1=0;}
   }
   else //com_pulse is even,com output low (VSS)
   {
   if(0 == (DisplayCode1&0x10))
   {SEG1=0;}
   else
   {SEG1=1;}
   }
  }

在这个程序中,我们首先定义了数码管的段码和位码,其中段码是用于控制数码管每个段的亮灭状态,位码则是用于控制数码管的每个位的亮灭状态。然后,我们定义了一个Display()函数,用于显示一个4位数字。在Display()函数中,我们首先设置数码管的位码,然后设置数码管的段码,最后进行一定的延时,以便数码管能够正常显示。在main()函数中,我们不断调用Display()函数,以显示数字1234。


```c
#include <SC8F6790.h>
 // 数码管段码定义
unsigned char code SegCode[10] = {
    0x3F,   // 0
    0x06,   // 1
    0x5B,   // 2
    0x4F,   // 3
    0x66,   // 4
    0x6D,   // 5
    0x7D,   // 6
    0x07,   // 7
    0x7F,   // 8
    0x6F    // 9
};
 // 数码管位码定义
unsigned char code BitCode[4] = {
    0x01,   //10x02,   //20x04,   //30x08    //4位
};
 // 数码管显示函数
void Display(unsigned char num) {
    unsigned char i;
    for (i = 0; i < 4; i++) {
        // 设置数码管位码
        P1 = BitCode[i];
        // 设置数码管段码
        P0 = SegCode[num % 10];
        // 数码管扫描延时
        Delay(1);
        // 取下一位数字
        num /= 10;
    }
}
 int main() {
    while (1) {
        // 显示数字1234
        Display(1234);
    }
    return 0;
}

```

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    对于中微SC8F6790芯片内置的LCD模块,可以采取以下步骤来驱动段码屏程序: 1.对SC8F6790芯片进行初始化配置,包括端口、时钟等设置。 2.配置LCD模块初始化参数,进行正常模式、静态驱动等设置。 3.编写驱动LCD的函数,根据具体的LCD屏幕型号进行匹配。 4.编写段码数据的解析函数,按照LCD屏幕型号对应的位数进行解析,并显示在屏幕上。 5.编写相关的提示信息,提供给用户使用。

    以下是一个简单的C语言驱动LCD的例子:

    #include "sc8f6790.h"
    
    // 初始化SC8F6790芯片
    void initSC8F6790() {
        // 配置端口
        P1_DIR = 0xFF; // 将P1端口设置为输出
        P1 = 0x00; // 初始化清零
    
        // 配置时钟
        CLKCON = 0x00; // 配置为正常模式,4MHz
    }
    
    // 初始化LCD模块
    void initLCD() {
        // 配置LCD模块
        LCD_CON4 = 0x80; // 配置为正常模式,静态驱动
    }
    
    // 显示数据到LCD屏幕
    void showLCD(char* data) {
        // 根据LCD屏幕型号和位数解析数据,并显示在屏幕上
        // ...
    }
    
    // 添加提示信息
    void tipLCDDisplay() {
        printf("LCD is displaying...\n");
    }
    
    // 主函数
    int main() {
        // 初始化SC8F6790芯片
        initSC8F6790();
    
        // 初始化LCD模块
        initLCD();
    
        // 显示数据到LCD屏幕
        char data[] = "1234567890";
        showLCD(data);
    
        // 添加提示信息
        tipLCDDisplay();
    
        return 0;
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

可以参考下面的示例

#include "STC8Fxx.h"

void InitLCD()
{
    // 初始化LCD控制器
    LCD_CTRL &= ~(1 << 7);   // 禁止自动刷新
    LCD_SEG = 0x00;          // 清空段码
    LCD_COM = 0x00;          // 清空COM口
    LCD_CTRL |= (1 << 7);    // 允许自动刷新
}

void DisplayString()
{
    char* str = "Hello World!";
    unsigned char i;

    for (i = 0; i < 12; i++) {
        LCD_SEG = *str++;        // 写入一个字符
        LCD_COM = i % 4;         // 选择COM口
        Delay(100);              // 等待一段时间,让显示更稳定
    }
}

void main()
{
    InitLCD();          // 初始化LCD控制器
    DisplayString();    // 显示字符串
}

下面是C语言示例

#include <reg52.h>        //此处要根据具体芯片进行修改
#define LCD_WR_PORT P1
#define LCD_DATA_PORT P2
sbit RS = P1^0;
sbit RW = P1^1;
sbit EN = P1^2;

void delay_ms(unsigned int nms)
{
    unsigned int i,j;
    for(i=0;i<nms;i++)
        for(j=0;j<129;j++);
}

void Write_Cmd(unsigned int cmd)
{
    RS=0;
    RW=0;
    EN=1;
    LCD_DATA_PORT=cmd;
    delay_ms(1);
    EN=0;
}

void Write_Data(unsigned int dat)
{
    RS=1;
    RW=0;
    EN=1;
    LCD_DATA_PORT=dat;
    delay_ms(1);
    EN=0;
}

void Init_LCD()
{
    Write_Cmd(0x38);    //设置8位数据线,两行显示,5*7点阵
    Write_Cmd(0x0c);    //开显示,关闭光标
    Write_Cmd(0x06);    //光标加,不移位
    Write_Cmd(0x01);    //清屏
    Write_Cmd(0x80);    //设光标位置为第一行第一列
}

void Display_String(char *s)
{
    while((*s)!='\0')
    {
        Write_Data(*s);
        s++;
        delay_ms(10);    //延时
    }
}

void main()
{
    Init_LCD();
    Display_String("Hello, World!");
    while(1);
}