找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 843|回复: 2
收起左侧

基于PCF8591的ADDA转换,我的lcd1602亮不起来,求助

[复制链接]
ID:1134495 发表于 2024-12-18 23:21 | 显示全部楼层 |阅读模式
LCD1602封装函数用的江科大的


#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include "LCD1602.h"
#define uchar unsigned char
#define uint unsigned int

// PCF8591相关地址及控制字定义
sbit SCL = P1^1;  // I2C时钟线,假设连接到P2.0,根据实际电路图修改
sbit SDA = P1^2;  // I2C数据线,假设连接到P2.1,根据实际电路图修改



// 延时函数
void delayms(uchar ms)
{
    uchar i;
    while(ms--)
    {
        for(i = 0; i < 123; i++);
    }
}

// I2C起始信号
void I2C_Start()
{
    SDA = 1;
    SCL = 1;
    _nop_();_nop_();_nop_();_nop_();_nop_();
    SDA = 0;
    _nop_();_nop_();_nop_();_nop_();_nop_();
    SCL = 0;
}

// I2C停止信号
void I2C_Stop()
{
    SDA = 0;
    SCL = 1;
    _nop_();_nop_();_nop_();_nop_();_nop_();
    SDA = 1;
    _nop_();_nop_();_nop_();_nop_();_nop_();
    SCL = 0;
}

// I2C发送应答信号
void I2C_SendAck()
{
    SDA = 0;
    SCL = 1;
    _nop_();_nop_();_nop_();_nop_();_nop_();
    SCL = 0;
    SDA = 1;
}

// I2C发送非应答信号
void I2C_SendNotAck()
{
    SDA = 1;
    SCL = 1;
    _nop_();_nop_();_nop_();_nop_();_nop_();
    SCL = 0;
    SDA = 0;
}

// I2C发送一个字节数据
void I2C_SendByte(uchar dat)
{
    uchar i;
    for(i = 0; i < 8; i++)
    {
        SDA = (bit)(dat & 0x80);
        SCL = 1;
        _nop_();_nop_();_nop_();_nop_();_nop_();
        SCL = 0;
        dat <<= 1;
    }
    // 接收应答信号
    SDA = 1;
    SCL = 1;
    _nop_();_nop_();_nop_();_nop_();_nop_();
    while(SDA);
    SCL = 0;
}

// I2C接收一个字节数据
uchar I2C_RecvByte()
{
    uchar i, dat = 0;
    SDA = 1;
    for(i = 0; i < 8; i++)
    {
        SCL = 1;
        dat <<= 1;
        if(SDA)
        {
            dat |= 0x01;
        }
        SCL = 0;
    }
    return dat;
}

// PCF8591进行DA转换
void PCF8591_DA(uchar dat)
{
    I2C_Start();
    I2C_SendByte(0x90);  // PCF8591写地址
    I2C_SendAck();
    I2C_SendByte(0x40);  // 控制字节,选择通道0进行DA转换
    I2C_SendAck();
    I2C_SendByte(dat);
    I2C_SendAck();
    I2C_Stop();
}

// PCF8591进行AD转换,选择通道2
uchar PCF8591_AD()
{
    uchar dat;
    I2C_Start();
    I2C_SendByte(0x90);  // PCF8591写地址
    I2C_SendAck();
    I2C_SendByte(0x42);  // 控制字节,选择通道2进行AD转换
    I2C_SendAck();
    I2C_Start();
    I2C_SendByte(0x91);  // PCF8591读地址
    I2C_SendAck();
    dat = I2C_RecvByte();
    I2C_SendNotAck();
    I2C_Stop();
    return dat;
}


// 主函数
void main()
{
    uchar ad_value;
    uchar da_value = 0;
    char ad_str[16];
    char da_str[16];
    LCD_Init();

    while(1)
    {
        PCF8591_DA(da_value);
        delayms(10);
        ad_value = PCF8591_AD();

        //转换AD值为字符串
        sprintf(ad_str, "AD: %d", ad_value);
        //转换DA值为字符串
        sprintf(da_str, "DA: %d", da_value);
        LCD_ShowString(1, 1, "sdhjkbv");
        LCD_ShowString(2, 1, da_str);

        da_value++;
        if(da_value > 255)
        {
            da_value = 0;
        }
    }
}

1FA7EE3A30F0A6E340F566AD2150B098.png
A052A81176C0461397DC29FE1F9B9ACB.png
回复

使用道具 举报

ID:161164 发表于 2024-12-19 11:41 | 显示全部楼层
江科大的LCD1602引脚和你的仿真图不匹配
RS=P26
RW=P25
EN=P27
要不改仿真
要不改代码
回复

使用道具 举报

ID:1134495 发表于 2024-12-19 13:05 | 显示全部楼层
lkc8210 发表于 2024-12-19 11:41
江科大的LCD1602引脚和你的仿真图不匹配
RS=P26
RW=P25

那里面的引脚我改过了的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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