尘世- 2022-11-17 20:02 采纳率: 80%
浏览 28
已结题

I^2C 的输入读取数据,用八位一体数码管显示,前四位输入数据,后四位输出显示

img

#include <reg51.h>

#include <stdio.h>
/*
仿真说明:程序运行后每按下3号按钮一次初始值由0自加1一次,配合按下2号按键保存当前显示的数据以实现字节写入功能,
按下1号按键读取上次保存的数据以实现数据读取功能。另外增加了4号按键实现数据清零功能。
*/
typedef unsigned int u16;      
typedef unsigned char u8;

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

void I2cStart();
void I2cStop();
unsigned char I2cSendByte(unsigned char dat);
unsigned char I2cReadByte();
void At24c02Write(unsigned char addr,unsigned char dat);
unsigned char At24c02Read(unsigned char addr);

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

sbit k1=P3^0;//保存数据
sbit k2=P3^1;//显示的数据
sbit k3=P3^2;//数据加一
sbit k4=P3^3; //数据清零

char num=0;
u8 disp[8];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};


void delay(u16 i)
{
    while(i--);    
}

void Keypros()//按键控制函数
{
    if(k1==0)
    {
        delay(1000);  
        if(k1==0)
        {
            At24c02Write(1,num);   
        }
        while(!k1);
    }
    if(k2==0)
    {
        delay(1000);  
        if(k2==0)
        {
            num=At24c02Read(1);     
        }
        while(!k2);
    }
    if(k3==0)
    {
        delay(100);  
        if(k3==0)
        {
            num++;       
            if(num>255)num=0;
        }
        while(!k3);
    }
    if(k4==0)
    {
        delay(1000);  
        if(k4==0)
        {
            num=0;         
        }
        while(!k4);
    }        
}
void Delay10us()
{
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=2;a>0;a--);

}

void I2cStart()
{
    SDA=1;
    Delay10us();
    SCL=1;
    Delay10us();
    SDA=0;
    Delay10us();
    SCL=0;            
    Delay10us();        
}

void I2cStop()
{
    SDA=0;
    Delay10us();
    SCL=1;
    Delay10us();
    SDA=1;
    Delay10us();        
}


unsigned char I2cSendByte(unsigned char dat)
{
    unsigned char a=0,b=0;    
    for(a=0;a<8;a++)
    {
        SDA=dat>>7;     
        dat=dat<<1;
        Delay10us();
        SCL=1;
        Delay10us();
        SCL=0;
        Delay10us();        
    }
    SDA=1;
    Delay10us();
    SCL=1;
    while(SDA)
    {
        b++;
        if(b>200)     
        {
            SCL=0;
            Delay10us();
            return 0;
        }
    }
    SCL=0;
    Delay10us();
     return 1;        
}

unsigned char I2cReadByte()
{
    unsigned char a=0,dat=0;
    SDA=1;            
    Delay10us();
    for(a=0;a<8;a++)
    {
        SCL=1;
        Delay10us();
        dat<<=1;
        dat|=SDA;
        Delay10us();
        SCL=0;
        Delay10us();
    }
    return dat;        
}




void At24c02Write(unsigned char addr,unsigned char dat)
{
    I2cStart();
    I2cSendByte(0xa0);
    I2cSendByte(addr);
    I2cSendByte(dat);    
    I2cStop();
}


unsigned char At24c02Read(unsigned char addr)
{
    unsigned char num;
    I2cStart();
    I2cSendByte(0xa0); 
    I2cSendByte(addr); 
    I2cStart();
    I2cSendByte(0xa1); 
    num=I2cReadByte(); 
    I2cStop();
    return num;    
}



void datapros()
{
    
    disp[1]=smgduan[num%1000/100];//百位
    disp[2]=smgduan[num%1000%100/10];//十位
    disp[3]=smgduan[num%1000%100%10];//个位
 
   
   
   
        disp[5]=smgduan[num%1000/100];//百位
    disp[6]=smgduan[num%1000%100/10];//十位
    disp[7]=smgduan[num%1000%100%10];//个位
 
 
 
          
}



void DigDisplay()
{
    u8 i;
    for(i=0;i<8;i++)
    {
        switch(i)     
        {
            case(0):
                LSA=0;LSB=0;LSC=0; break;
            case(1):
                LSA=1;LSB=0;LSC=0; break;
            case(2):
                LSA=0;LSB=1;LSC=0; break;
            case(3):
                LSA=1;LSB=1;LSC=0; break;
            case(4):
                LSA=0;LSB=0;LSC=1; break;
            case(5):
                LSA=1;LSB=0;LSC=1; break;
            case(6):
                LSA=0;LSB=1;LSC=1; break;
            case(7):
                LSA=1;LSB=1;LSC=1; break;
            
        }
        P0=disp[i];
        delay(100);     
        P0=0x00;
    }        
}


void main()
{    
    while(1)
    {
        Keypros();     
        datapros();     
        DigDisplay();        
    }        
}

现在是前四位可以输入数据,但是后四位的显示不会处理
想进行位选但是不行,请帮我想想怎么写
请帮我想想刚入门,请boss帮我想想怎么写
  • 写回答

2条回答 默认 最新

  • 智者知已应修善业 2022-11-18 09:30
    关注

    代码尚可入目,if(num>255)num=0;这个无用删除,num最大值255那来那么多位数?数码管显示没什么问题

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月29日
  • 已采纳回答 11月21日
  • 创建了问题 11月17日

悬赏问题

  • ¥15 cmd批处理参数如果含有双引号,该如何传入?
  • ¥15 fx2n系列plc的自控成型机模拟
  • ¥15 时间序列LSTM模型归回预测代码问题
  • ¥50 使用CUDA如何高效的做并行化处理,是否可以多个分段同时进行匹配计算处理?目前数据传输速度有些慢,如何提高速度,使用gdrcopy是否可行?请给出具体意见。
  • ¥15 基于STM32,电机驱动模块为L298N,四路运放电磁传感器,三轮智能小车电磁组电磁循迹(两个电机,一个万向轮),如何通过环岛的原理及完整代码
  • ¥20 机器学习或深度学习问题?困扰了我一个世纪,晚来天欲雪,能饮一杯无?
  • ¥15 c语言数据结构高铁订票系统
  • ¥15 关于wkernell.PDB加载的问题,如何解决?(语言-c#|开发工具-vscode)
  • ¥100 某宝多次访问被拒绝,求解
  • ¥15 (标签-STM32|关键词-智能小车)