久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

Proteus8.8仿真單片機tm1637時按鍵程序不工作,怎么解決?哪位給點意見啊!

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:82043 發(fā)表于 2020-3-5 20:58 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 3205440665 于 2020-3-5 22:45 編輯

/*
截止2020.3.5,用protues8.8能正常仿真tm1637進行數(shù)碼管顯示,但是不能正常仿真按鍵檢測,
經(jīng)與keil4聯(lián)調(diào)后發(fā)現(xiàn),在仿真時DIO端口一直為0,哪怕寫上DIO=1;但是實際DIO依然為0;
導致按鍵檢測的返回值為0x00;目前還不能找到原因,
根據(jù)tm1638使用經(jīng)驗,大概率是protues軟件問題,個人分析。
示例程序由官方程序修改,電路也按照官方要求連線。
*/

單片機源程序如下:
#include <reg52.h>                                                //頭文件
#include "intrins.h"                                                //包含_nop_()指令頭文件

#define nop _nop_();_nop_();_nop_();_nop_();_nop_();                 //宏定義

/********************定義控制端口**********************/
sbit CLK=P1^0;                                                                 //定義CLK
sbit DIO=P1^1;                                                                 //定義DIO


/********************定義數(shù)據(jù)*************************/
unsigned char code CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共陽顯示數(shù)據(jù)0-F
                                                        /* 0   1    2    3    4     5    6    7     8    9   a     b    c    d    e    f*/
unsigned char code TAB[10]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};//數(shù)碼管不顯示

/********************延時函數(shù),延時nms******************/
void delay_nms(unsigned int n)
{
unsigned int i;
while(n--)
   for(i=0;i<550;i++);
}

/********************Start函數(shù)*************************/
void I2CStart()
{
        DIO=1;
        CLK=1;
        nop;
        DIO=1;
        nop;
        DIO=0;
        nop;
        CLK=0;
}

/********************Stop函數(shù)*************************/
void I2CStop()
{
    CLK=0;
    nop;
    nop;
    DIO=0;
    nop;
    nop;
    CLK=1;
    nop;
    nop;
    nop;
    DIO=1;
    nop;
    CLK=0;
    DIO=0;
}

/***************發(fā)送8bit數(shù)據(jù),從低位開始**************/
void I2CWritebyte(unsigned char oneByte)
{
  unsigned char i;
  for(i=0;i<8;i++)
  {
    CLK=0;
        if(oneByte&0x01)
          DIO=1;
        else
          DIO=0;
        nop;
    CLK=1;
    oneByte=oneByte>>1;
  }
                                                                                  //8位數(shù)據(jù)傳送完                 
        CLK = 0;                                                                //判斷芯片發(fā)過來的ACK應答信號
        nop;
        while(DIO==1);
        nop;
        CLK = 1;
        nop;
}

/***************讀按鍵程序**************/
unsigned char read_key()
{
        unsigned char rekey=0,i;
        I2CStart();
        I2CWritebyte(0x42);                                                         //寫讀鍵指令0x42
        DIO=1;
        for(i=0;i<8;i++)
        {
                CLK=0;
                nop;
                nop;
                rekey=rekey>>1;                                                           //先讀低位
                nop;
                nop;
                CLK=1;
                if(DIO)
                  rekey=rekey|0x80;
                else
                  rekey=rekey|0x00;
                nop;
                  
        }

                CLK = 0;                                                          //判斷芯片發(fā)過來的ACK應答信號
                nop;
                nop;
                while(DIO==1);
                nop;
                nop;
                CLK = 1;
                nop;
                nop;
                I2CStop();
                        
                return rekey;
}

/************顯示函數(shù),地址自加一************/
void disp0(unsigned char *p)                              
{
        unsigned char i;
        I2CStart();
        I2CWritebyte(0x40);                                  //數(shù)據(jù)命令設置:地址自動加1,寫數(shù)據(jù)到顯示寄存器
        I2CStop();
        
        I2CStart();
        I2CWritebyte(0xc0);                                  //地址命令設置:初始地址為00H
        for(i=0;i<6;i++)                                  //發(fā)送6字節(jié)數(shù)據(jù)到顯存
        {
        I2CWritebyte(*p);
        p++;
        }
        I2CStop();
        
        I2CStart();
        I2CWritebyte(0x8C);                                 //顯示控制命令:開顯示,脈沖寬度為11/16.
        I2CStop();

}

/************顯示函數(shù),固定地址寫數(shù)據(jù)************/
void smg_disp(unsigned char add, unsigned char value)
{
        I2CStart();
        I2CWritebyte(0x44);                                 //數(shù)據(jù)命令設置:固定地址,寫數(shù)據(jù)到顯示寄存器
        I2CStop();
        
        I2CStart();
        I2CWritebyte(0XC0+add);                                //地址命令設置:寫入add對應地址
        
        I2CWritebyte(~CODE[value]);                        //給add地址寫數(shù)據(jù)
        I2CStop();
        
        I2CStart();
        I2CWritebyte(0x8C);                                //顯示控制命令:開顯示,脈沖寬度為11/16.
        I2CStop();

}

/************按鍵處理函數(shù),按鍵數(shù)據(jù)低位在前高位在后************/

