找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5477|回復(fù): 7
收起左側(cè)

關(guān)于while語句的疑問?最后一句while語句怎么理解??while()語句里還可以放函數(shù)...

[復(fù)制鏈接]
ID:69265 發(fā)表于 2016-8-18 22:09 | 顯示全部樓層 |閱讀模式

//-----------------------------------------------------------------
//        名稱: 數(shù)碼管顯示4×4 鍵盤矩陣按鍵序號
//-----------------------------------------------------------------
//        說明: 按下任意一按鍵時,數(shù)碼管會顯示它在鍵盤矩陣上的序號0 - F,
//                掃描程序首先判斷按鍵發(fā)生在哪一列,然后根據(jù)所發(fā)生的行附加
//                不同的值,從而得到鍵盤按鍵序號.
//                       
//-----------------------------------------------------------------
#include <reg51.h>
#define INT8U        unsigned char
#define INT16U unsigned int
//0~F的共陽數(shù)碼管段碼,最后一個是黑屏
const INT8U SEG_CODE[] =
{ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
  0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF
};

sbit BEEP = P3^0;
//上次按鍵和當前按鍵序號,該矩陣中序號范圍為0-15,0xFF表示無按鍵
INT8U pre_KeyNo=0xff,Key_No=0xff;

//-----------------------------------------------------------------
// 延時函數(shù)
//-----------------------------------------------------------------
void delay_ms(INT16U x)
{
        INT8U t; while(x--) for(t = 0; t < 120; t++);
}

//-----------------------------------------------------------------
// 鍵盤矩陣掃描子程序
//-----------------------------------------------------------------
void Keys_Scan()
{         // 高4位置0,放入4行,掃描4列
        P1=0x0f;        delay_ms(1);
        if(P1 == 0x0f)          {Key_No=0xff;return;}                //無按鍵時提前返回
        //判斷發(fā)生在第幾列
        switch(P1)
        {
                case 0x0e: Key_No =0; break;           //0列
                case 0x0d: Key_No =1; break;           //1列
                case 0x0b: Key_No =2; break;           //2列
                case 0x07: Key_No =3; break;           //3列
                default: Key_No=0xff; return;           //無鍵按下,提前返回;
        }
        // 低4位置0,放入4列,掃描4行
        P1=0xf0;        delay_ms(1);
        if(P1 == 0x0f)          {Key_No=0xff;return;}
        //判斷發(fā)生在第幾行
        //對0~3行分別賦初值0,4,8,12
        switch(P1)
        {
                case 0xe0: Key_No +=0; break;          //0行
                case 0xd0: Key_No +=4; break;          //1行
                case 0xb0: Key_No +=8; break;          //2行
                case 0x70: Key_No +=12; break;          //3行
                default: Key_No=0xff;                          //無鍵按下
        }       
}

//-----------------------------------------------------------------
// 蜂鳴器子程序
//-----------------------------------------------------------------
void Beep()
{
   INT8U i;
   for(i=0;i<100;i++){delay_ms(1); BEEP = ~BEEP;}
   BEEP=1;       
}

//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
void main()
{
        P0=0xff;                         //初始關(guān)數(shù)碼管
        while(1)
        {
                Keys_Scan();         //掃描鍵值
                if(Key_No == 0xff){delay_ms(10); continue;}                       
                //顯示鍵值,蜂鳴器提示
                P0=SEG_CODE[Key_No];Beep();
                //未釋放等待
                while(Keys_Scan(), Key_No != 0xff);//這句話怎么理解??while()語句里還可以放函數(shù)??
        }

}

//最后一句語句怎么理解??while()語句里還可以放函數(shù)??         逗號??
//最后一句語句怎么理解??while()語句里還可以放函數(shù)??         逗號??
//最后一句語句怎么理解??while()語句里還可以放函數(shù)??         逗號??

360軟件小助手截圖20160818220605.png
回復(fù)

使用道具 舉報

ID:137090 發(fā)表于 2016-8-18 23:34 | 顯示全部樓層
1. while 內(nèi)放的是表達式,表達式可以是判斷語句也可以是函數(shù)
while(表達式)
{
循環(huán)體
}
2.逗號運算符:
在C語言中,多個表達式可以用逗號分開,其中用逗號分開的表達式的值分別結(jié)算,但整個表達式的值是最后一個表達式的值。
summary:
最后的那個while語句的目的是等待按鍵釋放的。先執(zhí)行按鍵掃描程序,再判斷按下的按鍵是否取消,如果取消,退出while 循環(huán),執(zhí)行while(1)掃描。
回復(fù)

使用道具 舉報

ID:137104 發(fā)表于 2016-8-19 09:35 | 顯示全部樓層
按鍵的等待釋放,實際應(yīng)用中按鍵還需要消抖
回復(fù)

使用道具 舉報

ID:135253 發(fā)表于 2016-8-19 10:22 | 顯示全部樓層
1,while判斷條件當然可以放表達式;Keys_Scan(), Key_No != 0xff
2,預(yù)計算Key_No,必須先算Keys_Scan(),得到Key_No 值再與0xff比較,即Key_No != 0xff值為真時執(zhí)行循環(huán),
3,按鍵程序應(yīng)該加上消抖,否則結(jié)果不準確!
回復(fù)

使用道具 舉報

ID:137261 發(fā)表于 2016-8-21 22:14 | 顯示全部樓層
其實整個while括號里的數(shù)據(jù)最終都是0或1,是1就一直執(zhí)行while中代碼,是0就不執(zhí)行while中代碼。
回復(fù)

使用道具 舉報

ID:137263 發(fā)表于 2016-8-21 22:23 | 顯示全部樓層
當不是0xff時就一直在執(zhí)行while,等待為0xff時,可以跳出此語句,相當于等待按鈕釋放,否則會多次響應(yīng),按鍵一次蜂鳴器發(fā)聲時間不止一次
回復(fù)

使用道具 舉報

ID:137239 發(fā)表于 2016-8-21 23:07 | 顯示全部樓層
while()可以放函數(shù),只要函數(shù)的結(jié)果是真“1”,就可以一直在里面循環(huán),當函數(shù)輸出的結(jié)果是“0”時,就會跳出這個內(nèi)循環(huán),繼續(xù)進行外循環(huán)。
回復(fù)

使用道具 舉報

ID:136575 發(fā)表于 2016-8-22 09:08 | 顯示全部樓層
循環(huán)體、
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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