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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 18609|回復: 6
收起左側

單片機數碼管顯示問題(按鍵一次,數碼管加一)新人求助!

[復制鏈接]
ID:209318 發表于 2017-6-8 19:54 | 顯示全部樓層 |閱讀模式
我自己剛學,想實現一個功能,功能是:三個數碼管分別顯示個十百位,按鍵按下一次,數碼管加一,就是相當于用程序編了一個計數器。
計數沒有問題,進位也沒有問題,但是現在的問題是:仿真開始后,沒有操作的時候,只有兩個數碼管亮,就是不按下按鍵的時候前兩個數碼管亮,按下按鍵后不松開,最后一個數碼管亮。我想知道我程序哪里錯了,為什么不能三個數碼管同時亮。還有就是是不是要用中斷才能保證按下按鍵的時候數碼管也是亮著的呢,或者用啥方法按下按鍵的時候三個數碼管也亮著。(中斷我還沒看)謝謝各位大神指點。

按下按鍵是的顯示

按下按鍵是的顯示

沒有按下按鍵是的顯示(無視那個3)

沒有按下按鍵是的顯示(無視那個3)


  1. #include "reg52.h"
  2. #define smg P2   //定義數碼管顯示端口
  3. #define uint unsigned int
  4. sbit p1=P3^0;
  5. sbit p2=P3^1;
  6. sbit p3=P3^2;
  7. sbit p4=P3^3;
  8. sbit p5=P3^4;
  9. sbit p6=P3^5;    //定義數碼管6個片選端口
  10. sbit k1=P1^0;   //定義按鍵

  11. uint code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //共陰極數碼管


  12. void delay(uint i)   //延時子程序
  13.   {
  14.    while(i--) ;
  15.   }




  16. void main()
  17. {
  18. uint g=0;
  19. uint s=0;
  20. uint b=0;
  21. uint j=0;         // 定義個十,百,位。

  22.   while(1)
  23.   {
  24.      if(k1==0)              //如果按鍵按下
  25.          {         
  26.             delay(100);     //削抖
  27.                 g++;         //個位加一
  28.                 if(g>9)      //判斷是否向十位進位
  29.                 {
  30.                  s++;
  31.                  g=0;
  32.                 }
  33.             delay(1000);
  34.                 if(s>9)    //判斷是否向百位進位   
  35.                 {
  36.                  b++;
  37.                  s=0;
  38.                 }

  39.                 if(b>9)    //判斷是否歸零,即到達999
  40.                 {
  41.          g=0;
  42.                  s=0;
  43.                  b=0;  
  44.                 }
  45.           }
  46.          while(k1==0)     //判斷按鍵是否恢復
  47.            {
  48.               j=j;        //未恢復原位則循環此程序,直到恢復原位跳出,繼續執行
  49.             }
  50.          
  51.          p1=0;              
  52.          p2=1;
  53.          p3=1;
  54.          p4=1;
  55.          p5=1;
  56.          p6=1;             //片選
  57.          smg=smgduan[b];   //顯示百位
  58.          delay(100);

  59.                   
  60.          p1=1;
  61.          p2=0;
  62.         p3=1;
  63.          p4=1;
  64.          p5=1;
  65.          p6=1;
  66.          smg=smgduan[s];    //顯示十位
  67.          delay(100);

  68.                   
  69.          p1=1;
  70.          p2=1;
  71.          p3=0;
  72.          p4=1;
  73.          p5=1;
  74.          p6=1;
  75.          smg=smgduan[g];   //顯示個位
  76.          delay(100);
  77.   }
  78. }                  
復制代碼
回復

使用道具 舉報

ID:206560 發表于 2017-6-9 03:55 | 顯示全部樓層
消抖動和按鍵放開有沖突。 消抖動是 先判斷按下,然后計數,放開時檢查 計數(時間),如果時間很短,認為是抖動,不予理睬,繼續等待按下。
回復

使用道具 舉報

ID:209318 發表于 2017-6-13 09:42 | 顯示全部樓層
wangminfu 發表于 2017-6-9 03:55
消抖動和按鍵放開有沖突。 消抖動是 先判斷按下,然后計數,放開時檢查 計數(時間),如果時間很短,認為 ...

謝謝,那為啥我那個明明是選擇了三個數碼管,怎么同時只能亮一個
回復

使用道具 舉報

ID:210587 發表于 2017-6-13 17:09 | 顯示全部樓層
//你的程序改起來好辛苦,從新寫了個,你試試
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit k1=P1^0;
uchar bai,shi,ge;
uint code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};  //共陰極數碼管
void delay(uchar xms)//x毫秒的延時程序,你的延時程序問題太大了,while不是那么用的
{
        uchar i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);
}
void display()//顯示程序
{
        P3=0xff;//清屏
        delay(5);
        P3=0xfe;//位選
        P2=table[bai];
        delay(5);
        P3=0xff;
        delay(5);
        P3=0xfd;
        P2=table[shi];
        delay(5);P3=0xff;
        delay(5);
        P3=0xfb;
        P2=table[ge];
        delay(5);
}
void keyboard()//鍵盤掃描程序
{
        if(k1==0)
        {
                delay(10);
                if(k1==0)
                {
                        while(!k1);//等待按鍵釋放
                        ge++;
                        if(ge>9)
                        {
                                ge=0;
                                shi++;
                        }
                        if(shi>9)
                        {
                                shi=0;
                                bai++;       
                        }
                        if(bai>9)
                        {
                                ge=0;
                                shi=0;
                                bai=0;
                        }
                }
        }
}
void main()
{
        bai=0;
        shi=0;
        ge=0;
        while(1)
        {
                display();
                keboard();
}
回復

使用道具 舉報

ID:884223 發表于 2021-2-21 22:09 | 顯示全部樓層
year1987 發表于 2017-6-13 17:09
//你的程序改起來好辛苦,從新寫了個,你試試
#include
#define uchar unsigned char

蟹蟹大神,i了i了
回復

使用道具 舉報

ID:883031 發表于 2021-2-25 11:07 | 顯示全部樓層
消完抖以后還要判斷鍵是否按下。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品v国产精品v日韩精品 | 爱草在线 | 国产精品久久久久久久久久久久久久 | 国产精品国产精品国产专区不蜜 | 国产97久久| 成人天堂 | 国产成人99久久亚洲综合精品 | 国产伦精品一区二区三区高清 | 国产成人精品一区二三区在线观看 | 日日摸日日碰夜夜爽2015电影 | 色视频网站 | 日本高清不卡视频 | 成人国产在线观看 | av免费网站在线观看 | 日本在线视频中文字幕 | 欧美国产精品一区二区三区 | 免费a网 | 青青久久 | 91伊人| 久久专区 | 草久在线视频 | 免费成人在线网站 | 国产精品久久久久永久免费观看 | 成人片免费看 | 一区二区三区不卡视频 | 色桃网 | 中文字幕一区二区三区乱码在线 | 亚洲欧美视频 | 亚洲国产aⅴ成人精品无吗 综合国产在线 | 中文字幕视频在线 | 成人在线精品视频 | 人人爽人人爽人人片av | 久久伦理中文字幕 | 国产精品18毛片一区二区 | 精精国产视频 | www.久久99 | 免费看91 | 久久精品亚洲精品国产欧美 | 视频一区二区三区四区五区 | 久久精品久久久 | 久久久久久久久久久久久久久久久久久久 |