標題: 大家麻煩幫我看一下,我看的郭天祥的書,有一塊不懂 [打印本頁]

作者: 134849694164151    時間: 2018-5-29 23:17
標題: 大家麻煩幫我看一下,我看的郭天祥的書,有一塊不懂
本帖最后由 134849694164151 于 2020-3-26 16:14 編輯

已解決
作者: 134849694164151    時間: 2018-5-29 23:20
上邊照片不清晰,已經更新了清晰的圖在下面的樓層
作者: 名劍風流    時間: 2018-5-30 01:39
這應該是實現一個秒表的功能,按鍵函數就是一個判斷按鍵是否按下,大概有高低電平判斷,消抖,鍵沿控制,具體操作就是通過讀取相應引腳的數據對其數值進行判斷
作者: 程序新手    時間: 2018-5-30 08:53
我的想法是:書上的函數就是一個判斷按鍵是否按下;
應該會有高低電平判斷,以及高低電平的轉換吧(不是很確定);
一定要有按鍵消抖的過程;
主要就是看起相對應的引腳上面的數值,然后定義其顯示的數值所代表的功能來進行判斷的。
希望能對你有幫助。。。

作者: fzhlpp    時間: 2018-5-30 09:15
圖片看不清,學這個東西要一步一步來,你可能還不會按鍵判斷,所以你先要弄懂按鍵判斷這塊原理,怎么樣是按鍵按下去了,用什么判斷的,按鍵抬起了了又會是什么樣的,真的會這個了你再去考慮按鍵功能的實現就簡單了。不知道你是不是還不會按鍵判斷是怎么實現的,如果是的話上面你貼出來的不適合你學,看前面簡單點的,按鍵控制LED點亮熄滅這塊。就不知道這本書有沒有這樣的初級引導篇。
如果你會按鍵判斷了,那么實現加一減一功能就要看上文是怎么處理的,看別人的代碼加一減一是怎么處理的,你在按鍵判斷里可以想辦法先停止原來的加一減一進程,能做到這點你就會想到辦法加一減一了。
作者: liuwuye    時間: 2018-5-30 09:49
看不清
作者: weidoit    時間: 2018-5-30 15:57


問題可以再具體一點。

