找回密码
 立即注册

QQ登录

只需一步,快速开始

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

我要崩溃了,到底哪里出了问题?单片机编译没有错误没有警告,但是k1,k2不知道哪个...

[复制链接]
跳转到指定楼层
楼主
#include "reg52.h"
#include "i2c.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit lsa=P2^2;
sbit lsb=P2^3;
sbit lsc=P2^4;

sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(i)
{
          while(i--);
}
unsigned char num=100;
void Keypros()
{
           if(k1==0)
          {
                   delay(1000);
                 if(k1==0)
                 {
                         At24c02Write(1,num);
                 }
                 while(!k1);
          }
          if(k2==0)
          {
                   delay(1000);
                 if(k2==0)
                 {
                         At24c02Read(1);
                 }
                 while(!k2);
          }
          if(k3==0)
          {
                   delay(1000);
                 if(k3==0)
                 {
                    num++;
                        if(num>255)
                         {
                                 num=0;
                         }
                 }
                 while(!k3);
          }
          if(k4==0)
          {
                   delay(1000);
                 if(k4==0)
                 {
                    num=0;
                 }
                 while(!k4);
          }
}
u8 disp[4];
void datapros()
{
          disp[0]=smgduan[num/1000];
         disp[1]=smgduan[num%1000/100];
         disp[2]=smgduan[num%1000%100/10];
         disp[3]=smgduan[num%1000%100%10];
}
void DigDisplay()
{
                 u8 i;
                   for(i=0;i<4;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;
                          }
                           P0=disp[3-i];
                           delay(100);
                           P0=0x00;
                   }
}


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

//这是主函数页,下面是i2c.c页//
#include "i2c.h"
#include "reg52.h"

void delay10us()   //误差 0us
{
    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 i,j;
         for(i=0;i<8;i++)
         {
         
         SDA=dat>>7;
         dat=dat<<1;
         delay10us();
         SCL=1;
         delay10us();
         SCL=0;
         delay10us();
         }
         SDA=1;
         delay10us();
         SCL=1;
         while(SDA)
         {
                j++;
                if(j>200)
                 {
                         SCL=0;
                        delay10us();
                        return 0;
                 }
         }
          SCL=0;
          delay10us();
          return 1;
}
unsigned char I2cReadByte()
{
          unsigned char i,dat=0;
           SDA=1;                        //起始和发送一个字节之后SCL都是0
           delay10us();
          for(i=0;i<8;i++)
          {
             SCL=1;
                 delay10us();
                   dat=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;
}

//下面的头文件页//
#ifndef _I2C_H
#define _I2C_H

#include <reg52.h>

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

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);



#endif



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:425921 发表于 2018-11-30 21:42 | 只看该作者
实现现象:下载程序后数码管后4位显示0,按K1保存显示的数据,按K2读取上次保存的数据,按K3显示数据加一,按K4显示数据清零。  问题就在于  不知道K1有问题还是K2有问题, 不知道是没写进去,还是读不出来???
回复

使用道具 举报

板凳
ID:434807 发表于 2018-12-2 14:06 | 只看该作者
测试程序的时候可以屏蔽掉不用的地方,单独看你想要测试的地方,这样你就可以知道程序有没有执行了
回复

使用道具 举报

地板
ID:425921 发表于 2018-12-3 01:05 来自手机 | 只看该作者
谢小康4 发表于 2018-12-2 14:06
测试程序的时候可以屏蔽掉不用的地方,单独看你想要测试的地方,这样你就可以知道程序有没有执行了

怎么屏蔽掉?
回复

使用道具 举报

5#
ID:434807 发表于 2018-12-3 08:32 | 只看该作者

把次要的部分屏蔽掉就可以了,比如在看K1作用时,可以把K2屏蔽掉,反之亦然。

回复

使用道具 举报

6#
ID:438094 发表于 2018-12-3 08:40 | 只看该作者
死循环
回复

使用道具 举报

7#
ID:438094 发表于 2018-12-3 08:43 | 只看该作者
死循环啊  while
回复

使用道具 举报

8#
ID:308437 发表于 2018-12-3 09:50 | 只看该作者
屏蔽的意思是,你一点点确定你程序是没问题的。首先,你先保证,你的那个显示没问题,然后是按键(个人感觉你的按键函数也是有问题的),程序里面尽量不要用while()循环,初学 写的程序容易死掉。
回复

使用道具 举报

9#
ID:425921 发表于 2018-12-5 23:49 来自手机 | 只看该作者
谢小康4 发表于 2018-12-3 08:32
把次要的部分屏蔽掉就可以了,比如在看K1作用时,可以把K2屏蔽掉,反之亦然。

哦哦!谢谢!谢谢!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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