找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于矩阵按键程序的疑问?

[复制链接]
跳转到指定楼层
楼主
ID:102056 发表于 2016-12-17 21:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
两个switch开关语句里面为什么最后都不写break?
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int


uchar code DSY_CODE[]=
{
         0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00
};
uchar Pre_KeyNO = 16,KeyNO = 16;


void DelayMS(uint ms)
{
         uchar t;
        while(ms--)
        {
                 for(t=0;t<120;t++);
        }
}


void Keys_Scan()
{
         uchar Tmp;
        P1 = 0x0f;
        DelayMS(1);
        Tmp = P1 ^ 0x0f;
        switch(Tmp)
        {
                 case 1: KeyNO = 0; break;
                case 2: KeyNO = 1; break;
                case 4: KeyNO = 2; break;
                case 8: KeyNO = 3; break;
                default: KeyNO = 16;
        }
        P1 = 0xf0;
        DelayMS(1);
        Tmp = P1 >> 4 ^ 0x0f;
        switch(Tmp)
        {
                 case 1: KeyNO += 0; break;
                case 2: KeyNO += 4; break;
                case 4: KeyNO += 8; break;
                case 8: KeyNO += 12;
        }
}




void main()
{
         P0 = 0x00;
        while(1)
        {
                 P1 = 0xf0;
                if(P1 != 0xf0)
                        Keys_Scan();
                if(Pre_KeyNO != KeyNO)
                {
                         P0 = ~DSY_CODE[KeyNO];
                        Pre_KeyNO = KeyNO;
                }
                DelayMS(100);
        }
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:155507 发表于 2016-12-18 01:08 | 只看该作者
可以不写break,到最后了
回复

使用道具 举报

板凳
ID:102056 发表于 2016-12-18 07:53 来自手机 | 只看该作者
angmall 发表于 2016-12-18 01:08
可以不写break,到最后了

为什么?解释一下
回复

使用道具 举报

地板
ID:152374 发表于 2016-12-18 08:52 | 只看该作者
楼主你好,我是单片机新手,请多多指教。您的这个疑问应该是由于switch语句有一点没弄明白。
/*
C语言还提供了另一种用于多分支选择的switch语句, 其一般形式为:
switch(表达式){
    case 常量表达式1:  语句1;
    case 常量表达式2:  语句2;
    …
    case 常量表达式n:  语句n;
    default:  语句n+1;
}
其语义是:计算表达式的值。 并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。
*/这一段是copy的。
序号1   switch(Tmp)
        {
                case 1: KeyNO = 0; break;
                case 2: KeyNO = 1; break;
                case 4: KeyNO = 2; break;
                case 8: KeyNO = 3; break;
                default: KeyNO = 16;
        }
序号2    switch(Tmp)
        {
                case 1: KeyNO = 0;
                case 2: KeyNO = 1;
                case 4: KeyNO = 2;
                case 8: KeyNO = 3;
                default: KeyNO = 16;
        }


请看上面这两段代码,假如tmp==1,那么序号1对应的代码进入case1后遇到break跳出switch语句
而序号2代码进入case1之后,还要将剩余的case2、4、8执行一次。这里可以看出break语句的作用。
至于您问的最后一句为什么不加break,加不加无所谓了,反正程序如果能执行到最后一句,那么之后它会自动跳出 switch 循环
回复

使用道具 举报

5#
ID:155551 发表于 2016-12-18 10:02 | 只看该作者
彩电市场的市场上的出色的
回复

使用道具 举报

6#
ID:155557 发表于 2016-12-18 10:25 | 只看该作者
这不是必须要写的
回复

使用道具 举报

7#
ID:102056 发表于 2016-12-18 11:38 | 只看该作者
本帖最后由 king@ 于 2016-12-18 11:46 编辑
WCS007 发表于 2016-12-18 08:52
楼主你好,我是单片机新手,请多多指教。您的这个疑问应该是由于switch语句有一点没弄明白。
/*
C语言还 ...

3Q,原来如此,在switch()语句,如果执行的case的情况,看后面有没有break,有就跳出这个语句,没有就继续执行下一条case, 如果是执行的default,会自动跳出。switch()语句里面执行到最后一句也会自动跳出
回复

使用道具 举报

8#
ID:155595 发表于 2016-12-18 14:00 | 只看该作者
这个不行的吧
回复

使用道具 举报

9#
ID:102056 发表于 2016-12-18 14:21 | 只看该作者

实测按键0—16,数码管显示0-F
回复

使用道具 举报

10#
ID:155632 发表于 2016-12-18 16:39 | 只看该作者
这个不需要,因为要连续显示
回复

使用道具 举报

11#
ID:111634 发表于 2016-12-18 17:14 | 只看该作者
WCS007 发表于 2016-12-18 08:52
楼主你好,我是单片机新手,请多多指教。您的这个疑问应该是由于switch语句有一点没弄明白。
/*
C语言还 ...

还是楼主理论学的好,理解正确。理论学好了,就没那么多问题,否则,一点点小事,就愣了。
回复

使用道具 举报

12#
ID:102056 发表于 2016-12-18 21:58 | 只看该作者
zl2168 发表于 2016-12-18 17:14
还是楼主理论学的好,理解正确。理论学好了,就没那么多问题,否则,一点点小事,就愣了。

我理论看来还有待加强,希望能与大家相互交流学习,共同进步。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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