找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

新手小白求助,為什么按鍵不能正常工作

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1138816 發(fā)表于 2024-12-7 09:05 | 只看該作者
AT89C51的Proteus仿真
回復(fù)

使用道具 舉報(bào)

板凳
ID:277550 發(fā)表于 2024-12-7 09:16 | 只看該作者
數(shù)碼管、led太占時(shí)間,key 應(yīng)該使用中斷、連接到中斷的PIN,如P3^2。程序中使用全局變量定義是否按鍵了,然后中斷函數(shù)改變就是值,l數(shù)碼管程判斷、…………。
回復(fù)

使用道具 舉報(bào)

地板
ID:583948 發(fā)表于 2024-12-7 11:14 | 只看該作者
程序是順序執(zhí)行的,你的led函數(shù)里面執(zhí)行的時(shí)間至少大于3000ms了,很簡單來說,當(dāng)你按按鍵的時(shí)候,其實(shí)單片機(jī)正在執(zhí)行l(wèi)ed函數(shù)里面的內(nèi)容,所以你的按鍵程序并沒有執(zhí)行,也就不會起作用了。解決辦法:
如評論區(qū)所言,按鍵修改為中斷,最直接有效;
其次就是降低led函數(shù)執(zhí)行時(shí)間,可以采用時(shí)間片、狀態(tài)機(jī)等程序結(jié)構(gòu),加按鍵掃描一樣能實(shí)現(xiàn)你想要的功能
回復(fù)

使用道具 舉報(bào)

5#
ID:1138816 發(fā)表于 2024-12-7 14:37 | 只看該作者
devcang 發(fā)表于 2024-12-7 09:16
數(shù)碼管、led太占時(shí)間,key 應(yīng)該使用中斷、連接到中斷的PIN,如P3^2。程序中使用全局變量定義是否按鍵了,然 ...

謝謝佬
回復(fù)

使用道具 舉報(bào)

6#
ID:1138816 發(fā)表于 2024-12-7 14:37 | 只看該作者
zpwgf 發(fā)表于 2024-12-7 11:14
程序是順序執(zhí)行的,你的led函數(shù)里面執(zhí)行的時(shí)間至少大于3000ms了,很簡單來說,當(dāng)你按按鍵的時(shí)候,其實(shí)單片 ...

明白了,謝謝佬
回復(fù)

使用道具 舉報(bào)

7#
ID:1133081 發(fā)表于 2024-12-7 15:33 | 只看該作者


  1. #include <reg52.h>

  2. sbit key0 = P2^7;

  3. unsigned char code table[]={//共陽數(shù)碼管段碼
  4.                 0xc0,0xf9,0xa4,0xb0,
  5.                 0x99,0x92,0x82,0xf8,
  6.                 0x80,0x90,0x88,0x83,
  7.                 0xc6,0xa1,0x86,0x8e};
  8. unsigned char num=0;
  9. unsigned int temp=0;
  10. bit flag=0;
  11. bit mark=0;

  12. void InitTimer0(void)
  13. {
  14.     TMOD = 0x01;
  15.     TH0 = 0xD8;
  16.     TL0 = 0xF0;
  17.     EA = 1;
  18.     ET0 = 1;
  19.     TR0 = 1;
  20. }

  21. void key()
  22. {
  23.         static int count=0;
  24.         static bit sign=0;
  25.         if(!key0)
  26.         {
  27.                 if(++count>=100 && sign==0)//消抖+自鎖       
  28.                 {
  29.                         sign=1;
  30.                         flag=~flag;
  31.                 }
  32.         }
  33.         else
  34.         {
  35.                 count=0;
  36.                 sign=0;
  37.         }
  38. }

  39. void Timer0Interrupt(void) interrupt 1//中斷周期10ms
  40. {
  41.         static int i;
  42.         TH0 = 0xD8;
  43.         TL0 = 0xF0;
  44.         if(++i>=100)//1秒
  45.         {
  46.                 i=0;
  47.                 if(!flag)num=++num%10;//循環(huán)計(jì)數(shù)0~9       
  48.                 mark=~mark;
  49.         }
  50. }

  51. void main(void)
  52. {
  53.     InitTimer0();
  54.     while (1)
  55.     {
  56.                 key();
  57.                 if(!flag)
  58.                 {
  59.                         temp=0x01<<num;
  60.                         P0=temp;                                //P0顯示temp的低8位
  61.                         P1=temp>>8|0xfc;        //P1.0、P1.1顯示temp的9、10位,P1.2~1.7保持原來電平不變
  62.                         P2=table[num]|0x80;//P2.7保持高電平不變
  63.                 }
  64.                 else
  65.                 {
  66.                         if(mark)
  67.                         {
  68.                                 P0=0x00;
  69.                                 P1&=0xfc;//P1.2~1.7保持原來電平不變
  70.                         }
  71.                         else
  72.                         {
  73.                                 P0=0xff;
  74.                                 P1|=0x03;//P1.2~1.7保持原來電平不變
  75.                         }
  76.                 }
  77.    }
  78. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

8#
ID:1138816 發(fā)表于 2024-12-7 16:18 | 只看該作者
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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