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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5469|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人av高清在线观看 | 日韩 国产 在线 | 91精品国产综合久久精品 | 成人国产精品久久久 | 久久久久国产 | 精品视频免费 | 麻豆精品一区二区三区在线观看 | 伊人艹| 免费国产一区二区 | 欧美freesex黑人又粗又大 | 亚洲不卡在线观看 | av免费网| 亚洲a网 | 一级毛片免费看 | 国产精品一区二区三区四区 | 99热最新网址 | 新91| 日日夜夜天天久久 | 亚洲精品大全 | 国产 欧美 日韩 一区 | 天天操天天舔 | 欧美精品欧美精品系列 | 九色国产 | 视频三区 | 欧美国产日韩成人 | 2018国产大陆天天弄 | 国产精品色| 久久精品国产99国产精品 | 久久综合九色综合欧美狠狠 | 日韩成人在线免费视频 | 一级全黄视频 | 国内在线视频 | 日韩欧美国产精品一区 | av网址在线 | 亚洲精品视频在线看 | 亚洲欧美综合精品久久成人 | 中文字幕高清视频 | 欧美精品乱码99久久影院 | 99pao成人国产永久免费视频 | 欧美9999 | 免费黄色录像视频 |