標(biāo)題: 當(dāng)按下s1開(kāi)關(guān)按鍵時(shí)數(shù)碼管顯示1 的單片機(jī)程序有問(wèn)題應(yīng)該怎么解決? [打印本頁(yè)]

作者: kaitaoguo    時(shí)間: 2018-6-21 13:42
標(biāo)題: 當(dāng)按下s1開(kāi)關(guān)按鍵時(shí)數(shù)碼管顯示1 的單片機(jī)程序有問(wèn)題應(yīng)該怎么解決?
程序目的是為了實(shí)現(xiàn):當(dāng)按下s1開(kāi)關(guān)按鍵時(shí)數(shù)碼管顯示1;按下s2開(kāi)關(guān)按鍵時(shí)數(shù)碼管顯示2;按下s3開(kāi)關(guān)按鍵時(shí),數(shù)碼管顯示0。程序顯示無(wú)錯(cuò)誤i,但現(xiàn)象只有當(dāng)按下s1開(kāi)關(guān)按鍵時(shí)數(shù)碼管顯示1,且滅不了,按其他鍵沒(méi)反應(yīng),想知道為什么。下面是程序:
#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
                                                                                                           
sbit LSA=P2^2;
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
u8 code smgduan[]={0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 ,
                   0x7f , 0x6f , 0x77 , 0x7c ,0x39 , 0x5e , 0x79 , 0x71 };
void delay(u16 i)
{
    while (i--);
}                                     // 延時(shí)
void keypros()
{
  if (k1==0)                 //S1開(kāi)關(guān)
   {
  delay(1000);                 //防抖動(dòng)
  if(k1==0)
    {
  P0=smgduan[1];     //顯示1
    }
  }
  while(!k1)             //顯示1模塊
if (k2==0)                         //S2開(kāi)關(guān)
  {
  delay(1000);                 //防抖動(dòng)
  if(k2==0)
  {
  P0=smgduan[2];     //顯示2
  }
  }
     while(!k2)             //顯示2模塊
  if (k3==0)                 //S3開(kāi)關(guān)
  {
  delay(1000);                 //防抖動(dòng)
  if(k3==0)
  {
  P0=smgduan[0];     //顯示0
  }
  }
    while(!k3);             //顯示0模塊
}                                          
void main()
{           
   LSA=1;
while(1)
                {
                 keypros();
                }
               
}


作者: xiaoshan7748    時(shí)間: 2018-6-21 14:38
你的程序應(yīng)該是停在了這句:while(!k1)
作者: zhanghyg    時(shí)間: 2018-6-21 15:02

你while用的太多了,直接去掉也是一樣的效果
作者: 赤瞳之父    時(shí)間: 2018-6-22 09:35
建議把按鍵寫(xiě)成一個(gè)帶返回值的函數(shù),然后再在主函數(shù)主循環(huán)里寫(xiě),這樣結(jié)構(gòu)很清晰,以后任何需要用到按鍵的時(shí)候都可以直接復(fù)制。
作者: wenzedong    時(shí)間: 2018-6-22 12:40
你想實(shí)現(xiàn)的是當(dāng)按下一個(gè)鍵的時(shí)候只有一個(gè)亮,當(dāng)同時(shí)按下兩個(gè)或多個(gè)按鍵的時(shí)候只有一個(gè)亮對(duì)吧,你的問(wèn)題是while(!K1),然后就沒(méi)有然后了,我看不懂它會(huì)接下來(lái)怎么執(zhí)行,改的話(huà)也比較簡(jiǎn)單,while(!k1);  或者while(!k1){},當(dāng)按下一個(gè)鍵之后,就會(huì)死循環(huán),不會(huì)去判斷其它鍵是否按下了
作者: 菜鳥(niǎo)來(lái)了    時(shí)間: 2018-6-22 15:58
一定要學(xué)會(huì)調(diào)試,不然以后程序大了很麻煩,
你的問(wèn)題出現(xiàn)在松手檢測(cè)while(!k1)  和 while(!k2) 后面沒(méi)有打分號(hào),
使得與下方語(yǔ)句形成亂七八糟嵌套造成不明錯(cuò)誤。
松手語(yǔ)句的意思,就是停止在當(dāng)前這一句,C語(yǔ)言里面的分號(hào)是語(yǔ)句結(jié)束的重要標(biāo)識(shí)。
還有,要保持一個(gè)良好的編碼習(xí)慣,松手檢測(cè)語(yǔ)句最好寫(xiě)在上一個(gè)語(yǔ)句后面,越過(guò)幾個(gè)括號(hào)不是一個(gè)好風(fēng)格。





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