×
单片机 > 单片机程序设计 > 详情

PCF8574 STC15单片机的驱动程序 LCD1602显示

发布时间:2024-04-27 发布时间:
|

网上找了很多的的1602程序,结果要么全是ARDUINO和STM32,要么没一个靠谱的,所以决定自己写,测了N久终于写出来了,看上去效果不错哈哈哈哈!
(MCU是STC15F2K60S2)

制作出来的实物图如下:

单片机源程序如下:

#include"pcf8574.h"


#define WriteADDR 0x4e

#define ReadADDR 0x4f

#define u8 unsigned char

#define CSSet 0x04//EN=1

#define CSReset 0x00//EN=0


#define COMSet 0x08 // RS=0 RW=0

#define DATSet 0x09 // RS=1 RW=0


void delay_ms(u8 ms) //误差 0us

{

while(ms--)

{

u8 a,b;

for(b=129;b>0;b--)

for(a=45;a>0;a--);

}

}


bit PCFSendAByte(u8 addr,dat)

{

IICStart();

IICSend(addr);

if(!IICCheckAck()){return(0);}

IICSend(dat);

if(!IICCheckAck()){return(0);}

IICStop();

return(1);

}


/*u8 PCFReadAByte(u8 addr)

{

u8 mmp;

IICStart();

IICSend(addr);

IICSendAck(Ack);

mmp=IICRead();

IICSendAck(NoAck);

IICStop();

return(mmp);

}




/***************以下为1602****************/

bit WriteCom1602(u8 com)

{

u8 tmp,mmp;

IICStart();

IICSend(WriteADDR);

if(!IICCheckAck()){return(0);}

tmp=com&0xf0;

IICSend(CSReset|COMSet); //EN=0 RS.RW=0 无数据

if(!IICCheckAck()){return(0);}

mmp=tmp|CSReset|COMSet;

IICSend(mmp); //EN=0 RS.RW=0 有数据(高四位)

if(!IICCheckAck()){return(0);}

mmp|=CSSet; //EN=1 RS.RW=0 有数据(高四位)

IICSend(mmp);

if(!IICCheckAck()){return(0);}

mmp&=(0xf0|COMSet);

IICSend(mmp); //EN=0

if(!IICCheckAck()){return(0);}


tmp=com<<4;

mmp=tmp|CSReset|COMSet;

IICSend(mmp); //EN=0 RS.RW=0 有数据(低四位)

if(!IICCheckAck()){return(0);}

mmp|=CSSet; //EN=1 RS.RW=0 有数据(低四位)

IICSend(mmp);

if(!IICCheckAck()){return(0);}

mmp&=(0xf0|COMSet);

IICSend(mmp); //EN=0

if(!IICCheckAck()){return(0);}


IICStop();

return(1);

}


bit WriteDat1602(u8 dat)

{

u8 tmp,mmp;

IICStart();

IICSend(WriteADDR);

if(!IICCheckAck()){return(0);}

tmp=dat&0xf0;

IICSend(CSReset|DATSet); //EN=0 RS.RW=0 无数据

if(!IICCheckAck()){return(0);}

mmp=tmp|CSReset|DATSet;

IICSend(mmp); //EN=0 RS.RW=0 有数据(高四位)

if(!IICCheckAck()){return(0);}

mmp|=CSSet; //EN=1 RS.RW=0 有数据(高四位)

IICSend(mmp);

if(!IICCheckAck()){return(0);}

mmp&=(0xf0|DATSet);

IICSend(mmp); //EN=0

if(!IICCheckAck()){return(0);}


tmp=dat<<4;

mmp=tmp|CSReset|DATSet;

IICSend(mmp); //EN=0 RS.RW=0 有数据(低四位)

if(!IICCheckAck()){return(0);}

mmp|=CSSet; //EN=1 RS.RW=0 有数据(低四位)

IICSend(mmp);

if(!IICCheckAck()){return(0);}

mmp&=(0xf0|DATSet);

IICSend(mmp); //EN=0

if(!IICCheckAck()){return(0);}


IICStop();

return(1);

}


void PCF1602Init()

{

WriteCom1602(0x28);

delay_ms(15);

WriteCom1602(0x28);

delay_ms(15);

WriteCom1602(0x28);

delay_ms(15);

PCFSendAByte(WriteADDR,0x04);

delay_ms(15);

WriteCom1602(0x28);

WriteCom1602(0x0c);

WriteCom1602(0x01);

delay_ms(5);

}


void SetXY(u8 x,y)

{

u8 addr;

addr=0x80+0x40*y+x;

WriteCom1602(addr);

}


void StrinWrite(u8 x,y,u8 *string)

{

SetXY(x,y);

while(*string)

{

WriteDat1602(*string++);

}

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
MSP430F5529 上手小例程2