標(biāo)題:
LCD1602使用PCF8574ATLLC的單片機(jī)驅(qū)動(dòng) 求指導(dǎo)
[打印本頁]
作者:
陳仕祥
時(shí)間:
2018-5-23 16:56
標(biāo)題:
LCD1602使用PCF8574ATLLC的單片機(jī)驅(qū)動(dòng) 求指導(dǎo)
已經(jīng)寫了兩天了,也借鑒了網(wǎng)上的例子,但是還是沒成功,以前用16根線的時(shí)候還是蠻好弄的!,請教各位大佬,幫忙看一下我的程序是哪里有問題,也麻煩知道一下,謝謝了!
#include <STC12C5A60S2.H>
#include "sys.h"
#define LCD_ADD 0x3F
void IIC_Start(void);
void IIC_Stop(void);
void IIC_Ask(void);
void IIC_NAsk(void);
bit IIC_Wait_Ack(void);
void IIC_Send_Byte(uint8_t dat);
uint8_t IIC_Read_Byte(bit ack);
void Enable_LCD_write(void);
bit LCD_Write_CMD(uint8_t cmd);
bit LCD_Write_Data(uint8_t value);
void Show_string(unsigned char x,unsigned char y,unsigned char *s);
sbit SCL = P1^0;
sbit SDA = P1^1;
sbit LED = P1^2;
//開始
void IIC_Start(void)
{
SDA = 1;
SCL = 1;
Delay2us();
SDA = 0;
Delay5us();
SCL = 0;
}
//停止
void IIC_Stop(void)
{
SCL = 0;
SDA = 0;
Delay5us();
SCL = 1;
SDA = 1;
Delay2us();
SCL = 0;
}
//答應(yīng)
void IIC_Ack(void)
{
SCL = 0;
SDA = 0;
Delay5us();
SCL = 1;
Delay5us();
SCL = 0;
}
//不答應(yīng)
void IIC_NAck(void)
{
SCL = 0;
SDA = 1;
Delay5us();
SCL = 1;
Delay5us();
SCL = 0;
}
//等待答應(yīng)
bit IIC_Wait_Ack(void)
{
uint8_t temp = 0;
SDA = 1;
Delay2us();
SCL = 1;
Delay5us();
while(SDA)
{
temp++;
if(temp>250)
{
IIC_Stop();
return 1; //沒有答應(yīng)返回1
}
}
SCL = 0;
return 0; //有答應(yīng),返回0
}
//發(fā)動(dòng)1個(gè)字節(jié)
void IIC_Send_Byte(uint8_t dat)
{
uint8_t t;
SCL = 0;
for(t=0;t<8;t++)
{
SDA = (dat&0x80)>>7;
dat=dat<<1;
SCL = 1;
Delay2us();
SCL= 0;
Delay2us();
}
}
//讀1個(gè)字節(jié),ack=1時(shí),發(fā)送ACK,ack=0,發(fā)送nACK
uint8_t IIC_Read_Byte(bit ack)
{
uint8_t i,receive = 0;
for(i=0;i<8;i++)
{
SCL = 0;
Delay2us();
SCL = 1;
receive<<=1;
if(SDA)
{
receive++;
}
Delay2us();
}
if(!ack)
{
IIC_NAck();
}
else
{
IIC_Ack();
}
return receive;
}
//*************************液晶寫命令************************
bit LCD_Write_CMD(uint8_t cmd)
{
uint8_t LCD_cmd = 0x0C;
uint8_t LCD_EN;
uint8_t Cmd_Temp;
Cmd_Temp = cmd;
cmd=cmd<<4; //低四位移到高四位
cmd = cmd|LCD_cmd;
IIC_Start(); //啟動(dòng)總線
IIC_Send_Byte(LCD_ADD<<1|0); //發(fā)送器件地址
if(IIC_Wait_Ack())
{
IIC_Stop();
LED = 0;
return 1;
}
IIC_Send_Byte(cmd); //發(fā)送低四位數(shù)據(jù)
if(IIC_Wait_Ack())
{
IIC_Stop();
return 1;
}
Delay1s();
cmd = Cmd_Temp|LCD_cmd;
IIC_Send_Byte(cmd); //發(fā)送高四位數(shù)據(jù)
if(IIC_Wait_Ack())
{
IIC_Stop();
return 1;
}
Delay1s();
LCD_EN |=(1<<(3-1)); //E = 1
IIC_Send_Byte(LCD_EN); //發(fā)送使能數(shù)據(jù)
Delay2us();
LCD_EN &=~(1<<(3-1)); //E = 0
IIC_Send_Byte(LCD_EN); //發(fā)送使能數(shù)據(jù)
Delay2us();
IIC_Stop(); //結(jié)束總線
return 0;
}
//*************寫數(shù)據(jù)****************************
bit LCD_Write_Data(uint8_t dat)
{
uint8_t LCD_dat = 0x09;
uint8_t LCD_EN;
uint8_t Dat_Temp;
dat = Dat_Temp;
dat=dat<<4; //低四位移到高四位
dat = dat|LCD_dat;
IIC_Start(); //啟動(dòng)總線
IIC_Send_Byte(LCD_ADD<<1|0); //發(fā)送器件地址
if(IIC_Wait_Ack())
{
IIC_Stop();
LED = 0;
return 1;
}
IIC_Send_Byte(dat); //發(fā)送低四位數(shù)據(jù)
if(IIC_Wait_Ack())
{
IIC_Stop();
return 1;
}
Delay1s();
dat = Dat_Temp|LCD_dat;
IIC_Send_Byte(dat); //發(fā)送高四位數(shù)據(jù)
if(IIC_Wait_Ack())
{
IIC_Stop();
return 1;
}
Delay1s();
LCD_EN |=(1<<(3-1)); //E = 1
IIC_Send_Byte(LCD_EN); //發(fā)送使能數(shù)據(jù)
Delay2us();
LCD_EN &=~(1<<(3-1)); //E = 0
IIC_Send_Byte(LCD_EN); //發(fā)送使能數(shù)據(jù)
Delay2us();
IIC_Stop(); //結(jié)束總線
return 0;
}
//**********************顯示字符串*****************************
void Show_string(unsigned char x,unsigned char y,unsigned char *s)
{
unsigned char position;
if (y == 0)
{
position = 0x80 + x;
}
else
{
position = 0xc0 + x;
}
LCD_Write_CMD(position);
while (*s)
{
LCD_Write_Data(*s);
s++;
}
}
int main(void)
{
Delay1s();
LCD_Write_CMD(0x28);
LCD_Write_CMD(0x28);
Delay1s();
LCD_Write_CMD(0x0C);
LCD_Write_CMD(0x0C);
Delay1s();
LCD_Write_CMD(0x01);
LCD_Write_CMD(0x01);
Delay1s();
while(1)
{
}
}
復(fù)制代碼
以上就是我的全部程序了,本想將IIC和1602的程序單獨(dú)寫的,但是那樣報(bào)錯(cuò)所以就沒那樣寫了!只是在SYS.h里面定義了數(shù)據(jù)類型和延時(shí)函數(shù)!請各位大佬幫忙解答一下,謝謝了!
作者:
imxuheng
時(shí)間:
2018-5-23 21:28
這個(gè)程序用11.0592MHz晶振,查查你這個(gè)PCF芯片的地址是多少,不同后綴的地址不同
作者:
lmn2005
時(shí)間:
2019-3-4 15:10
你沒有寫入命令到8574的IO口。上樓的朋友說對了,要清楚芯片的地址。
作者:
xuyaqi
時(shí)間:
2019-3-4 17:45
先要 LCD_Init();初始化,再調(diào)用子程序顯示字符,我看你就沒有初始化。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1