找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 397|回复: 14
打印 上一主题 下一主题
收起左侧

大佬们看看,我找不到哪错了

[复制链接]
跳转到指定楼层
楼主
ID:1144486 发表于 2025-4-3 10:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
LCD1602.h(12): error C129: missing ';' before 'lcdQueue'

#include"delay.h"
#ifndef __LCD1602_H__
#define __LCD1602_H__
                    //添加延时函数头文件
#define LCD_PINDATA P0          //数据端口定义

sbit RS  =  P1^4;                  //RS
sbit RW  =  P1^5;                  //RW
sbit E   =  P1^6;                  //E

// 初始化LCD队列
LCD_Command lcdQueue[LCD_QUEUE_SIZE];
volatile bit lcdBusy = 0;
unsigned char lcdQueueHead = 0;
unsigned char lcdQueueTail = 0;
unsigned char lcdQueueCount = 0;

// 函数实现
void WriteCOMDATA(unsigned char dat, unsigned char cmd)
{
    // 如果队列已满,返回,防止死循环
    if(lcdQueueCount >= LCD_QUEUE_SIZE) return;

    // 添加到队列
    lcdQueue[lcdQueueTail].data = dat;
    lcdQueue[lcdQueueTail].isCommand = cmd;
    lcdQueueTail = (lcdQueueTail + 1) % LCD_QUEUE_SIZE;
    lcdQueueCount++;
}

unsigned char CheckBusy(void) {
    LCD_PINDATA = 0xFF; // 设置数据端口为输入模式
    RS = 0;              // 选择指令寄存器
    RW = 1;              // 设置为读模式
    E = 1;               // 使能高电平
    unsigned char busy = (LCD_PINDATA & 0x80); // 读取忙标志
    E = 0;               // 使能低电平
    return busy;
}

void LCD_Process(void)
{
    if(lcdQueueCount > 0 && !lcdBusy)
    {
        // 从队列中取出下一个命令或数据
        LCD_Command cmd = lcdQueue[lcdQueueHead];
        lcdQueueHead = (lcdQueueHead + 1) % LCD_QUEUE_SIZE;
        lcdQueueCount--;

        lcdBusy = 1;

        // 发送命令或数据
        E = 0;
        RS = cmd.isCommand ? 0 : 1; // 命令模式或数据模式
        RW = 0; // 写模式
        LCD_PINDATA = cmd.data;
        Delay_us(1); // 短暂延时,确保数据稳定
        E = 1; // 使能高电平
        Delay_us(1); // 等待数据稳定
        E = 0; // 使能低电平
        Delay_us(20); // 命令执行时间(根据LCD数据手册调整)

        lcdBusy = 0;
    }
}

void WriteCOMDATA(uchar LCD_DATA,uchar N)
{
        Delay(5);
        E=1;
        RW=0;
        RS=N;
        LCD_PINDATA=LCD_DATA;
        E=0;
}

void LCD_Init(void)
{
    WriteCOMDATA(0x01,0);
        Delay(500);
        WriteCOMDATA(0x38,0);
        Delay(10);
        WriteCOMDATA(0x06,0);
        Delay(10);
        WriteCOMDATA(0x0C,0);
        Delay(10);
}

void WriteChar(uchar Row,uchar Col,uchar Num,uchar *pBuffer)
{
        uchar i;
        if(Row==1)Row=0x80+Col;
        else Row=0xC0+Col;
        WriteCOMDATA(Row,0);
        for(i=Num;i!=0;i--)
        {       
                WriteCOMDATA(*pBuffer,1);       
                pBuffer++;
        }
}

#endif

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1109793 发表于 2025-4-3 12:32 | 只看该作者
LCD_Command定义在哪儿?
回复

使用道具 举报

板凳
ID:1144486 发表于 2025-4-3 12:47 | 只看该作者
#ifndef __LCD1602_H__
#define __LCD1602_H__

#include "delay.h"                    //添加延时函数头文件
#include <reg52.h>           // 确保包含单片机相关的头文件

// 添加 uchar 类型定义
typedef unsigned char uchar;

// 数据端口定义
#define LCD_PINDATA P0          //数据端口定义

// 控制端口定义
sbit RS  =  P1^4;                  //RS
sbit RW  =  P1^5;                  //RW
sbit E   =  P1^6;                  //E

// 添加队列长度定义
#define LCD_QUEUE_SIZE 32

