找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1203|回复: 7
收起左侧

单片机公交车报站显示程序有问题,求大佬帮忙看看指导指导

[复制链接]
回帖奖励 50 黑币 回复本帖可获得 10 黑币奖励! 每人限 1 次
ID:720043 发表于 2020-4-7 00:57 | 显示全部楼层 |阅读模式
原理图片.png
电路图如上
要实现按键控制公交车报站显示,按下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;        
                }
    {
  
}
    }
}

回复

使用道具 举报

ID:592807 发表于 2020-4-7 08:29 | 显示全部楼层
if(k1 == 0){}else if(k2==0){}else if(k3 == 0){}else{};
另外你switch里面每个break都市跳出他前面的while(1);所以你的switch里面每个case后面都没有带break,所以会一直往下
回复

使用道具 举报

ID:405033 发表于 2020-4-7 09:34 | 显示全部楼层
本帖最后由 疯子本人 于 2020-4-7 16:49 编辑

不知道你这样写的目的,每个switch的每个case不用加while,直接break就好,而且最后面有个无效的括号,头文件没有,P3是矩阵按键,你可以参考参考矩阵的写法
回复

使用道具 举报

ID:584814 发表于 2020-4-7 12:58 | 显示全部楼层
那么多的while(1)
回复

使用道具 举报

ID:720043 发表于 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
回复

使用道具 举报

ID:592807 发表于 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;


}
回复

使用道具 举报

ID:592807 发表于 2020-4-8 17:29 | 显示全部楼层
起个名真难。 发表于 2020-4-7 20:44
我想问下怎样实现swich语句中执行完case1后再重新判定swich表达式的值而不是继续往下执行case2

把你的while(1)去掉或者在break后面再加一个break就好了,switch检测道case后面的break就会跳出,但是你代码里面的break被你的while(1)抵消掉了
回复

使用道具 举报

ID:573999 发表于 2020-4-8 21:23 | 显示全部楼层
给个经典的按键扫描做法给你

按键SCAN.pdf

113.88 KB, 下载次数: 6

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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