我为了节省io口,通过74ls164扩展到1602的8个数据口,此法不能进行忙检测,听前辈说忙检测可以用延迟代替,可是我的板依然没能显示.
控制器为89s52,
p0口加上拉4.7k排阻,
p06接164的1和2脚,
p07接164的8脚,
164的3,4,5,6,10,11,12,13分别接1602的7至14脚,即1602的d0到d7数据口,
帮忙看一下接法有无错误或程序有没有问题,测试程序如下:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit r_s=p0^3;
sbit r_w=p0^4;
sbit e=p0^5;
sbit sda=p0^6;
sbit clk=p0^7;
//***************************************************************
void shift164(uchar d) //74ls164移位
{
uchar i=0;
while(i<8)
{
if(d&0x80!=0)
sda=1;
else
sda=0;
clk=0;clk=1;
d<<=1;
i++;
}
}
//***************************************************************
void delay(uint time)
{
while(time--);
}
//***************************************************************
void write_order(uchar order) // 写命令
{
r_s=0; // 数据:1 命令:0
r_w=0; // 读写选择端 读:1 写:0
e=1; // 模块使能端
shift164(order);
delay(5000);//延迟代替忙检测
e=0; //下降沿把数据送进去
}
//***************************************************************
void write_dat(uchar dat)//写数据
{
r_s=1; // 数据:1 命令:0
r_w=0; // 读写选择端 读:1 写:0
e=1; // 模块使能端
shift164(dat);
delay(5000);//延迟代替忙检测
e=0; //下降沿把数据送进去
}
//***************************************************************
void lcd_position(uchar pos)
{
write_order(pos|0x80);
}
//***************************************************************
void display_char(uchar x,uchar dat)
{
lcd_position(x); //发送地址码
write_dat(dat); //发送数据
}
//***************************************************************
void lcd_init() //lcd初始化
{
write_order(0x38);delay(1000);
write_order(0x0f); //整体显示,0x0f为开光标,闪烁,0x0c为关光标,不闪烁
write_order(0x06); //设定输入方式,增量移位
write_order(0x01); //清除显示
}
//***************************************************************
main()
{
lcd_init();
while(1)
{
display_char(0x03,Ƈ');//第一行第四格显1
display_char(0x43,'a');//第二行第四格显a
}
}