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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5091|回復: 8
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 3205440665 于 2020-3-5 22:45 編輯

/*
截止2020.3.5,用protues8.8能正常仿真tm1637進行數碼管顯示,但是不能正常仿真按鍵檢測,
經與keil4聯調后發現,在仿真時DIO端口一直為0,哪怕寫上DIO=1;但是實際DIO依然為0;
導致按鍵檢測的返回值為0x00;目前還不能找到原因,
根據tm1638使用經驗,大概率是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


/********************定義數據*************************/
unsigned char code CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共陽顯示數據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,};//數碼管不顯示

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

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

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

/***************發送8bit數據,從低位開始**************/
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位數據傳送完                 
        CLK = 0;                                                                //判斷芯片發過來的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;                                                          //判斷芯片發過來的ACK應答信號
                nop;
                nop;
                while(DIO==1);
                nop;
                nop;
                CLK = 1;
                nop;
                nop;
                I2CStop();
                        
                return rekey;
}

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

}

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

}

/************按鍵處理函數,按鍵數據低位在前高位在后************/

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, 下載次數: 81)

電路

電路

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

時序及說明

時序及說明

TM1637_V2.5.pdf

945.97 KB, 下載次數: 29

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

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

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

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

tm1637電路

tm1637電路

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

tm1637屬性對話框

tm1637屬性對話框
回復

使用道具 舉報

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

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

使用道具 舉報

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

網上找的,安裝后就已經破了
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区二区三区在线观看 | 97国产精品视频人人做人人爱 | 成人网在线观看 | 91啪影院 | 国产亚洲网站 | 日韩在线电影 | 免费一级毛片 | 久久这里只有精品首页 | 久久精品久久综合 | 色综合久久天天综合网 | 中文字幕在线观看 | 久久久91精品国产一区二区三区 | 精品国产aⅴ | www.国产.com| 国产免费一级一级 | 性一爱一乱一交一视频 | 能看的av网站 | 久久精品国产免费一区二区三区 | 一级看片| 国产乱一区二区三区视频 | 国产精品久久久久久久久久久久久久 | 日韩在线观看 | 四虎影院新网址 | 日本精品视频在线观看 | 9久9久| 精品久久国产 | 久久精品视频亚洲 | 国产不卡在线观看 | 色在线免费视频 | 中文字幕精品一区二区三区在线 | 黄色片视频免费 | 成年人网站免费视频 | 久久久久国产精品午夜一区 | 国产乱码精品一区二区三区五月婷 | 青青久草| 日韩av在线免费 | 日韩av在线免费 | 在线免费国产视频 | 国产亚洲欧美另类一区二区三区 | 国产福利久久 | 鸳鸯谱在线观看高清 |