重复一次,在下列程序中 switch case语句的用法表现为:编译时正常,但仿真时 case 2: ,case 3: 等语句总是不能被选中,不知问题何在,如何解决?就是说switch case语句不能正常运行,请帮解决。(用lcd12864屏显示).
#include <reg52.h>
//包含头文件
#include <stdio.h>
//包含头文件
#include <string.h>
//包含头文件
#define uchar unsigned char
//宏定义
#define uint unsigned int
//宏定义
#define LCD_data
P0
//数据口
sbit int0=P3^0;
//串口读入
sbit mc_out=P2^1;
//打点脉冲输出位置
sbit LCD_RS
=
P2^2;
//数据/地址寄存器选择输入
sbit LCD_RW
=
P2^3;
//液晶读/写控制
sbit LCD_EN
=
P2^4;
//液晶使能控制
sbit LCD_PSB =
P2^7;
//串/并方式控制
sbit LCD_RST
=
P2^6;
//
lcd复位端
sbit LCD_vout
=
P2^5;
//倍压输出选择端
uchar code dis0[] = {"
欢迎使用"};
uchar code dis1[] = {"焊缝识别打点系统"};
uchar code dis2[]={"焊缝类型: 气压焊"};
uchar code dis3[]={"焊缝类型: 电阻焊"};
uchar code dis4[]={"焊缝类型: 法铝焊"};
uchar code dis5[]={"焊缝类型: 异常"};
uchar code dis6[]={"钢轨编号: "};
char flag,hex;
char a[14];
//字符数组a,a[14]为系统自动增设的终结符(\0)
char b[14];
int i,c;
void init();
//初始化子程序的声明
void delay(uint z);
void lcd_init();
//lcd初始化子程序的声明
void lcd_pos(uchar X,uchar Y);
//初始位置子程序的声明
void pout(uint x);
//输出脉冲子程序的声明
uint num,x,bb;
char temp,aChar,ascii;
/*******************************************************************/
/*
*/
/*
1毫秒延时函数
*/
/*
*/
/*******************************************************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*******************************************************************/
/*
*/
/*
50微秒延时函数
*/
/*
*/
/*******************************************************************/
void delay_50us
(uchar t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
/*******************************************************************/
/*
*/
/*检查LCD忙状态
*/
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。
*/
/*
*/
/*******************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delay_50us(1);
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************/
/*
*/
/*写指令数据到LCD
*/
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
*/
/*
*/
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
delay_50us(2);
P0 = cmd;
LCD_EN = 1;//下降沿写入
delay_50us(8);
LCD_EN = 0;
delay_50us(2);
}
/*******************************************************************/
/*
*/
/*写显示数据到LCD
*/
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。
*/
/*
//显示字符
*/
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
delay_50us(1);
P0 = dat;
LCD_EN = 1;//下降沿写入
delay_50us(10);
LCD_EN = 0;
delay_50us(2);
}
void main()
{
init();
//调用串口初始化子函数
lcd_init();
//调用lcd初始化子函数
while(1)
{
if(flag==1)
{
ES=0;
//关串口中断
flag=0;
//清除flag标志位
lcd_wcmd(0x01);
//清除LCD的显示内容
delay(5);
i=0;
lcd_pos(0,0);
//设置显示位置为第一行的第1个字符
while(a[i]!= '\0')
{
lcd_wdat(a[i]);
i++
;
}
c=a[7];
num = 0;
// num清零
switch (c)
{
case 2:
//如果a[7]=2,执行下面操作
lcd_pos(1,0);
//设置显示位置为第二行的第1个字符
while(dis2[num] != '\0')
{
lcd_wdat(dis2[num]);
//显示字符 "焊缝类型:气压焊"
num++;
}
pout(2);
// 输出两个脉冲
break;
// 返回
case 3:
//如果a[7]=3,执行下面操作
lcd_pos(1,0);
//设置显示位置为第二行的第1个字符
while(dis3[num] != '\0')
{
lcd_wdat(dis3[num]);
//显示字符 "焊缝类型:电阻焊"
num++;
}
pout(3);
// 输出三个脉冲
break;
// 返回
case 4:
//如果a[7]=4,执行下面操作
lcd_pos(1,0);
//设置显示位置为第二行的第1个字符
while(dis4[num] != '\0')
{
lcd_wdat(dis4[num]);
//显示字符 "焊缝类型:法铝焊"
num++;
}
pout(4);
// 输出四个脉冲
break;
//返回
default:
//如果a[7]不等于上述各值,执行下面操作
num = 0;
// num清零
lcd_pos(1,0);
//设置显示位置为第二行的第1个字符
while(dis5[num] != '\0')
{
lcd_wdat(dis5[num]);
//显示字符 "焊缝类型:异常"
num++;
}
pout(1);
// 输出一个脉冲(异常)
break;
//返回
}
num=0;
lcd_pos(2,0);
//设置显示位置为第三行的第1个字符
while(dis6[num] != '\0')
{
lcd_wdat(dis6[num]);
//显示字符 "钢轨编号: "
num++;
}
lcd_wdat(a[8]);
lcd_wdat(a[9]);
lcd_wdat(a[10]);
ES=1;
//开串口中断
}
}
}
void ser() interrupt 4
//串口中断程序
{
ES=0;
//关串口中断
RI=0;
//清零串口接收标志位
for ( i = 0; i < 12; i++)
//(将i<14改为i<12)去掉右边两位(终结符和结束位),这样更稳定 。
//
不能去掉奇数位,因为一字节占用两位。使用时不用左边三位
//
(一位起始位a[0]和两位卡的厂商标志位a[1],a[2])和右边一位a[11](校验和)。
//
剩余的八位(a[3]---a[10])十陆进制数已足够使用。
{
a[i] = SBUF;
while(!RI);
RI=0;
}
b[14]=a[14];
flag=1;
ES=1;
//开串口中断
}
void init()
{
TMOD = 0x20;
// 定时器T1工作于8位自动重载模式, 用于产生波特率
TH1 = 0xfd;
// 波特率9600
TL1 = 0xfd;
// 波特率9600
TR1 = 1;
// 启动定时器T1
SCON = 0x50;
// 设定串行口工作方式1,(SM0=0;SM1=1)及REN=1
EA=1;
//开总中断
ES=1;
//开串口中断
mc_out=1;
//打点脉冲输出高电平
}
/*********************************************************/
/*
*/
/* 设定显示位置
*/
/*
*/
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
//显示地址
{
uchar
pos;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y ;
lcd_wcmd(pos);
//显示地址
}
/*******************************************************************/
/*
*/
/*
LCD初始化设定
*/
/*
*/
/*******************************************************************/
void lcd_init()
{
LCD_PSB = 1;
//并口方式
LCD_EN=0;
LCD_RST=0;
//复位
delay(5);
LCD_RST=1;
//复位恢复
lcd_wcmd(0x34);
//扩充指令操作
delay(5);
lcd_wcmd(0x30);
//基本指令操作
delay(5);
lcd_wcmd(0x0C);
//显示开,关光标
delay(5);
lcd_wcmd(0x01);
//清除LCD的显示内容
delay(5);
num = 0;
//欢迎界面开始
lcd_wcmd(0x01);
//清除LCD的显示内容
delay(5);
lcd_pos(0,0);
//设置显示位置为第一行的第1个字符
while(dis0[num] != '\0')
{
lcd_wdat(dis0[num]);
//显示字符 "欢迎使用"
num++;
}
num = 0;
// num清零
lcd_pos(2,0);
//设置显示位置为第三行的第1个字符
while(dis1[num] != '\0')
{
lcd_wdat(dis1[num]);
//显示字符
"焊缝识别打点系统"
num++;
}
}
void pout(uint x)
//根据焊缝类型 输出x个脉冲信号
{
for(; x >0; x--)
{
mc_out= 0;
delay(500);
mc_out= 1;
delay(1000);
}
}