STC8H的LCD1602转IIC模块程序

STC8H8K64U调试通过,延时1ms必不可少,I2C地址是0x4e,不同批次可能不同,详情参见PCF8574集成电路。

#include <STC8H.H>
#define FOSC 11059200UL
#define I2C_ADDR 0X4E

sbit SDA=P1^4;
sbit SCL=P1^5;

unsigned char code welStr[]="Hello,buddy!";
unsigned char code wriBy[]="Write by Bona";

void Delay1ms(void)	//@11.0592MHz
{
	unsigned char data i, j;

	i = 15;
	j = 90;
	do
	{
		while (--j);
	} while (--i);
}

void Wait()
{
	while(!(I2CMSST & 0X40));
	I2CMSST &=~0X40;
}

void Start()
{
	I2CMSCR=0X01;
	Wait();
}

void SendData(unsigned char dat)
{
	I2CTXD=dat;
	I2CMSCR=0X02;
	Wait();
}

void RecvACK()
{
	I2CMSCR=0X03;
	Wait();
}

void Stop()
{
	I2CMSCR=0X06;
	Wait();
}

void LCD_WriteAdd(unsigned char dat)
{
	Start();
	SendData(I2C_ADDR);
	RecvACK();
	SendData(dat);
	RecvACK();
	Stop();
}

void LCD_WriteCom(unsigned char com) //D′?üá?oˉêy
{
	unsigned char com1,com2;
	com1=com|0x0f;
	LCD_WriteAdd(com1 &0xfc);
	Delay1ms();
	LCD_WriteAdd(com1 &0xf8);
	com2=com<<4;
	com2=com2|0x0f;
	LCD_WriteAdd(com2&0xfc);
	Delay1ms();
	LCD_WriteAdd(com2&0xf8);
}

void LCD_WriteData(unsigned char dat) 
{
	unsigned char dat1,dat2;
	dat1 =dat|0x0f;
	LCD_WriteAdd(dat1 &0xfd);
	Delay1ms();
	LCD_WriteAdd(dat1 &0xf9);
	dat2=dat<<4;
	dat2=dat2|0x0f;
	LCD_WriteAdd(dat2&0xfd);
	Delay1ms();
	LCD_WriteAdd(dat2&0xf9);
}
void LCD_Init() 
{
	LCD_WriteAdd(0x08); 
	LCD_WriteCom(0x0f);
	LCD_WriteCom(0x28);
	LCD_WriteAdd(0x0c);
	LCD_WriteAdd(0x08); 
	LCD_WriteCom(0x28); 
	LCD_WriteCom(0x01);
	LCD_WriteCom(0x0c); 
	LCD_WriteCom(0x06); 
}

void LCD_SetPos(unsigned char x,unsigned char y)
{
	if(y==0)
	{
		LCD_WriteCom(0x80+x);
	}
	if(y==1)
	{
		LCD_WriteCom(0x80+0x40+x);
	}
}

void LCD_ShowChar(unsigned char c)
{
	LCD_WriteData(c);
}

void LCD_ShowStr(unsigned char *p)
{
	while(*p)
	{
		LCD_ShowChar(*p++);
	}
}

void LCD_Clear()
{
	LCD_WriteCom(0x01);
}

void main()
{
	P_SW2|=0X80;
	P1M1=0X00;
	P1M0=0X00;
	
	I2CCFG=0XE0;
	I2CMSST=0X00;
	LCD_Init();
	LCD_Clear();
	LCD_SetPos(2,0);
	LCD_ShowStr(welStr);
	LCD_SetPos(1,1);
	LCD_ShowStr(wriBy);
	while(1)
	{
		
		
	}
}

STC8H8K64U 是一款基于 8051 内核的单片机,要使用 LCD1602 模块,需要将其连接到单片机的 I/O 口,并编写相关代码来驱动该模块。以下是一个简单的示例程序: ``` #include <reg52.h> #include <intrins.h> #define LCD_RS P1_0 #define LCD_RW P1_1 #define LCD_EN P1_2 void delay(unsigned int x) { while(x--) _nop_(); } void write_command(unsigned char cmd) { LCD_RS = 0; LCD_RW = 0; LCD_EN = 1; P0 = cmd; delay(10); LCD_EN = 0; } void write_data(unsigned char dat) { LCD_RS = 1; LCD_RW = 0; LCD_EN = 1; P0 = dat; delay(10); LCD_EN = 0; } void init_lcd() { write_command(0x38); write_command(0x0c); write_command(0x06); write_command(0x01); } void main() { init_lcd(); write_data('H'); write_data('e'); write_data('l'); write_data('l'); write_data('o'); } ``` 在上面的代码中,我们通过定义 `LCD_RS`、`LCD_RW`、`LCD_EN` 分别表示 LCD1602 的 RS、RW、EN 引脚,并通过 `write_command()` 和 `write_data()` 函数来向 LCD1602 发送命令或数据。在 `init_lcd()` 函数中,我们初始化了 LCD1602 的一些参数,使其能够正确显示字符。 如果你想要在 STC8H8K64U 上运行上述代码,可以按照以下步骤进行: 1. 连接 STC8H8K64U 和 LCD1602 模块,具体连接方式可以参考相关资料。 2. 在 Keil C51 开发环境中创建一个新的工程,并将上述代码添加到主函数中。 3. 编译和下载程序STC8H8K64U 单片机中。 如果一切正常,你应该能够看到 LCD1602 模块上显示 "Hello" 字符串。如果有其他问题,请随时提出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值