找回密码
 立即注册
查看: 119|回复: 3

求教

[复制链接]

3

主题

2

回帖

33

积分

新手上路

积分
33
发表于 2026-8-20 23:02:11 | 显示全部楼层 |阅读模式
#include <AI8051U.H>

#define LCD1602_DATAPORT    P0
sbit LCD1602_RS      =    P2^6;
sbit LCD1602_RW     =     P3^7;
sbit LCD1602_E         =  P2^7;


void LCD_Delay1ms(void)        //@40.000MHz
{
        unsigned long edata i;

        _nop_();
        _nop_();
        _nop_();
        i = 9998UL;
        while (i) i--;
}



void LCD_WriteCommand(unsigned char Command)
{
                 LCD1602_RS=0;
        LCD1602_RW=0;
        LCD1602_E=0;
        LCD1602_DATAPORT=Command;
        LCD1602_E=1;
        LCD_Delay1ms();
        LCD1602_E=0;
        LCD_Delay1ms();
}

void LCD_WriteData(unsigned char Data)
{
                         LCD1602_RS=1;
        LCD1602_RW=0;
        LCD1602_E=0;
        LCD1602_DATAPORT=Data;
        LCD1602_E=1;
        LCD_Delay1ms();
        LCD1602_E=0;
        LCD_Delay1ms();
}

void LCD_Init()
{
                LCD_WriteCommand(0x38);
        LCD_WriteCommand(0x0c);
        LCD_WriteCommand(0x06);
        LCD_WriteCommand(0x01);
}

void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
{
                if(Line==1)
                {
                                LCD_WriteCommand(0x80+Column-1);
                }
                else
                {
                                LCD_WriteCommand(0x80+Column-1+0x40);
                }
                LCD_WriteData(Char);
}

void LCD_ShowString(unsigned char x,unsigned char y,unsigned char *String)
{
        unsigned char i=0;
               
        if(y==1)       
        {       
                while(*String!='\0')
                {
                        if(i<16-x)
                        {
                                LCD_WriteCommand(0x80+x-1+i);
                        }
                        else
                        {
                                LCD_WriteCommand(0x80+x-1+0x40-16);
                        }
                        LCD_WriteData(*String);
                        String++;
                        i++;       
                }       
        }
        else       
        {       
                while(*String!='\0')
                {
                        if(i<16-x)
                        {
                                LCD_WriteCommand(0x80+x-1+i+0x40);
                        }
               
                        LCD_WriteData(*String);
                        LCD_Delay1ms();
                        String++;
                        i++;       
                }       
        }
}
#include <AI8051U.H>
#include "LCD1602.h"
void main()
{
  P0M1 = 0x00;  P0M0 = 0xff;   // P0 数据口:推挽输出
    P2M1 = 0x00;  P2M0 = 0xff;   // P2 (RS、E 及备用):推挽输出
    P3M1 &= ~0x80; P3M0 |= 0x80; // P3.7 (RW):推挽输出
       
        LCD_Init();
        LCD_ShowChar(1,1,'A');
        LCD_ShowString(3,1,"Hello");
  while(1)
    {

     }
}
字符串打印出来的是一段乱码

0a905eb01bc69ce892a236a3c99f8d75.jpg
回复

使用道具 举报 送花

865

主题

1万

回帖

2万

积分

管理员

积分
25122
发表于 2026-8-21 21:53:20 | 显示全部楼层
截图202608212153168381.jpg
回复

使用道具 举报 送花

865

主题

1万

回帖

2万

积分

管理员

积分
25122
发表于 2026-8-21 21:53:37 | 显示全部楼层

我已经完整阅读了您分享的这个论坛帖子。让我为您总结一下这个帖子的内容以及我的分析建议。


帖子内容总结

您分享的是**国芯人工智能技术交流网站(AI32位8051交流社区)**中的一篇求助帖(TID 25345)。

帖子内容是一位用户在 AI8051U 芯片上使用 LCD1602 液晶显示屏 的驱动代码,完整代码包含以下函数:

#include 

#define LCD1602_DATAPORT    P0
sbit LCD1602_RS    = P2^6;
sbit LCD1602_RW    = P3^7;
sbit LCD1602_E     = P2^7;

void LCD_Delay1ms(void);        // @40.000MHz 延时
void LCD_WriteCommand(unsigned char Command);
void LCD_WriteData(unsigned char Data);
void LCD_Init(void);
void LCD_ShowChar(unsigned char Line, unsigned char Column, unsigned char Char);
void LCD_ShowString(unsigned char x, unsigned char y, unsigned char *String);
...

引脚连接方式:

LCD1602 引脚 单片机引脚
数据口 D0~D7 P0 口
RS(寄存器选择) P2.6
RW(读写) P3.7
E(使能) P2.7

我的专业分析

1. 常见问题诊断方向

从代码结构看这套 LCD1602 驱动是标准的 8 位总线驱动,通常没问题。如果用户遇到显示异常,常见原因有:

① 时序问题

  • LCD_Delay1ms() 定义的延时是按 40MHz 主频标定的。如果在 AI8051U 上实际运行主频不是 40MHz(比如用了 24MHz、36MHz 或者内部 IRC 未校准到 40MHz),延时就会偏短,可能导致写入超时。

② 未配置 I/O 口模式

  • AI8051U 的 I/O 口上电默认是准双向口(高阻输入/准双向),但 P0 口接 LCD 数据总线建议配置为 推挽输出准双向输出,否则驱动能力不足或电平不稳。
  • 需要在初始化里手动配置:
P0M0 = 0x00;  P0M1 = 0x00;   // P0 全部准双向
P2M0 = 0xC0;  P2M1 = 0x00;   // P2.6、P2.7 推挽
P3M0 = 0x80;  P3M1 = 0x00;   // P3.7 推挽

③ 供电/背光问题

  • LCD1602 的 VDD 建议接 5V,V0(对比度)需要外接电位器调整,否则可能一直白屏或全黑。

④ 未检查忙标志

  • 代码中没有读取忙标志(DB7),而是用固定延时。虽然通常可行,但在高速 MCU 下建议补充忙检测更稳妥。

2. 如果您把这段代码用在 STC8G2K64S4 上

⚠️ 注意:这段代码头文件是 AI8051U.H,是针对 AI8051U 系列 的。如果改用 STC8G2K64S4,需要:

  • 头文件改为 STC8G.H(或 STC8.H
  • 检查引脚定义是否符合 STC8G2K64S4 的 P0/P2/P3 口功能脚映射
  • 注意 I/O 口上电模式配置是否一致

3. 论坛中回复情况

该帖子目前只有楼主自己的代码,还没有看到其他人的回复或解决方案说明。


您可以告诉我什么具体问题?

由于您只分享了链接而没有提出具体问题,我想确认一下您想了解什么?

  1. 这段 LCD1602 驱动代码在 AI8051U 上是否能正常使用? 有哪些要注意的地方?
  2. 这段代码是否适用于 STC8G2K64S4?(您之前问过的型号)
  3. 这段代码出了什么具体问题(如白屏、乱码、不显示等),需要我帮忙排查?
  4. 其他?

请把您的具体需求告诉我,我来帮您分析!


🔍 搜索 "https://www.stcaimcu.com/thread-25345-1-1.html"

⏱️ 查找用时 4.7s | 总回答用时 12.7s

回复

使用道具 举报 送花

865

主题

1万

回帖

2万

积分

管理员

积分
25122
发表于 2026-8-21 21:55:48 | 显示全部楼层
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-9-23 16:11 , Processed in 0.074258 second(s), 58 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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