网上找了很多的的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++);
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』