void key_process()
{
unsigned char temp;
temp=read_key();                                   //讀取按鍵返回值
  P0=temp;                //用于直觀顯示rekey的值

if(temp!=0xff)
{
  disp0(TAB);                                           //清屏
  switch(temp)
  {
                case 0xf7 : smg_disp(0,1);break;                  //K1與SG1對應按鍵按下,顯示1
        case 0xf6 : smg_disp(1,2);break;                  //K1與SG2對應按鍵按下,顯示2
        case 0xf5 : smg_disp(2,3);break;                  //K1與SG3對應按鍵按下,顯示3
        case 0xf4 : smg_disp(3,4);break;                  //K1與SG4對應按鍵按下,顯示4
        case 0xef : smg_disp(4,5);break;                  //K2與SG1對應按鍵按下,顯示5
        case 0xee : smg_disp(5,6);break;                  //K2與SG2對應按鍵按下,顯示6


  }
}
}

void main()
{   
    smg_disp(0,6);
        smg_disp(1,5);
        smg_disp(2,4);
        smg_disp(3,3);
        smg_disp(4,2);
        smg_disp(5,1);        
        delay_nms(1);

        while(1)
        {
                key_process(); //問題:按鍵程序無用
                delay_nms(100);
        }

}





tm1637.png (53.89 KB, 下載次數(shù): 81)

電路

電路

TM1637讀按鍵時序及說明.png (213.58 KB, 下載次數(shù): 71)

時序及說明

時序及說明

TM1637_V2.5.pdf

945.97 KB, 下載次數(shù): 29

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:687694 發(fā)表于 2020-3-5 22:50 | 只看該作者
電路圖發(fā)個全的看看。主要看不到DIO引腳接線全圖。你可斷開mcu與芯片的DIO連接,寫入P1^1=1,觀察是否可以拉高。再觀察芯片DIO引腳是高還是低,這個通訊結(jié)構(gòu)時序貌似就是I2C,正常情況應該雙高釋放總線,如果DIO上電就是低電平,則芯片的仿真有問題。查看屬性設置能否解決。
回復

使用道具 舉報

板凳
ID:703348 發(fā)表于 2020-3-6 10:52 | 只看該作者
延遲時間應該要設置長一點吧,一般IO端口的工作頻率比CPU主頻低很多,我看你延遲用的nop,估計不夠
回復

使用道具 舉報

地板
ID:703348 發(fā)表于 2020-3-6 10:53 | 只看該作者
IO端口工作頻率比CPU低很多,延遲設置長一點應該是可以的。
順便問一下,你這個Proteus 8.8 SP1版本的license怎么搞的?怎么破解的
回復

使用道具 舉報

5#
ID:82043 發(fā)表于 2020-3-6 16:00 | 只看該作者
lovexulu 發(fā)表于 2020-3-5 22:50
電路圖發(fā)個全的看看。主要看不到DIO引腳接線全圖。你可斷開mcu與芯片的DIO連接,寫入P1^1=1,觀察是否可以 ...

1、單獨測試DIO,能正常工作。2、傳入一位后雙高釋放總線,DIO依然為0.

3、tm1637屬性對話框如圖,沒看到什么能改的????
4、延時改為delay100us(1)和delay100us(10)進行測試,按鍵均不工作。

搞不定就用實物,不仿真了

111.jpg (43.22 KB, 下載次數(shù): 54)

tm1637電路

tm1637電路

222.jpg (54.13 KB, 下載次數(shù): 48)

tm1637屬性對話框

tm1637屬性對話框
回復

使用道具 舉報

6#
ID:82043 發(fā)表于 2020-3-6 16:01 | 只看該作者
者旨於陽 發(fā)表于 2020-3-6 10:52
延遲時間應該要設置長一點吧,一般IO端口的工作頻率比CPU主頻低很多,我看你延遲用的nop,估計不夠

延時改為delay100us(1)和delay100us(10)進行測試,按鍵均不工作。
回復

使用道具 舉報

7#
ID:82043 發(fā)表于 2020-3-6 16:02 | 只看該作者
者旨於陽 發(fā)表于 2020-3-6 10:53
IO端口工作頻率比CPU低很多,延遲設置長一點應該是可以的。
順便問一下,你這個Proteus 8.8 SP1版本的lice ...

網(wǎng)上找的,安裝后就已經(jīng)破了
回復

使用道具 舉報

8#
ID:516163 發(fā)表于 2021-1-20 17:15 | 只看該作者
相同的問題,我也遇到了,應該DIO端口的問題,改為INPUT應該可以,問題不知道怎么改
回復

使用道具 舉報

9#
ID:115923 發(fā)表于 2021-10-13 16:28 | 只看該作者
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 韩国电影久久 | 综合久久亚洲 | 一起操网站 | av一级一片 | 欧美日韩综合一区 | 亚洲欧美一区二区三区视频 | 亚洲精品自在在线观看 | 91亚洲国产成人精品一区二三 | 国产清纯白嫩初高生在线播放视频 | 国产一区久久精品 | 美女福利视频一区 | 成人久久18免费网站图片 | 国产羞羞视频在线观看 | 国产盗摄视频 | 欧美视频在线播放 | 国产欧美精品一区二区三区 | 成人免费视频网站在线观看 | 波多野吉衣在线播放 | 99久久久国产精品 | 国产精品成人一区二区三区 | a级在线免费视频 | 超级黄色一级片 | 老司机精品福利视频 | 国产 欧美 日韩 一区 | 亚洲成av人片在线观看无码 | 激情六月丁香婷婷 | 黄色精品 | 日本手机看片 | 日韩一区二区三区四区五区 | 日本免费一区二区三区 | 精品欧美一区二区三区精品久久 | 视频一区二区在线观看 | 国产欧美日韩精品在线观看 | 久久精品国产免费 | 男女久久久 | 大乳boobs巨大吃奶挤奶 | 欧美日韩1区2区 | 国产在线一区二区 | 精品一二三 | 国产精品久久久久久久久久久久 | 视频二区 |