找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4658|回复: 7
打印 上一主题 下一主题
收起左侧

关于while语句的疑问?最后一句while语句怎么理解??while()语句里还可以放函数...

[复制链接]
跳转到指定楼层
楼主

//-----------------------------------------------------------------
//        名称: 数码管显示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 (51.74 KB, 下载次数: 80)

360软件小助手截图20160818220605.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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,按键程序应该加上消抖,否则结果不准确!
回复

使用道具 举报

5#
ID:137261 发表于 2016-8-21 22:14 | 只看该作者
其实整个while括号里的数据最终都是0或1,是1就一直执行while中代码,是0就不执行while中代码。
回复

使用道具 举报

6#
ID:137263 发表于 2016-8-21 22:23 | 只看该作者
当不是0xff时就一直在执行while,等待为0xff时,可以跳出此语句,相当于等待按钮释放,否则会多次响应,按键一次蜂鸣器发声时间不止一次
回复

使用道具 举报

7#
ID:137239 发表于 2016-8-21 23:07 | 只看该作者
while()可以放函数,只要函数的结果是真“1”,就可以一直在里面循环,当函数输出的结果是“0”时,就会跳出这个内循环,继续进行外循环。
回复

使用道具 举报

8#
ID:136575 发表于 2016-8-22 09:08 | 只看该作者
循环体、
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表