作者: weidoit    時間: 2018-5-30 16:05
  1. /****************************************************************
  2. * 例4.1.1用數碼管前兩位顯示一個十進制數,變化范圍為00~59,
  3. * 開始時顯示00,每按下S2鍵一次,數值加1;
  4. * 每按下S3鍵一次,數值減1;
  5. * 每按下S4鍵一次,數值歸零;
  6. * 按下S5鍵一次,利用定時器功能使數值開始自動每秒加1,再次按下S5鍵,數值停止加1,保持顯示原數。
  7. * (part2.2_1.c  P82)
  8. ****************************************************************/

  9. #include <reg52.h>                    //52系列單片機頭文件
  10. #define uchar unsigned char
  11. #define uint unsigned int
  12. sbit key1=P3^4;
  13. sbit key2=P3^5;
  14. sbit key3=P3^6;
  15. sbit key4=P3^7;

  16. sbit dula=P2^6;                //申明U1鎖存器的鎖存端
  17. sbit wela=P2^7;                //申明U2鎖存器的鎖存端
  18. uchar code table[]={
  19.   0x3f,0x06,0x5b,0x4f,
  20.   0x66,0x6d,0x7d,0x07,
  21.   0x7f,0x6f,0x77,0x7c,
  22.   0x39,0x5e,0x79,0x71};
  23. void delayms(uint);
  24. uchar numt0,num;
  25. void display(uchar numdis)  //顯示子函數
  26. {
  27.   uchar shi,ge;         //分離兩個分別要顯示的數
  28.   shi=numdis/10;
  29.   ge=numdis%10;

  30.   dula=1;
  31.   P0=table[shi];    //送十位段選數據
  32.   dula=0;
  33.   P0=0xff;                //送位選數據前關閉所有顯示,防止打開位選鎖存時
  34.   wela=1;                        //原來段選數據通過位選鎖存器造成混亂
  35.   P0=0xfe;                //送位選數據
  36.   wela=0;
  37.   delayms(5);        //延時

  38.   dula=1;
  39.   P0=table[ge];  //送個位段選數據
  40.   dula=0;
  41.   P0=0xff;
  42.   wela=1;
  43.   P0=0xfd;
  44.   wela=0;
  45.   delayms(5);
  46. }
  47. void delayms(uint xms)                               
  48. {
  49.   uint i,j;
  50.   for(i=xms;i>0;i--)                      //i=xms即延時約xms毫秒
  51.     for(j=110;j>0;j--);
  52. }
  53. void init()    //初始化函數
  54. {
  55.   TMOD=0x01;//設置定時器0為工作方式1(0000 0001)
  56.   TH0=(65536-45872)/256;//裝初值50ms一次中斷
  57.   TL0=(65536-45872)%256;
  58.   EA=1;  //開總中斷
  59.   ET0=1; //開定時器0中斷       
  60. }
  61. void keyscan()
  62. {
  63.   if(key1==0)
  64.   {
  65.     delayms(10);
  66.     if(key1==0)
  67.     {
  68.       num++;
  69.       if(num==60)//當到60時重新歸0
  70.           num=0;
  71.       while(!key1);//等待按鍵釋放       
  72.     }
  73.   }
  74.   if(key2==0)
  75.   {
  76.     delayms(10);
  77.     if(key2==0)
  78.     {
  79.       if(num==0)//當到0時重新歸60
  80.           num=60;
  81.       num--;       
  82.       while(!key2);
  83.     }
  84.   }
  85.   if(key3==0)
  86.   {
  87.     delayms(10);
  88.     if(key3==0)
  89.     {
  90.       num=0;  //清0
  91.       while(!key3);       
  92.     }
  93.   }
  94.   if(key4==0)
  95.   {
  96.     delayms(10);
  97.     if(key4==0)
  98.     {
  99.       while(!key4);
  100.       TR0=~TR0;//啟動或停止定時器0       
  101.     }
  102.   }
  103. }
  104. void main()
  105. {
  106.   init();//初始化函數
  107.   while(1)
  108.   {
  109.     keyscan();
  110.     display(num);
  111.   }
  112. }
  113. void T0_time() interrupt 1
  114. {
  115.   TH0=(65536-45872)/256;//重裝初值
  116.   TL0=(65536-45872)%256;       
  117.   numt0++;       
  118.   if(numt0==20)                //如果到了20次,說明1秒時間到
  119.   {
  120.     numt0=0;                //然后把num清0重新再計20次
  121.     num++;
  122.     if(num==60)
  123.       num=0;
  124.   }               
  125. }



復制代碼



作者: lyh0807    時間: 2018-5-30 17:13
哪里有什么加一減一
作者: lanyu8388    時間: 2018-5-30 23:30
num++ 就是自加1  num--就是減1 ,這是一種簡潔高效的寫法,但對初學者C語不好的,比較難理解,你可以如下理解: num++    等式于 num=num+1    num-- 等式于 num=num-1  這兩種寫實現的功能都一樣,后都比難易于理解,
作者: hedianzi    時間: 2018-6-24 15:19
在keyscan()函數里面有四個按鍵的按下與否的檢測,在本書第80頁圖4.1.2中可知按鍵按下會令該位I/O口拉為低電平,同時為了防止此次的按鍵按下為假(即此次只是一次抖動),寫了10ms的延遲,再次判斷是否按下,為真時進入if語句,num變量自加一次,若num加到等于60則清零(這是一個輪回啊哈哈)while的參數為1則等待,即key1==0,當只有key==1時(按鍵松開I/O口回到高電平)令程序跳出了while(1)死循環(huán),第一次按key1按鍵結束num=1;同理第二次num=2。。。。num=3等等,直到60被清零輪回,同理KEY2,key3...




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1