这是我的设计的要求,各位大佬看看能不能用其他的语句替换其中的一部分,但是功能不缺失,期待各位大佬指点
1、上电或按键复位后显示器件自动显示0,进入准备阶段。
2、共计两条地铁线A与B,每条线上有9个站点,其中5号站点为两条地铁线公共站点,任何跨线乘坐必须经过5号站点换乘。
3、每3站计价2元,不足3站按2元计价。
4、通过键盘选择乘坐起点和终点,确认及取消购买。
5、在显示器件上显示起点及终点线路及编号,以及总价。
单片机源程序如下:
#include <reg51.h>
#include <stdlib.h>
#include <intrins.h>
#define LEDPORT P0 //LCD数据口
//共阳数字编码
unsigned char ca_table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
unsigned char disbuff[6]; //显示字符
sbit K_S = P1^0; //设置键
sbit K_M = P1^1; //位选建
sbit K_Z = P1^2; //增加键
sbit K_J = P1^3; //减小键
sbit CC1 = P2^7; //数码管位选
sbit CC2 = P2^6;
sbit CC3 = P2^5;
sbit CC4 = P2^4;
sbit CC5 = P2^3;
sbit CC6 = P2^2;
sbit CC7 = P2^1;
sbit CC8 = P2^0;
//毫秒延时
void delay_ms(unsigned char ms)
{
unsigned char number,value;
for(number=0;number<ms;number++)
{
value=148;
while(value--);
}
}
//显示函数
void display(void)
{
CC1 = 1; //显示第一位数码管
LEDPORT = ca_table[disbuff[0]];
delay_ms(5);
CC1 = 0;
CC2 = 1; //第二位
LEDPORT = ca_table[disbuff[1]];
delay_ms(5);
CC2 = 0;
CC3 = 1; //第三位
LEDPORT = ca_table[disbuff[2]];
delay_ms(5);
CC3 = 0;
CC4 = 1; //第四位
LEDPORT = ca_table[disbuff[3]];
delay_ms(5);
CC4 = 0;
CC7 = 1; //第七位
LEDPORT = ca_table[disbuff[4]];
delay_ms(5);
CC7 = 0;
CC8 = 1; //第八位
LEDPORT = ca_table[disbuff[5]];
delay_ms(5);
CC8 = 0;
}
void main(void)
{
unsigned char wei = 0; //数码管位指针
unsigned char cnt = 0; //计数值
unsigned char num = 0; //起点和终点之间的站数
unsigned char flag = 0; //运行标志
unsigned char datbuff[4]; //选择结果
P2 = 0X00;
while(1)
{
display(); //显示
if(K_S == 0) //设置键动作
{
delay_ms(5);
if(K_S == 0) //延时确认
{
flag = 1; //设置标志,进入
datbuff[0] = 10; //A
datbuff[1] = 1; //1
datbuff[2] = 10; //A
datbuff[3] = 1; //1
disbuff[0] = datbuff[0]; //显示初始状态
disbuff[1] = datbuff[1];
disbuff[2] = datbuff[2];
disbuff[3] = datbuff[3];
disbuff[4] = 0;
disbuff[5] = 0;
}
while(K_S == 0) //等待按键释放
{
display();
}
}
while(flag == 1) //进入选择模式
{
display(); //显示
cnt++; //计数值递增
if(cnt == 20) //计数值达到20
{
disbuff[wei] = 16; //当前选中数码管消隐
}
else if(cnt == 40) //计数值达到40
{
disbuff[wei] = datbuff[wei];//显示字符
cnt = 0; //计数值清零
}
if(K_S == 0) //设置键按下
{
delay_ms(5);
if(K_S == 0) //延时确认
{
flag = 0; //清除标志,退出选择模式
wei = 0;
if(datbuff[0] == datbuff[2]) //如果选择的是同一条线路
{
num = (unsigned char)abs(datbuff[1]-datbuff[3]); //计算站数
}
else //如果需要换乘
{
num = (unsigned char)abs(datbuff[1]-5); //计算一条线路的站数
num += (unsigned char)abs(datbuff[3]-5); //计算另一条线路的站数
}
if((num%3)==0) //如果站数是3的倍数
{
num = (num/3)*2; //计算票价
}
else //如果不是3的倍数
{
num = ((num/3)+1)*2; //计算票价
}
disbuff[0] = datbuff[0]; //刷新显示内容
disbuff[1] = datbuff[1];
disbuff[2] = datbuff[2];
disbuff[3] = datbuff[3];
disbuff[4] = num/10;
disbuff[5] = num%10;
}
while(K_S == 0) //等待按键释放
{
display();
}
}
if(K_M == 0) //位选键按下
{
delay_ms(5);
if(K_M == 0)
{
disbuff[wei] = datbuff[wei]; //之前指向的位保持显示状态
wei = (wei+1)%4; //指向下个位置
}
while(K_M == 0) //等待按键释放
{
display();
}
}
if(K_Z == 0) //增加键按下
{
delay_ms(5);
if(K_Z == 0)
{
switch(wei) //根据位指针判断
{
case 0: if(datbuff[0] == 10) //第一位数码管在A,B之间切换
datbuff[0] = 11;
else if(datbuff[0] == 11)
datbuff[0] = 10;
break;
case 1: datbuff[1]++; //第二位数码管数字递增
if(datbuff[1]==10) //达到10后回到1
datbuff[1]=1;
break;
case 2: if(datbuff[2] == 10) //第三位数码管在A,B之间切换
datbuff[2] = 11;
else if(datbuff[2] == 11)
datbuff[2] = 10;
break;
case 3: datbuff[3]++; //第四位数码管数字递增
if(datbuff[3]==10)
datbuff[3]=1;
break;
}
}
while(K_Z == 0) //等待按键释放
{
display();
}
}
if(K_J == 0) //减小键按下
{
delay_ms(5);
if(K_J == 0)
{
switch(wei) //根据位指针判断
{
case 0: if(datbuff[0] == 10) //第一位A,B切换
datbuff[0] = 11;
else if(datbuff[0] == 11)
datbuff[0] = 10;
break;
case 1: datbuff[1]--; //第二位递减
if(datbuff[1]==0) //到0之后回到9
datbuff[1]=9;
break;
case 2: if(datbuff[2] == 10) //第三位A,B切换
datbuff[2] = 11;
else if(datbuff[2] == 11)
datbuff[2] = 10;
break;
case 3: datbuff[3]--; //第四位递减
if(datbuff[3]==0)
datbuff[3]=9;
break;
}
}
while(K_J == 0) //等待按键释放
{
display();
}
}
}
}
}
|