找回密码
 立即注册
查看: 368|回复: 14

用擎天柱开发板做了一个lcd1602 4线驱动

[复制链接]
  • 打卡等级:常住居民I
  • 打卡总天数:66
  • 最近打卡:2025-04-12 16:18:03
已绑定手机

10

主题

32

回帖

350

积分

中级会员

积分
350
发表于 2025-2-9 00:29:10 | 显示全部楼层 |阅读模式

开头还是那句话

哪怕梦想让我们拼的遍体鳞伤!这一次我们也要勇往直前!

想做一个小装置 先做第一步显示模块

微信截图_20250209001343.png

没放P3那个上拉电阻 p3和s8050之间也没加限流电阻 。

R11 随便找了一个 电位器

A和vcc加了一个限流电阻 也不知道有没有必要。

因为不知道 lcd1602里面有没有集成限流电阻 所以我自己就加了一个 不过看别人都没加。。。

vcc和gnd之间没有加电容

还发现一个问题 整套系统连接 电脑usb口供电可以正常运行 但是单独连接手机的充电头就行不。。不知道为啥

还有个问题 单片机不能 自动下载 每次都要在电脑上点了下载之后 在按P32 在按重启 才能下载成功。。。

视频效果

代码如下

#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#include "intrins.h" 

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";



sbit LCD1602_EN=P0^4; 
sbit LCD1602_RS=P0^5;
sbit LCD1602_K=P0^6;

sbit LCDdata4 =P0^3;
sbit LCDdata3 =P0^2;
sbit LCDdata2 =P0^1;
sbit LCDdata1 =P0^0;

void LCD1602_WriteCmd(u8 cmd_data);//写入命令数据
void LCD1602_WriteData(u8 cmd_data);//写入显示用数据
void LCD1602_init(void);//初始化
void LCD1602_clear(void);//清屏指令 清除之前缓存的数据
void LCD1602_show_string(u8 x,u8 y,u8 *str);//x=0-15,y=0-1,str 是字符串变量

void Delay1ms(void);	//@24.000MHz
void Delay500ms(void);	//@24.000MHz

void main(void)
{
		WTST =0;//设置程序指令延时参数
		EAXFR =1;//扩展寄存器(XFR)访问使能
		CKCON=0;//提高访问XRAM速度

	  P0M1 = 0x00;   P0M0 = 0x00;   //设置为推双向口
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口

		usb_init();
		IE2 = 0x80;	//sub允许中断
		EA = 1; //总中断
		while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置



	while(1)
{
	LCD1602_init();//初始化
	LCD1602_show_string(0,0,"stcaimcu");//x=0-15,y=0-1,str 是字符串变量
	LCD1602_show_string(0,1,"AI8051U");//x=0-15,y=0-1,str 是字符串变量

	LCD1602_K = 0;
	Delay500ms();
	LCD1602_K = 1;
	Delay500ms();






//			  if (bUsbOutReady)
//        {
//          //  USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
//    
//					printf("stc 真的很棒 \r\n");
//    
//					usb_OUT_done();
//        }
//


	}




}