// 结构体定义
typedef struct {
    unsigned char data;
    unsigned char isCommand;
} LCD_Command;

// 初始化LCD队列
LCD_Command lcdQueue[LCD_QUEUE_SIZE];
volatile bit lcdBusy = 0;
unsigned char lcdQueueHead = 0;
unsigned char lcdQueueTail = 0;
unsigned char lcdQueueCount = 0;

// 函数声明
void WriteCOMDATA(unsigned char dat, unsigned char cmd);
unsigned char CheckBusy(void);
void LCD_Process(void);
void WriteChar(uchar Row, uchar Col, uchar Num, uchar *pBuffer);
void LCD_Init(void);

// 函数实现
void WriteCOMDATA(unsigned char dat, unsigned char cmd)
{
    // 如果队列已满,返回,防止死循环
    if(lcdQueueCount >= LCD_QUEUE_SIZE) return;

    // 添加到队列
    lcdQueue[lcdQueueTail].data = dat;
    lcdQueue[lcdQueueTail].isCommand = cmd;
    lcdQueueTail = (lcdQueueTail + 1) % LCD_QUEUE_SIZE;
    lcdQueueCount++;
}

unsigned char CheckBusy(void) {
    LCD_PINDATA = 0xFF; // 设置数据端口为输入模式
    RS = 0;              // 选择指令寄存器
    RW = 1;              // 设置为读模式
    E = 1;               // 使能高电平
    unsigned char busy = (LCD_PINDATA & 0x80); // 读取忙标志
    E = 0;               // 使能低电平
    return busy;
}

void LCD_Process(void)
{
    if(lcdQueueCount > 0 && !lcdBusy)
    {
        // 从队列中取出下一个命令或数据
        LCD_Command cmd = lcdQueue[lcdQueueHead];
        lcdQueueHead = (lcdQueueHead + 1) % LCD_QUEUE_SIZE;
        lcdQueueCount--;

        lcdBusy = 1;

        // 发送命令或数据
        E = 0;
        RS = cmd.isCommand ? 0 : 1; // 命令模式或数据模式
        RW = 0; // 写模式
        LCD_PINDATA = cmd.data;
        Delay_us(1); // 短暂延时,确保数据稳定
        E = 1; // 使能高电平
        Delay_us(1); // 等待数据稳定
        E = 0; // 使能低电平
        Delay_us(20); // 命令执行时间(根据LCD数据手册调整)

        lcdBusy = 0;
    }
}

void LCD_Init(void)
{
    Delay_ms(20); // 上电延时,确保LCD稳定
    WriteCOMDATA(0x38, 1); // 功能设置:8位模式,双行显示
    Delay_ms(5);
    WriteCOMDATA(0x38, 1); // 重复发送确保初始化成功
    Delay_ms(1);
    WriteCOMDATA(0x0C, 1); // 显示开,光标关
    Delay_ms(1);
    WriteCOMDATA(0x06, 1); // 光标右移
    Delay_ms(1);
    WriteCOMDATA(0x01, 1); // 清屏
    Delay_ms(2); // 清屏需要较长延时
}

void WriteChar(uchar Row, uchar Col, uchar Num, uchar *pBuffer)
{
    uchar address;
    if(Row == 1)
        address = 0x80 + Col;
    else
        address = 0xC0 + Col;
    WriteCOMDATA(address, 1); // 设置光标位置
    for(uchar i = 0; i < Num; i++)
    {
        WriteCOMDATA(*pBuffer++, 0); // 写入数据
    }
}

#endif
回复

使用道具 举报

地板
ID:1144486 发表于 2025-4-3 12:48 | 只看该作者
xiaobendan001 发表于 2025-4-3 12:32
LCD_Command定义在哪儿?

// 结构体定义
typedef struct {
    unsigned char data;
    unsigned char isCommand;
} LCD_Command;                  这个可以吗
回复

使用道具 举报

5#
ID:1144486 发表于 2025-4-3 12:48 | 只看该作者
这个可以吗// 结构体定义 typedef struct {     unsigned char data;     unsigned char isCommand; } LCD_Command;
回复

使用道具 举报

6#
ID:1144486 发表于 2025-4-3 12:51 | 只看该作者
后面定义后面加了// 结构体定义
typedef struct {
    unsigned char data;
    unsigned char isCommand;
} LCD_Command;
回复

