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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5439|回復: 7
收起左側

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

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

//-----------------------------------------------------------------
//        名稱: 數碼管顯示4×4 鍵盤矩陣按鍵序號
//-----------------------------------------------------------------
//        說明: 按下任意一按鍵時,數碼管會顯示它在鍵盤矩陣上的序號0 - F,
//                掃描程序首先判斷按鍵發生在哪一列,然后根據所發生的行附加
//                不同的值,從而得到鍵盤按鍵序號.
//                       
//-----------------------------------------------------------------
#include <reg51.h>
#define INT8U        unsigned char
#define INT16U unsigned int
//0~F的共陽數碼管段碼,最后一個是黑屏
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;

//-----------------------------------------------------------------
// 延時函數
//-----------------------------------------------------------------
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;}                //無按鍵時提前返回
        //判斷發生在第幾列
        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;}
        //判斷發生在第幾行
        //對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;                         //初始關數碼管
        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()語句里還可以放函數??
        }

}

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

360軟件小助手截圖20160818220605.png
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

ID:136575 發表于 2016-8-22 09:08 | 顯示全部樓層
循環體、
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久成人 | 99re在线视频 | 一级视频黄色 | 91在线视频免费观看 | 91精品久久久久久久久久 | 亚洲成人一区二区 | 夜夜艹 | 亚洲一区二区三区在线播放 | 成人做爰www免费看视频网站 | 免费在线观看黄网站 | 人人人人爽 | 国产一区二区三区不卡av | 四虎影院新网址 | 久久蜜桃av一区二区天堂 | 亚洲精品九九 | 日韩精品免费一区二区在线观看 | 99re视频 | 日韩在线视频免费观看 | 精品久久视频 | 久久亚洲一区二区三区四区 | 一级毛片免费视频观看 | 亚洲一区二区中文字幕 | 亚洲成人精品在线 | 日日欧美 | 国产91视频一区二区 | 日韩视频中文字幕 | 久久精品久久久 | 成人欧美一区二区三区视频xxx | www.国产| 一级做a爰片久久毛片免费看 | 五月婷婷亚洲 | 一区二区三区亚洲视频 | 久久精品色视频 | 四虎影音| 精品久久久久久久久久久久 | 国产精品欧美大片 | 色视频网站在线观看 | 精品国产一区二区三区观看不卡 | 午夜久久久久久久久久一区二区 | 91精品综合久久久久久五月天 | 黄色av观看 |