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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

大家麻煩幫我看一下,我看的郭天祥的書,有一塊不懂

 關閉 [復制鏈接]
跳轉到指定樓層
樓主
ID:329253 發表于 2018-5-29 23:17 來自觸屏版 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
30黑幣
本帖最后由 134849694164151 于 2020-3-26 16:14 編輯

已解決

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

使用道具 舉報

沙發
ID:329253 發表于 2018-5-29 23:20 來自觸屏版 | 只看該作者
上邊照片不清晰,已經更新了清晰的圖在下面的樓層
回復

使用道具 舉報

板凳
ID:341050 發表于 2018-5-30 01:39 | 只看該作者
這應該是實現一個秒表的功能,按鍵函數就是一個判斷按鍵是否按下,大概有高低電平判斷,消抖,鍵沿控制,具體操作就是通過讀取相應引腳的數據對其數值進行判斷

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

地板
ID:295783 發表于 2018-5-30 08:53 | 只看該作者
我的想法是:書上的函數就是一個判斷按鍵是否按下;
應該會有高低電平判斷,以及高低電平的轉換吧(不是很確定);
一定要有按鍵消抖的過程;
主要就是看起相對應的引腳上面的數值,然后定義其顯示的數值所代表的功能來進行判斷的。
希望能對你有幫助。。。
回復

使用道具 舉報

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

使用道具 舉報

6#
ID:341148 發表于 2018-5-30 09:49 | 只看該作者
看不清
回復

使用道具 舉報

7#
ID:149389 發表于 2018-5-30 15:57 | 只看該作者


問題可以再具體一點。
回復

使用道具 舉報

8#
ID:149389 發表于 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. }



復制代碼


回復

使用道具 舉報

9#
ID:341538 發表于 2018-5-30 17:13 | 只看該作者
哪里有什么加一減一
回復

使用道具 舉報

10#
ID:341842 發表于 2018-5-30 23:30 | 只看該作者
num++ 就是自加1  num--就是減1 ,這是一種簡潔高效的寫法,但對初學者C語不好的,比較難理解,你可以如下理解: num++    等式于 num=num+1    num-- 等式于 num=num-1  這兩種寫實現的功能都一樣,后都比難易于理解,
回復

使用道具 舉報

11#
ID:324844 發表于 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)死循環,第一次按key1按鍵結束num=1;同理第二次num=2。。。。num=3等等,直到60被清零輪回,同理KEY2,key3...
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲欧美精品在线观看 | 91精品国产一区二区三区 | 一区二区日韩 | 午夜网址 | 99久久视频| 福利视频三区 | 亚洲一区二区中文字幕 | 国产精品1 | 欧美黄色片 | 欧美成人精品一区二区三区 | 国产亚洲精品综合一区 | 精品一区二区免费视频 | 91麻豆精品国产91久久久久久久久 | 国产一区欧美 | 日韩中出 | 精品一级电影 | 亚洲狠狠爱 | 色播视频在线观看 | 亚洲欧美日韩在线 | 久久久久久久久久久久亚洲 | 精品美女在线观看 | 国产精品日产欧美久久久久 | 欧美日韩亚洲国产综合 | 热99精品视频 | 国产一级在线 | 欧美日产国产成人免费图片 | 黄色一级毛片免费看 | 亚洲精品视频一区 | 成人一区二区三区在线观看 | 久久精品久久综合 | 精品99久久久久久 | 国产免费观看久久黄av片涩av | 国产精品欧美一区二区三区不卡 | 国产精品欧美精品日韩精品 | 亚洲狠狠丁香婷婷综合久久久 | 国产色| 午夜免费 | 一区二区国产精品 | 国产精品一区二区三区免费观看 | 午夜av电影 | 日韩成人高清在线 |