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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2658|回復: 8
收起左側

單片機新手寫了一個關于秒表的小程序,遇到了一些問題,想請教一下

[復制鏈接]
ID:433107 發表于 2019-3-7 16:50 | 顯示全部樓層 |閱讀模式
我這個程序功能很簡單:通過tx-1c實驗班的第一個矩陣鍵盤按鍵開始計時

1、燒寫在板子上按鍵下去可以計時,但是數碼管只有當個位數變動時,十位數的顯示就閃一下,
     就是說個位數的數字顯示正常,但是十位數的數字一秒閃一次,想請教一下是什么問題?

2、我想讓按鍵能實現開始和暫停的功能,請問我應該怎么改?

3、還有想問一個小知識點,keil中的bit關鍵字定義的變量如果沒有初始化,那么這個變量初始值是1還是0呢?

剛開始學單片機,很多東西不是很懂,希望各位大佬能幫我解答一下,如果我的代碼寫得不好也希望能給我一些小建議吧,謝謝了。

單片機源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar code led[]={0x3f,0x06,0x5b,0x4f,0x66,
  5.                            0x6d,0x7d,0x07,0x7f,0x6f};             //數碼管段選信息
  6. uchar single, tenth;
  7. uchar flag;
  8. sbit dula=P2^6;
  9. sbit wela=P2^7;
  10. uint num=1;
  11. void delay(uchar ms)
  12. {
  13.     uchar i,j;
  14.     for(i=ms;i>0;i--)
  15.    for(j=110;j>0;j--) ;
  16. }
  17. void display(uchar tenth, uchar single)                  //數碼管顯示函數
  18. {
  19.     dula=1;
  20.     P0=led[tenth];
  21.     dula=0;
  22.     P0=0xff;
  23.     wela=1;
  24.     P0=0xfe;
  25.     wela=0;
  26.     delay(5);

  27.     dula=1;
  28.     P0=led[single];
  29.     dula=0;
  30.     P0=0xff;
  31.     wela=1;
  32.     P0=0xfd;
  33.     wela=0;
  34.     delay(5);
  35. }
  36. void keyscan()                             //鍵盤檢測
  37. {
  38.     uchar temp;
  39.     P3=0xfe;
  40.     temp=P3;
  41.     temp=temp&0xf0;
  42.     if(temp!=0xf0)
  43.     {
  44.    delay(10);
  45.    if(temp!=0xf0)
  46.    {
  47.     temp=P3;
  48.     switch(temp)
  49.     {
  50.      case 0xee:  flag=1;
  51.            break;
  52.             
  53.     }
  54.    
  55.     while(temp!=0xf0)
  56.      {
  57.       temp=P3;
  58.       temp=0xf0;
  59.      }
  60.    }
  61.   }
  62. }
  63. void main()
  64. {
  65.     single=0;
  66.     tenth=0;
  67.    display(tenth,single);
  68.     TMOD=0x02;                          //利用定時器0方式2計數
  69.     TL0=6;                                  //方式2為初值自動重裝的8位定時器
  70.     TH0=6;
  71.     keyscan();                            //檢測按鍵是否被按下
  72.    EA=1;
  73.    ET0=1;
  74.     TR0=1;
  75. while(flag)                                   //當檢測按鍵被按下開始計時
  76. {
  77.     if(num==3686)                         //中斷3686次相當于1s
  78.   {   
  79.    num=1;
  80.    single++;
  81.    if(single==10)
  82.    {
  83.     single=0;
  84.     tenth++;
  85.    }
  86.    display(tenth,single);
  87.   }
  88.   
  89.   }

  90. }
  91. void T0_time() interrupt 1              //中斷函數
  92. {
  93.     num++;
  94. }
復制代碼




回復

使用道具 舉報

ID:158956 發表于 2019-3-7 20:47 | 顯示全部樓層
中斷關閉就可以暫停了
回復

使用道具 舉報

ID:158956 發表于 2019-3-7 20:50 | 顯示全部樓層
keil中的bit關鍵字定義的變量如果沒有初始化,那么這個變量初始值是0
回復

使用道具 舉報

ID:473186 發表于 2019-3-7 22:42 | 顯示全部樓層
變量沒有初始化
回復

使用道具 舉報

ID:123289 發表于 2019-3-8 08:35 | 顯示全部樓層
變量初始值是1還是0?
養成好習慣,先做初始化。否則會吃苦頭的!!!即使板凳說明完全正確,也不要輕信!
回復

使用道具 舉報

ID:433107 發表于 2019-3-9 14:48 | 顯示全部樓層

請問具體是哪一個位置沒有初始化呢,可以給我指點一下嗎?
回復

使用道具 舉報

ID:433107 發表于 2019-3-9 14:56 | 顯示全部樓層
hufeng 發表于 2019-3-7 20:47
中斷關閉就可以暫停了

我的思路也是這樣,但是怎么讓單片機第二次檢測按鍵被按下呢?這個地方不太會寫
回復

使用道具 舉報

