找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3482|回復(fù): 10
打印 上一主題 下一主題
收起左側(cè)

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

 關(guān)閉 [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:329253 發(fā)表于 2018-5-29 23:17 來(lái)自觸屏版 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
30黑幣
本帖最后由 134849694164151 于 2020-3-26 16:14 編輯

已解決

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

板凳
ID:341050 發(fā)表于 2018-5-30 01:39 | 只看該作者
這應(yīng)該是實(shí)現(xiàn)一個(gè)秒表的功能,按鍵函數(shù)就是一個(gè)判斷按鍵是否按下,大概有高低電平判斷,消抖,鍵沿控制,具體操作就是通過(guò)讀取相應(yīng)引腳的數(shù)據(jù)對(duì)其數(shù)值進(jìn)行判斷

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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


問(wèn)題可以再具體一點(diǎn)。
回復(fù)

使用道具 舉報(bào)

8#
ID:149389 發(fā)表于 2018-5-30 16:05 | 只看該作者
  1. /****************************************************************
  2. * 例4.1.1用數(shù)碼管前兩位顯示一個(gè)十進(jìn)制數(shù),變化范圍為00~59,
  3. * 開(kāi)始時(shí)顯示00,每按下S2鍵一次,數(shù)值加1;
  4. * 每按下S3鍵一次,數(shù)值減1;
  5. * 每按下S4鍵一次,數(shù)值歸零;
  6. * 按下S5鍵一次,利用定時(shí)器功能使數(shù)值開(kāi)始自動(dòng)每秒加1,再次按下S5鍵,數(shù)值停止加1,保持顯示原數(shù)。
  7. * (part2.2_1.c  P82)
  8. ****************************************************************/

  9. #include <reg52.h>                    //52系列單片機(jī)頭文件
  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)  //顯示子函數(shù)
  26. {
  27.   uchar shi,ge;         //分離兩個(gè)分別要顯示的數(shù)
  28.   shi=numdis/10;
  29.   ge=numdis%10;

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

  38.   dula=1;
  39.   P0=table[ge];  //送個(gè)位段選數(shù)據(jù)
  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即延時(shí)約xms毫秒
  51.     for(j=110;j>0;j--);
  52. }
  53. void init()    //初始化函數(shù)
  54. {
  55.   TMOD=0x01;//設(shè)置定時(shí)器0為工作方式1(0000 0001)
  56.   TH0=(65536-45872)/256;//裝初值50ms一次中斷
  57.   TL0=(65536-45872)%256;
  58.   EA=1;  //開(kāi)總中斷
  59.   ET0=1; //開(kāi)定時(shí)器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)//當(dāng)?shù)?0時(shí)重新歸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)//當(dāng)?shù)?時(shí)重新歸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;//啟動(dòng)或停止定時(shí)器0       
  101.     }
  102.   }
  103. }
  104. void main()
  105. {
  106.   init();//初始化函數(shù)
  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次,說(shuō)明1秒時(shí)間到
  119.   {
  120.     numt0=0;                //然后把num清0重新再計(jì)20次
  121.     num++;
  122.     if(num==60)
  123.       num=0;
  124.   }               
  125. }



復(fù)制代碼


回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

10#
ID:341842 發(fā)表于 2018-5-30 23:30 | 只看該作者
num++ 就是自加1  num--就是減1 ,這是一種簡(jiǎn)潔高效的寫(xiě)法,但對(duì)初學(xué)者C語(yǔ)不好的,比較難理解,你可以如下理解: num++    等式于 num=num+1    num-- 等式于 num=num-1  這兩種寫(xiě)實(shí)現(xiàn)的功能都一樣,后都比難易于理解,
回復(fù)

使用道具 舉報(bào)

11#
ID:324844 發(fā)表于 2018-6-24 15:19 | 只看該作者
在keyscan()函數(shù)里面有四個(gè)按鍵的按下與否的檢測(cè),在本書(shū)第80頁(yè)圖4.1.2中可知按鍵按下會(huì)令該位I/O口拉為低電平,同時(shí)為了防止此次的按鍵按下為假(即此次只是一次抖動(dòng)),寫(xiě)了10ms的延遲,再次判斷是否按下,為真時(shí)進(jìn)入if語(yǔ)句,num變量自加一次,若num加到等于60則清零(這是一個(gè)輪回啊哈哈)while的參數(shù)為1則等待,即key1==0,當(dāng)只有key==1時(shí)(按鍵松開(kāi)I/O口回到高電平)令程序跳出了while(1)死循環(huán),第一次按key1按鍵結(jié)束num=1;同理第二次num=2。。。。num=3等等,直到60被清零輪回,同理KEY2,key3...
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表