- 打卡等级:初来乍到
- 打卡总天数:4
- 最近打卡:2025-04-26 20:12:05
已绑定手机
金牌会员
- 积分
- 1449
|
发表于 2024-9-18 18:58:59
|
显示全部楼层
本帖最后由 405616736 于 2024-9-19 00:28 编辑
根据楼主的程序,个人稍微修改了一下
/**********接口说明**********/
sbit SCL=P1^0;
sbit SDA=P1^1;
/**********全局变量**********/
bit LED=1;
char T[10];
unsigned char Address[4]={0x80,0xc0,0x94,0xd4};
/******************************
IIC初始化
******************************/
void IIC_Init()
{
SDA=1; //拉高SDA
SCL=1; //拉高SCL
_nop_();_nop_();_nop_();_nop_();_nop_(); //软件延时
}
/******************************
IIC启始信号
******************************/
void IIC_Start() //当SCL时钟线为高电平,SDA数据线由高变低时,为起始信号。
{
SCL=1; //拉高SDA
SDA=1; //拉高SCL
_nop_();_nop_();_nop_();_nop_();_nop_(); //软件延时
SDA=0; //SDA从高到低跳变
_nop_();_nop_();_nop_();_nop_();_nop_(); //软件延时
SCL=0; //每次操作完拉低SCL,继续占用总线
}
/******************************
IIC停止信号
******************************/
void IIC_Stop() //SCL时钟线为高电平,SDA数据线由低变高时,为停止信号。
{
SCL=1; //SCL为高
SDA=0; //SDA为低
_nop_();_nop_();_nop_();_nop_();_nop_(); //软件延时
SDA=1; //SDA由低到高跳变
}
/******************************
IIC串口写入1个字节
******************************/
void IIC_WriteByte(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
dat<<=1; //移掉高位,准备发次高位
SDA=CY; //发数据位1
_nop_();_nop_();
SCL=1; //拉高SCL,从机读取数据
_nop_();_nop_();_nop_();_nop_();_nop_(); //软件延时
SCL=0; //拉低时钟,低电平发数据
}
_nop_();_nop_();_nop_();_nop_();_nop_(); //软件延时
SDA=1; //主机读数据前,先切断输出通道,切换为输入模式
_nop_();_nop_();_nop_();_nop_();_nop_(); //软件延时
SCL=1; //拉高SCL,准备接收应答
_nop_();_nop_();_nop_();_nop_();_nop_(); //软件延时
while((SDA==1)&&(++i!=0)); //向主机发应答,主机读取SDA,判断应答状态
SCL=0; //每次操作完拉低SCL,继续占用总线
}
/******************************
LCD发送命令或数据
******************************/
void LCD_SendData(unsigned char dat,unsigned char mode) //mode=0x0c,指令寄存器;mode=0x0d,数据寄存器
{
unsigned char i,temp;
IIC_Start(); // 串口开始
IIC_WriteByte(0x4E); //PCF8574T模块的地址码
for(i=0;i<2;i++)
{
if(i==0) temp=dat&0xf0; //低4位置0,高4位不变
if(i==1) temp=dat<<4; //左移4位,低4位变高4位
temp|=mode; //0x0C→EN=1,RW=0,RS=0 0x0D→EN=1,RW=1,RS=0
if(LED==0) temp&=0xf7; //LED关闭
IIC_WriteByte(temp);
Delay(1); //延时,给硬件反应时间
if(LED==0) temp&=0xf7; //LED关闭
temp&=0xfb; //EN=0
IIC_WriteByte(temp);
}
IIC_Stop();
}
/******************************
LCD初始化
******************************/
void LCD_Init(void)
{
LCD_SendData(0x02,0x0c); //写命令,光标复位
Delay(10); //10ms延时,给硬件反应时间
LCD_SendData(0x28,0x0c); //写命令,设置16*2显示,5*7点阵,4位数据接口
Delay(10); //10ms延时,给硬件反应时间
LCD_SendData(0x01,0x0c); //写命令,显示清屏:1.数据指针清零 2.所有显示清零
Delay(10); //10ms延时,给硬件反应时间
LCD_SendData(0x06,0x0c); //写命令,当读或写一个字符后地址指针加一,且光标加一
Delay(10); //10ms延时,给硬件反应时间
LCD_SendData(0x0c,0x0c); //写命令,开显示,不显示光标,光标不显示
Delay(10); //10ms延时,给硬件反应时间
}
/******************************
发送字符串到LCD
******************************/
void LCD_PutString(unsigned char x,y,unsigned char *str)
{
LCD_SendData(Address[x]+y,0x0c); //执行地址转换,x为行号 y为列号
while(*str!='\0') //表示显示内容不为空时,执行循环体的代码段,
{
LCD_SendData(*str++,0x0d); //发送命令,*就是声明他的类型,是一个指向整型数据的指针
}
}
|
|