Proteus IIC协议(PCF8574芯片) 仿真 LCD1602 C51 代码
作者:互联网
阅读以下代码,需具备以下条件:
1. Keil与Proteus联调。
单一主程序如下,不需其他头、库文件。
#include <reg51.h>
#include <intrins.h>
sbit SCL = P3^3;
sbit SDA = P3^4;
sbit LED = P3^5;
void Delay() //@12.000MHz
{
_nop_();
// _nop_();
// _nop_();
}
void IIC_Start()
{
SCL=1;
Delay();
SDA=1;
Delay();
SDA=0;
Delay();
SCL=0;
}
bit IIC_Get_Ack()
{
bit ackOK;
SDA=1;
Delay();
SCL=1;
Delay();
ackOK=!SDA;
Delay();
SCL=0;
return ackOK;
}
void IIC_Stop()
{
SCL=1;
Delay();
SDA=0;
Delay();
SDA=1;
Delay();
SCL=0;
}
void IIC_Write_Byte(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
SDA=dat&(0x80>>i); //先写入高位
Delay();
SCL=1;
Delay();
Delay();
Delay();
SCL=0;
}
}
void IIC_Writeadd(unsigned char dat)//写入数据到IO
{
IIC_Start();
IIC_Write_Byte(0x4e); //bin(0x27<<1) 0x4e 8574 芯片
IIC_Get_Ack();
IIC_Write_Byte(dat);
IIC_Get_Ack();
IIC_Stop();
}
void LcdWriteCmd(unsigned char com) //写命令函数
{
unsigned char com1,com2;
com1=com|0x0f;
IIC_Writeadd(com1&0xfc);
Delay();
IIC_Writeadd(com1&0xf8);
com2=com<<4;
com2=com2|0x0f;
IIC_Writeadd(com2&0xfc);
Delay();
IIC_Writeadd(com2&0xf8);
}
void LcdWriteDat(unsigned char date) //写数据函数
{
unsigned char date1,date2;
date1=date|0x0f;
IIC_Writeadd(date1&0xfd);
Delay();
IIC_Writeadd(date1&0xf9);
date2=date<<4;
date2=date2|0x0f;
IIC_Writeadd(date2&0xfd);
Delay();
IIC_Writeadd(date2&0xf9);
}
void InitLcd()
{
LcdWriteCmd(0x32);
LcdWriteCmd(0x28); //16*2 显示,5*7 点阵,4 位数据接口
LcdWriteCmd(0x0C);
LcdWriteCmd(0x0E); //文字不动,地址自动+1
LcdWriteCmd(0x01); //清屏
}
/* 设置显示 RAM 起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标 */
void LcdSetCursor(unsigned char x, unsigned char y)
{
unsigned char addr;
if (y == 0)
{ //由输入的屏幕坐标计算显示 RAM 的地址
addr = 0x00 + x; //第一行字符地址从 0x00 起始
}
else
{
addr = 0x40 + x; //第二行字符地址从 0x40 起始
}
LcdWriteCmd(addr | 0x80); //设置 RAM 地址
}
/* 在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针 */
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
{
LcdSetCursor(x, y); //设置起始地址
while (*str != '\0'){ //连续写入字符串数据,直到检测到结束符
LcdWriteDat(*str++); //先取 str 指向的数据,然后 str 自加 1
}
}
void main()
{
unsigned char mystr[]="Hello World!";
InitLcd();
LcdShowStr(0,0,mystr);
while(1);
}
标签:char,Writeadd,C51,void,unsigned,Delay,Proteus,LCD1602,IIC 来源: https://blog.csdn.net/qq_38757966/article/details/121929111