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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機程序按鍵后怎么顯示的數字不自動增加

  [復制鏈接]
跳轉到指定樓層
樓主
ID:347814 發表于 2019-6-19 12:19 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
功能:我想通過按鍵時把一個初始值(本例是50)通過數碼管顯示出來,以后每按一次按鍵,數值就加1,
    但我仿真時,按鍵卻不能自動增加,不知是什么原因?

單片機源程序如下:
/*兩位靜態數碼管顯示按鍵次數*/
//頭文件
#include "reg51.h"
/* 定義 uint uchar  */
typedef unsigned int uint;
typedef unsigned char uchar;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,  
         0x92,0x82,0xf8,0x80,0x90};   //0~9的數組   (共陽極)

sbit key = P1^0;                          //定義按鍵
void Delay_ms(uint z);       //聲明延時函數
void main(void)                           //主函數
{
uint i;     
while(1)
{   
  if(key == 0)                      //判斷按鍵是否按下
  {
   Delay_ms(10);      //延時10ms
   if(key == 0)      //再次判斷
   {
   i=50; i++;       //按鍵次數
    while(key == 0);    //判斷是否松開按鍵
    if(i == 100) i=0;    //如果到達99,下一次回到0
   }
  }         
  P2 = table[i/10];          //顯示十位
  P3 = table[i%10];          //顯示各位   
}
}

void Delay_ms(uint z)                 //延時函數
{
while(z--) 12.000MHz
{
  unsigned char i, j;

  i = 2;
  j = 239;
  do
  {
   while (--j);
  } while (--i);
}
}

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

使用道具 舉報

沙發
ID:332444 發表于 2019-6-19 15:50 | 只看該作者
i=50;移動到按鈕外面
回復

使用道具 舉報

板凳
ID:564631 發表于 2019-6-19 17:43 | 只看該作者
i=50;i++;這兩條有問題,i=50放的位置錯了,每次按鍵進入都重新賦值50,永遠都是51的值,沒有任何的變化,建議放在全局變量,或者i定義成靜態全局變量
回復

使用道具 舉報

地板
ID:452821 發表于 2019-6-19 19:11 | 只看該作者
每次按鍵計數之前先給賦50所以每次按下都是51,初值要在循環外面賦值一次即可
回復

使用道具 舉報

5#
ID:565305 發表于 2019-6-19 19:56 | 只看該作者
很明顯,每次進入下述代碼時
   if(key == 0)      //再次判斷
   {
   i=50; i++;       //按鍵次數
    while(key == 0);    //判斷是否松開按鍵

你的 i 又被賦值為 50 了

把 i=50 放到初始化的地方寫吧
回復

使用道具 舉報

6#
ID:424598 發表于 2019-6-19 20:23 來自手機 | 只看該作者
你每次都重置i=50,變量怎么能增加
回復

使用道具 舉報

7#
ID:332444 發表于 2019-6-19 20:37 | 只看該作者
修改2處uint i=50;       i=50; i++;       //按鍵次數   此處刪除  i=50;
回復

使用道具 舉報

8#
ID:567243 發表于 2019-6-19 21:01 | 只看該作者
i=50; i++;       //按鍵次數     你每次進按鍵后都賦了50,后面++,應該是在50-51這兩個數了,你看對?
回復

使用道具 舉報

9#
ID:567243 發表于 2019-6-19 21:03 | 只看該作者
i=50; i++;       //按鍵次數     你每次進按鍵后都賦了50,后面++,應該是在50-51這兩個數了,你看對?
回復

使用道具 舉報

10#
ID:293363 發表于 2019-6-19 21:08 | 只看該作者
按鍵處理程序沒對   i=50;要放在while(1)之前,你的程序是每次按下按鍵都給i賦值50,然后+1肯定不會加啊
if(key == 0)                      //判斷按鍵是否按下
  {
   Delay_ms(10);      //延時10ms
   if(key == 0)      //再次判斷
   {
   i++;       //按鍵次數
    while(key == 0);    //判斷是否松開按鍵
    if(i == 100) i=0;    //如果到達99,下一次回到0
   }
  }         
  P2 = table[i/10];          //顯示十位
  P3 = table[i%10];          //顯示各位   
}
}
回復

使用道具 舉報

11#
ID:552614 發表于 2019-6-19 21:14 | 只看該作者
你把i定義成全局變量試一下,因為你一直在while語句里一直讓i=50,它執行完加一跳出去再進來還是等于50
回復

使用道具 舉報

12#
ID:105364 發表于 2019-6-19 21:28 | 只看該作者
  if(key == 0)      //再次判斷
   {
   i=50; i++;       //按鍵次數
    while(key == 0);    //判斷是否松開按鍵
    if(i == 100) i=0;    //如果到達99,下一次回到0
   }
每次進入按鍵代碼,i都賦值50;
回復

使用道具 舉報

13#
ID:567323 發表于 2019-6-19 22:05 | 只看該作者
不好弄啊
回復

使用道具 舉報

14#
ID:342822 發表于 2019-6-19 22:23 | 只看該作者
#include "reg51.h"
/* 定義 uint uchar  */
typedef unsigned int uint;
typedef unsigned char uchar;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,  
         0x92,0x82,0xf8,0x80,0x90};   //0~9的數組   (共陽極)

