找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5190|回复: 7
打印 上一主题 下一主题
收起左侧

关于Proteus仿真1602液晶的问题,JHD-2x16-i2c这个元件

[复制链接]
跳转到指定楼层
楼主
ID:395068 发表于 2020-6-22 23:31 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
想问下各位有没有用过proteus里的JHD-2x16-i2c这个元件,也是i2c通信的,我估计应该就是pcf8574集成的,但我用pcf8574和普通并口的1602,写的程序可以显示,没啥问题,用jhd那个就没一点反应,是地址不对吗?还是哪里有问题
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:155507 发表于 2020-6-23 06:37 | 只看该作者
看数据手册





JHD1214Y_YG_1.0.pdf

692.72 KB, 下载次数: 118

回复

使用道具 举报

板凳
ID:395068 发表于 2020-6-23 09:48 来自手机 | 只看该作者
angmall 发表于 2020-6-23 06:37
看数据手册

非常感谢
回复

使用道具 举报

地板
ID:97554 发表于 2020-6-23 10:00 | 只看该作者
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int


sbit SCL=P2^1;
sbit SDA=P2^2;

void delay(void);
void delay_ms(uint ms);
void write_dat(uchar dat);
void write_ndat(uchar *dat, uchar length);
void write_cmd(uchar cmd);       
void write_CGRAM(void);                                                                                       
void lcd_init(void);
void display(void);
void display2(void);

uchar code tab1[]="ABCDEFGHIJKLMNOP";
uchar code tab2[]="1234567890abcdef";
uchar code zimu[][8]={{0x00,0xff,0x04,0x04,0xff,0x04,0x04,0xff},                //王
                                                                                        {0x00,0x00,0xff,0x15,0xff,0x15,0xff,0x00},                //田
                                                                                        {0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00},                //一
                                                                                        {0x00,0x00,0x0e,0x00,0x00,0xff,0x00,0x00},                //二
                                                                                        {0x00,0x00,0x0e,0x00,0x0e,0x00,0xff,0x00},                //三
                                                                                        {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55},
                                                                                        {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55},
                                                                                        {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55}};





void main(void)
{
        //P2M0 = 0X00;        P2M1 = 0X00;                //P2端口配置为准双向口
        lcd_init();
       
        while(1)
        {
//             write_CGRAM();
                display();
                display2();
        }
}

void delay(void)                                        //几us的延时
{
        uchar i = 2;
        while(i--);
}
void delay_ms(uint ms)                //大约ms级的延时
{
        uint i,j;
        for(j=0;j<ms;j++)
                for(i=0;i<1000;i++);
}
void i2c_start(void)                        //开始信号
{                                                                                                        //SCL为高时,SDA下降沿
        SDA = 1;
        SCL = 1;
        delay();
        SDA = 0;
        delay();       
}
void i2c_stop(void)                                //停止信号
{                                                                                                        //SCL为高时,SDA上升沿
        SDA = 0;
        SCL = 1;
        delay();
        SDA = 1;
        delay();
}
void ack(void)                                                //ACK应答
{                                                                                                        //第九个时钟,应答检测
        SCL = 0;
        delay();
        SDA = 1;
        SCL = 1;
        while(SDA);
        delay();
        SCL = 0;
        delay();
}
void i2c_write(uchar dat)        //写8bit数据
{
        uchar i;
        for(i = 0; i < 8; i++)
        {
                SCL = 0;
                SDA = dat & 0x80;
                delay();
                SCL = 1;
                dat <<= 1;
                delay();         
        }
        ack();
}
uchar i2c_read(void)                        //读8bit数据
{
        uchar temp,i;
        for (i = 0;i < 8;i++)
        {
                SCL = 1;       
                delay();
                temp <<= 1;
                temp |= SDA;
                SCL = 0;
                delay();
        }
        SDA = 1;
        SCL = 1;
        delay();
        SCL = 0;
        delay();
        return temp;
}
void write_dat(uchar dat)
{
        write_ndat(&dat,1);       
}
void write_ndat(uchar *dat, uchar length)        //写数据
{       
        uchar i;
        i2c_start();                                                        //开始
        i2c_write(0x7c);                                        //写从机地址
        for(i=0;i<length-1;i++)                //写length长度地址
        {
                i2c_write(0xc0);                                //写数据指令
                i2c_write(dat[i]);
        }
        i2c_write(0x40);                                        //传输数据停止标志位
        i2c_write(dat[i]);                                       
        i2c_stop();                                                                //停止
}
void write_cmd(uchar cmd)                //写指令
{       
        i2c_start();                                                        //开始
        i2c_write(0x7c);                                        //从机地址
        i2c_write(0x80);                                        //写指令
        i2c_write(cmd);
        i2c_stop();                                                                //停止
}
void write_CGRAM(void)                        //造字
{       
        uchar i;
        write_cmd(0x40);                                        //CGRAM地址
        for(i=0;i<8;i++)
                write_ndat(&zimu[i-1][8],8);
}
void lcd_init(void)                                        //初始化
{
        write_cmd(0X38);                                        //2行模式,5*8点阵
        write_cmd(0x0c);                                        //开显示
        write_cmd(0x01);                                        //清显示
        delay_ms(2);               
        write_cmd(0x06);                                         //光标设置
}
void display(void)
{
       
        write_cmd(0x80);                                        //第一行
        write_ndat(tab1,16);                                //显示数据
        write_cmd(0xc0);                                        //第二行
        write_ndat(tab1,16);                                //显示数据
        delay_ms(800);
        write_cmd(0x01);                                        //清显示
        delay_ms(2);               

}
void display2(void)
{

        write_cmd(0x80);                                        //第一行
        write_ndat(tab2,16);                                //显示数据
        write_cmd(0xc0);                                        //第二行
        write_ndat(tab2,16);                                //显示数据
        delay_ms(800);
        write_cmd(0x01);                                        //清显示
        delay_ms(2);               

}

void display3(void)
{

        write_cmd(0x80);                                        //第一行
        write_ndat(tab2,16);                                //显示数据
        write_cmd(0xc0);                                        //第二行
        write_ndat(tab2,16);                                //显示数据
        delay_ms(800);
        write_cmd(0x01);                                        //清显示
        delay_ms(2);               

}


51模拟IIC驱动,你试下吧。

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:97554 发表于 2020-6-23 10:03 | 只看该作者
上边不是写着CONTROLLER: AIP31068吗?不是PCF8574
回复

使用道具 举报

6#
ID:787536 发表于 2020-6-23 11:55 | 只看该作者
非常感谢 学习到了 不过可以发一下proteus图吗
回复

使用道具 举报

7#
ID:155507 发表于 2020-6-23 18:51 | 只看该作者
heyguys 发表于 2020-6-23 11:55
非常感谢 学习到了 不过可以发一下proteus图吗

proteus图


回复

使用道具 举报

8#
ID:299872 发表于 2021-9-23 08:00 | 只看该作者

请问下这个LED I2C地址是多少?怎么能查到?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表