标题: 单片机公交车报站显示程序有问题,求大佬帮忙看看指导指导 [打印本页]

作者: 起个名真难。    时间: 2020-4-7 00:57
标题: 单片机公交车报站显示程序有问题,求大佬帮忙看看指导指导

电路图如上
要实现按键控制公交车报站显示,按下K1显示起点欢迎词,按下K2显示上一站内容,按下K3显示下一站内容,按下K4显示终点欢送词,按键控制部分程序如下,不知道为啥仿真的时候按下K1显示完起点词以后就直接接着往下报了,都不停,按键K2、K3、K4直接是没用了,求大佬帮忙看看程序哪出错了,怎样改一改
程序:
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;
sbit K4=P3^3;
void delay(void)
{
unsigned int n;
for(n=0;n<20000;n++);
}
void main(void)
{
       unsigned char i;
        i=0;    //将i初始化为0
        while(1)
         {
         if(K1==0)
         {
                delay();  //延时一段时间 按键消抖
                if(K1==0)
                i=1;
          }
         if(K2==0)
         {
                delay();  //延时一段时间 按键消抖
                if(K2==0)
                i=i-1;
         }
         if(K3==0)
         {
                delay();  //延时一段时间 按键消抖
                if(K2==0)
                i=i+1;
         }
         if(K4==0)
         {
                delay();  //延时一段时间 按键消抖
                if(K2==0)
                i=5;
         }
         
          switch(i)  //使用多分支选择语句
                {
    case 1: init_lcd();
Clr_Scr();
LCDMcs=0; //左屏开显示
LCDScs=1;
Bmp_Left_Disp(0,0,Bmp1);// Bmp1为某个汉字的首地址
    Bmp_Left_Disp(4,0,Bmp2);
    LCDMcs=1; //右屏开显示
LCDScs=0;
    Bmp_Right_Disp(0,0,Bmp1);
    Bmp_Right_Disp(4,0,Bmp2);
while(1)
                break;
     case 2: init_lcd();
Clr_Scr();
LCDMcs=0; //左屏开显示
LCDScs=1;
Bmp_Left_Disp(0,0,Bmp3);// Bmp1为某个汉字的首地址
    Bmp_Left_Disp(4,0,Bmp4);
    LCDMcs=1; //右屏开显示
LCDScs=0;
    Bmp_Right_Disp(0,0,Bmp3);
    Bmp_Right_Disp(4,0,Bmp4);
while(1)
                break;  
    case 3: init_lcd();
Clr_Scr();
LCDMcs=0; //左屏开显示
LCDScs=1;
Bmp_Left_Disp(0,0,Bmp5);// Bmp1为某个汉字的首地址
    Bmp_Left_Disp(4,0,Bmp6);
    LCDMcs=1; //右屏开显示
LCDScs=0;
    Bmp_Right_Disp(0,0,Bmp5);
    Bmp_Right_Disp(4,0,Bmp6);
while(1)
                break;  
    case 4: init_lcd();
Clr_Scr();
LCDMcs=0; //左屏开显示
LCDScs=1;
Bmp_Left_Disp(0,0,Bmp7);// Bmp1为某个汉字的首地址
    Bmp_Left_Disp(4,0,Bmp8);
    LCDMcs=1; //右屏开显示
LCDScs=0;
    Bmp_Right_Disp(0,0,Bmp7);
    Bmp_Right_Disp(4,0,Bmp8);
while(1)
                break;
    case 5: init_lcd();
Clr_Scr();
LCDMcs=0; //左屏开显示
LCDScs=1;
Bmp_Left_Disp(0,0,Bmp9);// Bmp1为某个汉字的首地址
    Bmp_Left_Disp(4,0,Bmp10);
    LCDMcs=1; //右屏开显示
LCDScs=0;
    Bmp_Right_Disp(0,0,Bmp9);
    Bmp_Right_Disp(4,0,Bmp10);
while(1)
                break;        
                }
    {
  
}
    }
}


作者: 黄youhui    时间: 2020-4-7 08:29
if(k1 == 0){}else if(k2==0){}else if(k3 == 0){}else{};
另外你switch里面每个break都市跳出他前面的while(1);所以你的switch里面每个case后面都没有带break,所以会一直往下
作者: 疯子本人    时间: 2020-4-7 09:34
本帖最后由 疯子本人 于 2020-4-7 16:49 编辑

不知道你这样写的目的,每个switch的每个case不用加while,直接break就好,而且最后面有个无效的括号,头文件没有,P3是矩阵按键,你可以参考参考矩阵的写法
作者: man1234567    时间: 2020-4-7 12:58
那么多的while(1)
作者: 起个名真难。    时间: 2020-4-7 20:44
黄youhui 发表于 2020-4-7 08:29
if(k1 == 0){}else if(k2==0){}else if(k3 == 0){}else{};
另外你switch里面每个break都市跳出他前面的whi ...

我想问下怎样实现swich语句中执行完case1后再重新判定swich表达式的值而不是继续往下执行case2
作者: 黄youhui    时间: 2020-4-8 13:08
起个名真难。 发表于 2020-4-7 20:44
我想问下怎样实现swich语句中执行完case1后再重新判定swich表达式的值而不是继续往下执行case2

switch(n)
{
case 0:代码1;break;
case 1:代码2;break;
.
.
.
default:break;


}

作者: 黄youhui    时间: 2020-4-8 17:29
起个名真难。 发表于 2020-4-7 20:44
我想问下怎样实现swich语句中执行完case1后再重新判定swich表达式的值而不是继续往下执行case2

把你的while(1)去掉或者在break后面再加一个break就好了,switch检测道case后面的break就会跳出,但是你代码里面的break被你的while(1)抵消掉了
作者: vimli    时间: 2020-4-8 21:23
给个经典的按键扫描做法给你

按键SCAN.pdf

113.88 KB, 下载次数: 6






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1