ID:213173 發表于 2019-3-9 21:38 | 顯示全部樓層
給你改這樣試試
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit dula=P2^6;
  5. sbit wela=P2^7;
  6. uchar code led[]={0x3f,0x06,0x5b,0x4f,0x66,
  7.                   0x6d,0x7d,0x07,0x7f,0x6f};//數碼管段選信息
  8. //uchar single, tenth;
  9. uchar flag=0,sec=0;
  10. uint num=0;
  11. bit sign1=0;

  12. void delay(uchar ms)
  13. {
  14.         uchar i,j;
  15.         for(i=ms;i>0;i--)
  16.                 for(j=110;j>0;j--) ;
  17. }
  18. void display()//數碼管顯示函數
  19. {
  20.         static bit k=0;

  21.     P0=0x00;//消隱
  22.     dula=1;
  23.     dula=0;
  24.         if(k==0)
  25.         {
  26.                 P0=0xfe;
  27.                 wela=1;
  28.                 wela=0;
  29.                
  30.                 P0=led[sec/10];
  31.                 dula=1;
  32.                 dula=0;
  33.                 k=1;
  34.         }
  35.         else
  36.         {
  37.                 P0=0xfd;
  38.                 wela=1;
  39.                 wela=0;
  40.                
  41.                 P0=led[sec%10];
  42.                 dula=1;
  43.                 dula=0;
  44.                 k=0;
  45.         }
  46. }
  47. void keyscan() //鍵盤檢測
  48. {
  49.         static bit sign;
  50. //        uchar temp;
  51.         P3=0xf0;
  52.         if(P3!=0xf0)
  53.         {
  54.                 delay(10);
  55.                 if((P3==0xe0)&&(sign==0))
  56.                 {
  57.                         sign=1;//自鎖
  58.                         flag++;
  59.                         if(flag==3)flag=0;
  60.                         if(flag==0){sec=0;num=0;}//清0
  61.                         if(flag==1)sign1=1;//啟動
  62.                         if(flag==2)sign1=0;//停止
  63.                 }
  64.         }
  65.         else sign=0;//按鍵抬起
  66. }
  67. void Timer0Init(void)//1毫秒@11.0592MHz
  68. {
  69.         TMOD = 0x01;        //設置定時器模式
  70.         TL0 = 0x66;                //設置定時初值
  71.         TH0 = 0xFC;                //設置定時初值
  72.         TR0 = 1;                //定時器0開始計時
  73.         EA=1;
  74.         ET0=1;
  75. }

  76. void main()
  77. {
  78.         Timer0Init();
  79.         while(1)               //當檢測按鍵被按下開始計時
  80.         {
  81.                 keyscan();                            //檢測按鍵是否被按下
  82.         }
  83. }
  84. void T0_time() interrupt 1 //中斷函數
  85. {
  86.         TL0 = 0x66;                //設置定時初值
  87.         TH0 = 0xFC;                //設置定時初值
  88.         if(sign1==1)
  89.         {
  90.                 num++;
  91.                 if(num>=1000)
  92.                 {
  93.                         num=0;
  94.                         sec++;
  95.                         if(sec>=100)
  96.                                 sec=0;
  97.                 }
  98.         }
  99.         display();//動態顯示
  100. }
復制代碼
回復

使用道具 舉報

ID:234075 發表于 2019-3-10 00:40 | 顯示全部樓層
變量的定義如果是全局變量(函數初始就定義了,在整個函數里都能使用),初始值=0;
如果是局部變量(在子函數中定義,只能在子函數中調用),初始值是隨機的

評分

參與人數 1黑幣 +5 收起 理由
菜用雞 + 5 贊一個!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99视频在线免费观看 | 亚洲精品国产a久久久久久 午夜影院网站 | 二区中文 | 亚洲精品一区二区在线观看 | 亚洲欧美中文日韩在线v日本 | 国产成人99久久亚洲综合精品 | 99久久精品国产一区二区三区 | 一区二区三区在线电影 | 国产一区二区三区久久久久久久久 | 精品影视| 欧美激情国产日韩精品一区18 | 亚洲精品久久久久中文字幕欢迎你 | 国产极品91| 欧美日韩精品一区 | 999久久久久久久久 国产欧美在线观看 | 丁香久久| 一级片免费在线观看 | 国产精品视频免费观看 | 日本久久视频 | 无码日韩精品一区二区免费 | 色综合国产| 久久大陆 | 欧美一区二区在线视频 | 国产成人精品免费 | 免费一级欧美在线观看视频 | 色偷偷888欧美精品久久久 | 国产美女一区二区 | 日韩欧美一区二区在线播放 | 99久久久无码国产精品 | 国产在视频一区二区三区吞精 | 中文字幕av一区 | 亚洲视频在线一区 | 人人澡视频 | 人人种亚洲 | 日日天天 | 亚洲精品v日韩精品 | 国产精品国产三级国产aⅴ中文 | 欧美理论片在线观看 | 一级毛片免费视频观看 | 日韩成人免费视频 | 一本一道久久a久久精品综合蜜臀 |