找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3061|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

我要崩潰了,到底哪里出了問題?單片機編譯沒有錯誤沒有警告,但是k1,k2不知道哪個...

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:425921 發(fā)表于 2018-11-30 21:40 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
#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();
   }
}

//這是主函數(shù)頁,下面是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;                        //起始和發(fā)送一個字節(jié)之后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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:425921 發(fā)表于 2018-11-30 21:42 | 只看該作者
實現(xiàn)現(xiàn)象:下載程序后數(shù)碼管后4位顯示0,按K1保存顯示的數(shù)據(jù),按K2讀取上次保存的數(shù)據(jù),按K3顯示數(shù)據(jù)加一,按K4顯示數(shù)據(jù)清零。  問題就在于  不知道K1有問題還是K2有問題, 不知道是沒寫進去,還是讀不出來???
回復(fù)

使用道具 舉報

板凳
ID:434807 發(fā)表于 2018-12-2 14:06 | 只看該作者
測試程序的時候可以屏蔽掉不用的地方,單獨看你想要測試的地方,這樣你就可以知道程序有沒有執(zhí)行了
回復(fù)

使用道具 舉報

地板
ID:425921 發(fā)表于 2018-12-3 01:05 來自手機 | 只看該作者
謝小康4 發(fā)表于 2018-12-2 14:06
測試程序的時候可以屏蔽掉不用的地方,單獨看你想要測試的地方,這樣你就可以知道程序有沒有執(zhí)行了

怎么屏蔽掉?
回復(fù)

使用道具 舉報

5#
ID:434807 發(fā)表于 2018-12-3 08:32 | 只看該作者

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

回復(fù)

使用道具 舉報

6#
ID:438094 發(fā)表于 2018-12-3 08:40 | 只看該作者
死循環(huán)
回復(fù)

使用道具 舉報

7#
ID:438094 發(fā)表于 2018-12-3 08:43 | 只看該作者
死循環(huán)啊  while
回復(fù)

使用道具 舉報

8#
ID:308437 發(fā)表于 2018-12-3 09:50 | 只看該作者
屏蔽的意思是,你一點點確定你程序是沒問題的。首先,你先保證,你的那個顯示沒問題,然后是按鍵(個人感覺你的按鍵函數(shù)也是有問題的),程序里面盡量不要用while()循環(huán),初學(xué) 寫的程序容易死掉。
回復(fù)

使用道具 舉報

9#
ID:425921 發(fā)表于 2018-12-5 23:49 來自手機 | 只看該作者
謝小康4 發(fā)表于 2018-12-3 08:32
把次要的部分屏蔽掉就可以了,比如在看K1作用時,可以把K2屏蔽掉,反之亦然。

哦哦!謝謝!謝謝!
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表