使用道具 举报

7#
ID:1144486 发表于 2025-4-3 12:58 | 只看该作者
xiaobendan001 发表于 2025-4-3 12:32
LCD_Command定义在哪儿?

这个算吗

#include <reg52.h>           // 确保包含单片机相关的头文件

// 添加 uchar 类型定义
unsigned char data;
unsigned char isCommand;
unsigned char LCD_Command

// 数据端口定义
#define LCD_PINDATA P0          //数据端口定义
回复

使用道具 举报

8#
ID:879809 发表于 2025-4-3 13:35 | 只看该作者
没贴全,把完整文件传上来。
回复

使用道具 举报

9#
ID:1121801 发表于 2025-4-3 13:37 | 只看该作者
变量lcdQueue定义缺少;号,查一下定义变量的语句啊
回复

使用道具 举报

10#
ID:1109793 发表于 2025-4-3 15:00 | 只看该作者
窃格瓦拉101 发表于 2025-4-3 12:51
后面定义后面加了// 结构体定义
typedef struct {
    unsigned char data;

这个要加在前边吧
回复

使用道具 举报

11#
ID:1144486 发表于 2025-4-3 16:06 | 只看该作者
#ifndef __LCD1602_H__
#define __LCD1602_H__

#include <reg52.h>

// ===== 必须添加的延时函数原型声明 =====
void Delay_us(unsigned int us);  // 微秒级延时声明
void Delay_ms(unsigned int ms);  // 毫秒级延时声明

// ========== 硬件接口定义 ==========
#define LCD_PINDATA P0
#define LCD_QUEUE_SIZE 32

// 控制端口定义
sbit RS  = P1^4;
sbit RW  = P1^5;
sbit E   = P1^6;

// ========== 全局变量定义 ==========
unsigned char lcdData[LCD_QUEUE_SIZE];
unsigned char lcdCmd[LCD_QUEUE_SIZE];
volatile bit lcdBusy = 0;
unsigned char lcdQueueHead = 0;
unsigned char lcdQueueTail = 0;
unsigned char lcdQueueCount = 0;

// ========== 函数声明 ==========
void WriteCOMDATA(unsigned char dat, unsigned char cmd);
unsigned char CheckBusy(void);
void LCD_Process(void);
void WriteChar(unsigned char Row, unsigned char Col, unsigned char Num, unsigned char *pBuffer);
void LCD_Init(void);

// ========== 函数实现 ==========
void WriteCOMDATA(unsigned char dat, unsigned char cmd)
{
    if(lcdQueueCount >= LCD_QUEUE_SIZE) return;
    lcdData[lcdQueueTail] = dat;
    lcdCmd[lcdQueueTail] = cmd;
    lcdQueueTail = (lcdQueueTail + 1) % LCD_QUEUE_SIZE;
    lcdQueueCount++;
}

unsigned char CheckBusy(void)
{
    unsigned char busy;
    LCD_PINDATA = 0xFF;  // 设置输入模式
    RS = 0;  // 命令模式
    RW = 1;  // 读操作
    E = 1;   // 使能高电平
    busy = (LCD_PINDATA & 0x80);  // 读取忙标志
    E = 0;   // 使能低电平
    return busy;
}

void LCD_Process(void)
{
    if(lcdQueueCount > 0 && !lcdBusy)
    {
        unsigned char cmd = lcdCmd[lcdQueueHead];
        unsigned char dat = lcdData[lcdQueueHead];
        lcdQueueHead = (lcdQueueHead + 1) % LCD_QUEUE_SIZE;
        lcdQueueCount--;

        lcdBusy = 1;
        E = 0;
        RS = (cmd == 1) ? 1 : 0;  // cmd=1:数据模式, cmd=0:命令模式
        RW = 0;  // 写操作
        LCD_PINDATA = dat;
        Delay_us(1);  // 等待信号稳定
        E = 1;        // 产生使能脉冲
        Delay_us(1);
        E = 0;
        Delay_us(40);  // 确保命令执行时间

        lcdBusy = 0;
    }
}

void LCD_Init(void)
{
    Delay_ms(20);  // LCD上电稳定时间
    WriteCOMDATA(0x38, 0);  // 功能设置:8位,2行,5x8点阵
    Delay_ms(5);
    WriteCOMDATA(0x0C, 0);  // 显示开,光标关
    Delay_ms(5);
    WriteCOMDATA(0x06, 0);  // 光标右移
    Delay_ms(5);
    WriteCOMDATA(0x01, 0);  // 清屏
    Delay_ms(2);
}

void WriteChar(unsigned char Row, unsigned char Col, unsigned char Num, unsigned char *pBuffer)
{
    unsigned char address;
    // 计算DDRAM地址
    address = (Row == 1) ? (0x80 + Col) : (0xC0 + Col);
    WriteCOMDATA(address, 0);  // 发送地址命令
    while(Num--)
    {
        WriteCOMDATA(*pBuffer++, 1);  // 发送字符数据
    }
}

#endif // __LCD1602_H__
回复

使用道具 举报

12#
ID:1144486 发表于 2025-4-3 16:07 | 只看该作者
cyi8 发表于 2025-4-3 13:37
变量lcdQueue定义缺少;号,查一下定义变量的语句啊

看着好像没出什么毛病
回复

使用道具 举报

13#
ID:1144486 发表于 2025-4-3 16:18 | 只看该作者
main.c(352): error C249: 'DATA': SEGMENT TOO LARGE  
,是不是要用什么结构体来一键定义全局变量
程序:#include <reg52.h>
#include "LCD1602.h"
#include "dht11.h"
#include "adc0832.h"
#include "delay.h"
#include <math.h>
#include <stdio.h>

// 硬件接口定义
sbit BUZZER = P1^3;      // 蜂鸣器连接P1^3
sbit LED1 = P2^0;        // LED1 连接P2^0
sbit LED2 = P2^1;        // LED2 连接P2^1
sbit LED3 = P2^2;
sbit LED4 = P2^3;
sbit LED5 = P2^4;

// 矩阵键盘定义
#define ROWS 4
#define COLS 4
sbit ROW1 = P3^0;
sbit ROW2 = P3^1;
sbit ROW3 = P3^2;
sbit ROW4 = P3^3;
sbit COL1 = P3^4;
sbit COL2 = P3^5;
sbit COL3 = P3^6;
sbit COL4 = P3^7;

// 函数声明
void InitUART(void);
void UART_send_byte(char dat);
void UART_send_string(unsigned char *buf);
void check_thresholds(void);
void check_alarms(void);
void update_display(void);
void set_parameters(void);
unsigned char get_key(void);
void LCD_Process(void);
unsigned char scan_key(void);  // 添加函数原型

// 全局变量
unsigned char keymap[ROWS][COLS] = {
    {'1','2','3','A'},
    {'4','5','6','B'},
    {'7','8','9','C'},
    {'*','0','#','D'}
};

char disp1[16] = "PM2.5:0000ug/m3 ";
char disp2[16] = "T :00C    RH:00%";

unsigned char Rx_buf[4], Rxnum = 0;
int T1L = 15, T1H = 35, R1L = 30, R1H = 80;
double PM, pm1 = 0.0, pm2 = 0.0;
int PMVAL = 0, HPM = 200, PM_count = 0, pm1_count = 0;
unsigned char T1_data = 0, R1_data = 0, T2_data = 0, R2_data = 0; // 温度、湿度变量
unsigned char shezhi_flag = 1, Mode_flag = 1, n = 1; // 设置变量
unsigned char buzzer_flag = 0, count = 0, buzzer_time = 9; // 蜂鸣器报警变量
unsigned long Mode_count = 0;

// 主函数
void main(void)
{
    // 初始化代码
    InitUART(); // 初始化串口
    LCD_Init();
    WriteChar(1, 0, 16, "PM2.5:0000ug/m3 "); // 在第一行显示‘PM2.5:0000ug/m3 ’
    WriteChar(2, 0, 16, "T :00C    RH:00%"); // 在第二行显示‘T :00C    RH:00%’

    while(1)
    {
        unsigned char key;  // 变量声明移至代码块开始

        // 读取传感器数据
        T1_data = Read_TRH(0, 0); // 温度
        disp2[3] = T1_data / 10 + '0'; // 十位
        disp2[4] = T1_data % 10 + '0'; // 个位

        R1_data = Read_TRH(1, 0); // 湿度
        disp2[13] = R1_data / 10 + '0'; // 十位
        disp2[14] = R1_data % 10 + '0'; // 个位

        // PM2.5 数据处理
        pm1 += read_data(1);
        if(++PM_count >= 20)
        {
            PM_count = 0;
            pm1 /= 20.0;
            pm2 += pm1;
            pm1 = 0.0;
            if(++pm1_count >= 5)
            {
                pm1_count = 0;
                PM = pm2 / 5.0;
                PM = (PM * 50.0 / 255.0) - 4.0;
                PM /= 5.0;
                PM *= 1000.0;
                PMVAL = (int)PM;
                PMVAL += 235;
                PMVAL /= 9;
                if(PMVAL >= 9999) PMVAL = 9999;
                // PM2.5 显示
                WriteCOMDATA(0x86, 0);
                if(PMVAL < 0)
                {
                    WriteCOMDATA('0', 1);
                    PMVAL = abs(PMVAL);
                }
                else
                {
                    WriteCOMDATA((PMVAL / 1000 % 10 + '0'), 1);
                    WriteCOMDATA((PMVAL / 100 % 10 + '0'), 1);
                    WriteCOMDATA((PMVAL / 10 % 10 + '0'), 1);
                    WriteCOMDATA((PMVAL % 10 + '0'), 1);
                }
                pm1 = pm2 = 0.0;
            }
        }

        // 报警检测
        check_thresholds();
        check_alarms();

        // 更新显示
        update_display();

        // 设置模式处理
        if(Mode_flag == 0)
        {
            set_parameters();
        }

        // 处理LCD队列
        LCD_Process();

        // 按键处理
        key = get_key();
        if(key)
        {
            switch(key)
            {
                case '1':
                    T1L = (T1L < T1H - 1) ? T1L + 1 : T1H - 1;
                    break;
                case '2':
                    T1L = (T1L > 0) ? T1L - 1 : 0;
                    break;
                case '3':
                    T1H = (T1H < 99) ? T1H + 1 : 99;
                    break;
                case 'A':
                    T1H = (T1H > T1L + 1) ? T1H - 1 : T1L + 1;
                    break;
                case '4':
                    R1L = (R1L < R1H - 1) ? R1L + 1 : R1H - 1;
                    break;
                case '5':
                    R1L = (R1L > 0) ? R1L - 1 : 0;
                    break;
                case '6':
                    R1H = (R1H < 99) ? R1H + 1 : 99;
                    break;
                case 'B':
                    R1H = (R1H > R1L + 1) ? R1H - 1 : R1L + 1;
                    break;
                case '7':
                    HPM = (HPM < 9999) ? HPM + 1 : 9999;
                    break;
                case '8':
                    HPM = (HPM > 0) ? HPM - 1 : 0;
                    break;
                case '9':
                    HPM = (HPM < 9999) ? HPM + 1 : 9999;
                    break;
                case 'C':
                    HPM = (HPM > 0) ? HPM - 1 : 0;
                    break;
                case '*':
                    shezhi_flag = (shezhi_flag + 1) % 4;
                    break;
                case '0':
                    shezhi_flag = 0;
                    break;
                case '#':
                    shezhi_flag = 0;
                    break;
                case 'D':
                    Mode_flag = !Mode_flag;
                    break;
                default:
                    break;
            }
        }
    }
}

// 获取按键函数(添加消抖机制)
unsigned char get_key(void)
{
    static unsigned char last_key = 0;
    unsigned char new_key = scan_key();
    if(new_key != 0 && new_key == last_key)
    {
        Delay_ms(10);  // 消抖延时
        if(new_key == scan_key()) return new_key;
    }
    last_key = new_key;
    return 0;
}

// 扫描按键函数(修正行列扫描逻辑)
unsigned char scan_key(void)
{
    unsigned char row, col;
    for(row = 0; row < ROWS; row++)
    {
        // 行扫描
        switch(row)
        {
            case 0: COL1 = 0; COL2 = COL3 = COL4 = 1; break;
            case 1: COL2 = 0; COL1 = COL3 = COL4 = 1; break;
            case 2: COL3 = 0; COL1 = COL2 = COL4 = 1; break;
            case 3: COL4 = 0; COL1 = COL2 = COL3 = 1; break;
        }
        Delay_ms(2); // 消抖延时

        for(col = 0; col < COLS; col++)
        {
            if(!ROW1 && col == 0) return keymap[row][col];
            else if(!ROW2 && col == 1) return keymap[row][col];
            else if(!ROW3 && col == 2) return keymap[row][col];
            else if(!ROW4 && col == 3) return keymap[row][col];
        }

        // 恢复列状态
        COL1 = COL2 = COL3 = COL4 = 1;
    }
    return 0; // 无按键按下
}

// 阈值检测函数
void check_thresholds(void)
{
    LED1 = (T1_data > T1H) ? 1 : 0;
    LED2 = (T1_data < T1L) ? 1 : 0;
    LED3 = (R1_data > R1H) ? 1 : 0;
    LED4 = (R1_data < R1L) ? 1 : 0;
    LED5 = (PMVAL > HPM) ? 1 : 0;
}

// 报警检测函数
void check_alarms(void)
{
    static unsigned char alarm_cnt = 0;
    if(T1_data > T1H || T1_data < T1L ||
       R1_data > R1H || R1_data < R1L ||
       PMVAL > HPM){
        BUZZER = 0; // 低电平触发蜂鸣器
        alarm_cnt = 50; // 持续报警时间
    }
    else if(alarm_cnt > 0){
        BUZZER = (alarm_cnt-- % 2); // 间歇报警
    }
    else{
        BUZZER = 1; // 关闭蜂鸣器
    }
}

// 显示更新函数
void update_display(void)
{
    char buf[16];
    if(Mode_flag)
    {
        // 实时数据显示
        sprintf(buf, "T:%02d RH:%02d", T1_data, R1_data);
        WriteChar(2, 0, 16, buf);
    }
    else
    {
        // 参数设置显示
        char disp_set[16];
        switch(shezhi_flag)
        {
            case 1: sprintf(disp_set, "T_SET:%02d-%02d ", T1L, T1H); break;
            case 2: sprintf(disp_set, "H_SET:%02d-%02d ", R1L, R1H); break;
            case 3: sprintf(disp_set, "PM_SET:%04d ", HPM); break;
            default: sprintf(disp_set, "SET MODE      "); break;
        }
        WriteChar(2, 0, 16, disp_set);
    }
}

// 参数设置函数
void set_parameters(void)
{
    unsigned char key = get_key();
    if(key)
    {
        switch(key)
        {
            case '1':
                T1L = (T1L < T1H - 1) ? T1L + 1 : T1H - 1;
                break;
            case '2':
                T1L = (T1L > 0) ? T1L - 1 : 0;
                break;
            case '3':
                T1H = (T1H < 99) ? T1H + 1 : 99;
                break;
            case 'A':
                T1H = (T1H > T1L + 1) ? T1H - 1 : T1L + 1;
                break;
            case '4':
                R1L = (R1L < R1H - 1) ? R1L + 1 : R1H - 1;
                break;
            case '5':
                R1L = (R1L > 0) ? R1L - 1 : 0;
                break;
            case '6':
                R1H = (R1H < 99) ? R1H + 1 : 99;
                break;
            case 'B':
                R1H = (R1H > R1L + 1) ? R1H - 1 : R1L + 1;
                break;
            case '7':
                HPM = (HPM < 9999) ? HPM + 1 : 9999;
                break;
            case '8':
                HPM = (HPM > 0) ? HPM - 1 : 0;
                break;
            case '9':
                HPM = (HPM < 9999) ? HPM + 1 : 9999;
                break;
            case 'C':
                HPM = (HPM > 0) ? HPM - 1 : 0;
                break;
            case '*':
                shezhi_flag = (shezhi_flag + 1) % 4;
                break;
            case '0':
            case '#':
                shezhi_flag = 0;
                break;
            case 'D':
                Mode_flag = !Mode_flag;
                break;
            default:
                break;
        }
    }
}
回复

使用道具 举报

14#
ID:1146851 发表于 2025-4-3 17:20 | 只看该作者
在使用 LCD_Command 定义数组 lcdQueue 之前,先定义 LCD_Command 结构体类型。
回复

使用道具 举报

15#
ID:1109793 发表于 2025-4-4 08:31 | 只看该作者
窃格瓦拉101 发表于 2025-4-3 16:18
main.c(352): error C249: 'DATA': SEGMENT TOO LARGE  
,是不是要用什么结构体来一键定义全局变量 ...

翻译一下提示内容嘛
大概是代码使用超了DATA容量了,比如你可以把unsigned char keymap[ROWS][COLS] 改成unsigned char code keymap[ROWS][COLS]
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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