找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3144|回復: 14
收起左側

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

  [復制鏈接]
ID:347814 發(fā)表于 2019-6-19 12:19 | 顯示全部樓層 |閱讀模式
功能:我想通過按鍵時把一個初始值(本例是50)通過數(shù)碼管顯示出來,以后每按一次按鍵,數(shù)值就加1,
    但我仿真時,按鍵卻不能自動增加,不知是什么原因?

單片機源程序如下:
/*兩位靜態(tài)數(shù)碼管顯示按鍵次數(shù)*/
//頭文件
#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的數(shù)組   (共陽極)

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

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

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

回復

使用道具 舉報

ID:332444 發(fā)表于 2019-6-19 15:50 | 顯示全部樓層
i=50;移動到按鈕外面
回復

使用道具 舉報

ID:564631 發(fā)表于 2019-6-19 17:43 | 顯示全部樓層
i=50;i++;這兩條有問題,i=50放的位置錯了,每次按鍵進入都重新賦值50,永遠都是51的值,沒有任何的變化,建議放在全局變量,或者i定義成靜態(tài)全局變量
回復

使用道具 舉報

ID:452821 發(fā)表于 2019-6-19 19:11 | 顯示全部樓層
每次按鍵計數(shù)之前先給賦50所以每次按下都是51,初值要在循環(huán)外面賦值一次即可
回復

使用道具 舉報

ID:565305 發(fā)表于 2019-6-19 19:56 | 顯示全部樓層
很明顯,每次進入下述代碼時
   if(key == 0)      //再次判斷
   {
   i=50; i++;       //按鍵次數(shù)
    while(key == 0);    //判斷是否松開按鍵

你的 i 又被賦值為 50 了

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

使用道具 舉報

ID:424598 發(fā)表于 2019-6-19 20:23 來自手機 | 顯示全部樓層
你每次都重置i=50,變量怎么能增加
回復

使用道具 舉報

ID:332444 發(fā)表于 2019-6-19 20:37 | 顯示全部樓層
修改2處uint i=50;       i=50; i++;       //按鍵次數(shù)   此處刪除  i=50;
回復

使用道具 舉報

ID:567243 發(fā)表于 2019-6-19 21:01 | 顯示全部樓層
i=50; i++;       //按鍵次數(shù)     你每次進按鍵后都賦了50,后面++,應該是在50-51這兩個數(shù)了,你看對?
回復

使用道具 舉報

ID:567243 發(fā)表于 2019-6-19 21:03 | 顯示全部樓層
i=50; i++;       //按鍵次數(shù)     你每次進按鍵后都賦了50,后面++,應該是在50-51這兩個數(shù)了,你看對?
回復

使用道具 舉報

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

使用道具 舉報

ID:552614 發(fā)表于 2019-6-19 21:14 | 顯示全部樓層
你把i定義成全局變量試一下,因為你一直在while語句里一直讓i=50,它執(zhí)行完加一跳出去再進來還是等于50
回復

使用道具 舉報

ID:105364 發(fā)表于 2019-6-19 21:28 | 顯示全部樓層
  if(key == 0)      //再次判斷
   {
   i=50; i++;       //按鍵次數(shù)
    while(key == 0);    //判斷是否松開按鍵
    if(i == 100) i=0;    //如果到達99,下一次回到0
   }
每次進入按鍵代碼,i都賦值50;
回復

使用道具 舉報

ID:567323 發(fā)表于 2019-6-19 22:05 | 顯示全部樓層
不好弄啊
回復

使用道具 舉報

ID:342822 發(fā)表于 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的數(shù)組   (共陽極)

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

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

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

使用道具 舉報

ID:207421 發(fā)表于 2019-6-20 01:19 | 顯示全部樓層
/*有問題的我都注釋了,下面應該要有程序明細介紹*/
/************************************************************************
* 工  程  名: xxxxxxxx
* 單片機型號: xxxxxxxx
* 晶      振: xxxxxxxx
* 接口說明:
*          例如 數(shù)碼管段選什么IO,位選什么IO,數(shù)碼管驅動芯片有哪些,分別接到了哪些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的數(shù)組   (共陽極)
sbit key = P1^0;        //定義按鍵
void Delay_ms(uint z);  //聲明延時函數(shù)
//主函數(shù)
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++; 留著   */          //按鍵次數(shù)
                                while(key == 0);    //判斷是否松開按鍵
                                if(i == 100) i=0;    //如果到達99,下一次回到0
                        }
                }
                /*
                這里基本上全錯了,P2->十位, P3->個位  這不亂套了嗎?   段選有兩個IO口的嗎???
                位選 居然看不到 是哪個IO? 有沒有驅動芯片?
                P2 = table[i/10];          //顯示十位
                P3 = table[i%10];          //顯示各位
                要么我猜 P2 位選?  P3 段選? 還是位選直接接了電源正極嗎???
                */
                // 亂猜開始,數(shù)碼管延時函數(shù)值可能要調一調,不然會閃
                P2 = 0x01;                           //位選開 P20
                P3 = table[i/10];            //顯示十位 P3 段選
                Delay_ms(5);
                P2 = 0x00;                                         //關閉數(shù)碼管顯示
                Delay_ms(5);
                //
                P2 = 0x02;                           //位選開 P21
                P3 = table[i%10];            //顯示個位 P3 段選
                Delay_ms(5);
                P2 = 0x00;                                         //關閉數(shù)碼管顯示
                Delay_ms(5);
                // 亂猜結束,IO不對那就自己改,問題不明確,我也沒辦法。
        }
}
//延時函數(shù)  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);
        }
}

回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表