void Delay1ms(void)	//@24.000MHz
{
	unsigned long edata i;

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


void Delay500ms(void)	//@24.000MHz
{
	unsigned char data i, j, k;

	_nop_();
	_nop_();
	i = 61;
	j = 225;
	k = 62;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}



void LCD1602_WriteCmd(u8 cmd_data)//写入命令数据
{
	u8 i;
	LCD1602_RS=0;//命令模式
	LCD1602_EN=0;//使能管脚
	for(i=2;i>0;i--)
	{
		LCDdata4 = cmd_data & 0x80;
		LCDdata3 = cmd_data & 0x40;
		LCDdata2 = cmd_data & 0x20;
		LCDdata1 = cmd_data & 0x10;

		LCD1602_EN=1;//上升沿发射数据
		Delay1ms();
		LCD1602_EN=0;//产生下降沿
		Delay1ms();

		cmd_data = cmd_data << 4;
	}

}


void LCD1602_WriteData(u8 cmd_data)//写入显示用数据
{
	u8 i;
	LCD1602_RS=1;//数据模式
	LCD1602_EN=0;//使能管脚
	for(i=2;i>0;i--)
	{
		LCDdata4 = cmd_data & 0x80;
		LCDdata3 = cmd_data & 0x40;
		LCDdata2 = cmd_data & 0x20;
		LCDdata1 = cmd_data & 0x10;

		LCD1602_EN=1;//上升沿发射数据
		Delay1ms();
		LCD1602_EN=0;//产生下降沿
		Delay1ms();

		cmd_data = cmd_data << 4;
	}

}


void LCD1602_init(void)//初始化
{
	LCD1602_WriteCmd(0x28);//功能设定 8位数据总线 显示两行 5*7点阵
	LCD1602_WriteCmd(0x0c);//开启显示 不显示光标 光标闪烁
	LCD1602_WriteCmd(0x06);//模式设置 光标后移 屏幕不动
	LCD1602_WriteCmd(0x01);//清屏指令 清除之前缓存的数据
}

void LCD1602_clear(void)//清屏指令 清除之前缓存的数据
{
	LCD1602_WriteCmd(0x01);
}




void LCD1602_show_string(u8 x,u8 y,u8 *str)//x=0-15,y=0-1,str 是字符串变量
{
	u8 i=0;
	if(x>15|y>2) return;//超出显示范围
	if(y<1)//第一行
	{

		while(*str!='\0')
		{
			if(i+x<16)//判断是字符串是否再第一行显示
			{
				LCD1602_WriteCmd(0x00+0x80+x+i);//写入第一行显示字符的位置命令
				//0x00 就是第一行的起始偏移值 当然可以不写
				//因为显示的DDRAM地址第一行是 00到0F
			}
			else
			{
				LCD1602_WriteCmd(0x40+0x80+x+i-16);//写入第二行显示字符的位置命令 
				//减去16就是 减去上一行的字符数
			}
			LCD1602_WriteData(*str);//指针取出 这个位置字符串对应的 字符
			str++;
			i++;
		}
	}
	else//直接在第二行显示数据的情况
	{
		while(*str!='\0')
		{
			if(i+x<16)//判断是字符串是否再一行显示
			{
				LCD1602_WriteCmd(0x40+0x80+x+i);//写入第二行显示字符的位置命令
			}
			else
			{
				LCD1602_WriteCmd(0x00+0x80+x+i-16);//写入第一行显示字符的位置命令
				//减去16就是 减去上一行的字符数 也就是第二行的字符数
			}
			LCD1602_WriteData(*str);//指针取出 这个位置字符串对应的 字符
			str++;
			i++;	
		}
	}
}



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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-2-9 13:52:07 | 显示全部楼层
P3是一组并口(8位),建议写成如P32
IO直接接NPN三极管,要打开内部4K上拉电阻并设置为开漏,不能设置成推挽,否则可能烧毁IO
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:108
  • 最近打卡:2025-05-01 08:20:47
已绑定手机

1

主题

63

回帖

521

积分

高级会员

积分
521
发表于 2025-2-9 14:52:25 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:381
  • 最近打卡:2025-05-01 08:27:28
已绑定手机

10

主题

146

回帖

458

积分

中级会员

积分
458
发表于 2025-2-9 14:54:09 | 显示全部楼层
必须点赞
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:66
  • 最近打卡:2025-04-12 16:18:03
已绑定手机

10

主题

32

回帖

350

积分

中级会员

积分
350
发表于 2025-2-9 19:28:25 | 显示全部楼层
Debu*** 发表于 2025-2-9 13:52
P3是一组并口(8位),建议写成如P32
IO直接接NPN三极管,要打开内部4K上拉电阻并设置为开漏,不能设置成推 ...

好嘞 以后弄图更精确一些
我给io都设置成了 准双向了 以后还是给 B极和io之间加个电阻 不用必须是上拉电阻吧?直接用用内部的上拉也可以是吧

我不是很明白这个电阻

是给io设置成准双向 放一个限流电阻
还是给io设置成开漏 用单片机io口内部的上拉电阻

这两种那个好呢?为啥

点评

开漏+内部上拉,可以省掉外部上拉电阻  详情 回复 发表于 2025-2-10 00:10
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:521
  • 最近打卡:2025-05-01 01:11:54

10

主题

1159

回帖

5117

积分

论坛元老

积分
5117
发表于 2025-2-9 20:03:57 | 显示全部楼层
还发现一个问题 整套系统连接 电脑usb口供电可以正常运行 但是单独连接手机的充电头就行不。。不知道为啥

主要是卡在USB初始化部分的死循环了,把代码修改以下就好

long int i = 10000000L;



    while(DeviceState != (DEVSTATE_CONFIGURED))     //等待USB完成配置
    {
            if((--i)==0)
                    break;

    }       
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-2-10 00:10:54 | 显示全部楼层
wosh*** 发表于 2025-2-9 19:28
好嘞 以后弄图更精确一些
我给io都设置成了 准双向了 以后还是给 B极和io之间加个电阻 不用必须是上拉电 ...

开漏+内部上拉,可以省掉外部上拉电阻
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:66
  • 最近打卡:2025-04-12 16:18:03
已绑定手机

10

主题

32

回帖

350

积分

中级会员

积分
350
发表于 2025-2-10 05:04:44 | 显示全部楼层
Debu*** 发表于 2025-2-10 00:10
开漏+内部上拉,可以省掉外部上拉电阻

谢谢
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:66
  • 最近打卡:2025-04-12 16:18:03
已绑定手机

10

主题

32

回帖

350

积分

中级会员

积分
350
发表于 2025-2-10 05:05:10 | 显示全部楼层
angm*** 发表于 2025-2-9 20:03
主要是卡在USB初始化部分的死循环了,把代码修改以下就好

long int i = 10000000L;

谢谢
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2025-2-10 08:27:38 | 显示全部楼层
时序延时太长了
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-1 19:58 , Processed in 0.139969 second(s), 122 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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