sbit key = P1^0;                          //定義按鍵
void Delay_ms(uint z);       //聲明延時函數
void main(void)                           //主函數
{
uint i ;
i=50;   
while(1)
{   
  if(key == 0)                      //判斷按鍵是否按下
  {
   Delay_ms(10);      //延時10ms
   if(key == 0)      //再次判斷
   {
    i++;       //按鍵次數
    while(key == 0);    //判斷是否松開按鍵
    if(i == 100) i=0;    //如果到達99,下一次回到0
   }
  }         
  P2 = table[i/10];          //顯示十位
  P3 = table[i%10];          //顯示各位   
}
}

void Delay_ms(uint z)                 //延時函數
{
while(z--)
{
  unsigned char i, j;

  i = 2;
  j = 239;
  do
  {
   while (--j);
  } while (--i);
}
}
i=50在循環外就ok~~
回復

使用道具 舉報

15#
ID:207421 發表于 2019-6-20 01:19 | 只看該作者
/*有問題的我都注釋了,下面應該要有程序明細介紹*/
/************************************************************************
* 工  程  名: xxxxxxxx
* 單片機型號: xxxxxxxx
* 晶      振: xxxxxxxx
* 接口說明:
*          例如 數碼管段選什么IO,位選什么IO,數碼管驅動芯片有哪些,分別接到了哪些IO。
*                            按鍵接到哪個IO,有沒有跳帽 等 等 等 等 等 等 !
* 還可以寫更詳細,客戶一看就都知道了。
************************************************************************/
#include "reg51.h"
typedef unsigned int uint;
typedef unsigned char uchar;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};   //0~9的數組   (共陽極)
sbit key = P1^0;        //定義按鍵
void Delay_ms(uint z);  //聲明延時函數
//主函數
void main(void)        
{
        uint i=50;   /*    i=50; 在這里初始化 ,運行程序就會顯示50  */   
        while(1)
        {   
                if(key == 0)       //判斷按鍵是否按下
                {
                        Delay_ms(10);  //延時10ms
                        if(key == 0)   //再次判斷
                        {
                                i++;     /*  i=50; i++;  不能放在這里初始化,否則每一次按鍵都是50, i++; 留著   */          //按鍵次數
                                while(key == 0);    //判斷是否松開按鍵
                                if(i == 100) i=0;    //如果到達99,下一次回到0
                        }
                }
                /*
                這里基本上全錯了,P2->十位, P3->個位  這不亂套了嗎?   段選有兩個IO口的嗎???
                位選 居然看不到 是哪個IO? 有沒有驅動芯片?
                P2 = table[i/10];          //顯示十位
                P3 = table[i%10];          //顯示各位
                要么我猜 P2 位選?  P3 段選? 還是位選直接接了電源正極嗎???
                */
                // 亂猜開始,數碼管延時函數值可能要調一調,不然會閃
                P2 = 0x01;                           //位選開 P20
                P3 = table[i/10];            //顯示十位 P3 段選
                Delay_ms(5);
                P2 = 0x00;                                         //關閉數碼管顯示
                Delay_ms(5);
                //
                P2 = 0x02;                           //位選開 P21
                P3 = table[i%10];            //顯示個位 P3 段選
                Delay_ms(5);
                P2 = 0x00;                                         //關閉數碼管顯示
                Delay_ms(5);
                // 亂猜結束,IO不對那就自己改,問題不明確,我也沒辦法。
        }
}
//延時函數  12.000MHz
void Delay_ms(uint z)                 
{
        while(z--)    //while 這種少用,容易出問題,特別是while很多的時候。 用for吧,不改了,這種小程序錯誤實在太多
        {
                unsigned char i, j;

                i = 2;
                j = 239;
                do
                {
                        while (--j);
                } while (--i);
        }
}

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品国产一区二区三区 | 成人美女免费网站视频 | 97视频在线免费 | 国产亚洲精品久久久久久牛牛 | 久久久国产精品一区 | 午夜日韩 | 午夜影院免费体验区 | 国产精品久久久久一区二区三区 | 国产成人精品午夜视频免费 | 亚洲一区二区三区欧美 | 欧美一区中文字幕 | 日韩精品在线一区 | 欧美成人一区二区三区 | 欧美国产日韩精品 | 91av在线看 | 欧美视频xxx | 亚洲视频在线播放 | 日韩av电影院 | 中文字幕亚洲在线 | 欧美日韩在线一区二区 | 在线观看免费福利 | 欧美日韩国产精品一区二区 | 中文字幕一区二区不卡 | 国产99小视频 | 一区二视频 | 国产极品91 | 国产黄色免费网站 | 免费毛片www com cn| 日本久久福利 | www久久| 日韩一区二区三区在线 | 一区天堂 | 亚洲精品粉嫩美女一区 | 你懂的在线视频播放 | 国产亚洲一区二区三区在线 | 久久精品99国产精品日本 | 亚洲天堂男人的天堂 | 欧美日韩精品久久久免费观看 | 影音先锋成人资源 | 人干人操 | 久久精品国产久精国产 |