找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1602|回复: 2
收起左侧

关于单片机地铁计价器C语言程序语句替换的小问题

[复制链接]
ID:655376 发表于 2019-12-18 11:24 | 显示全部楼层 |阅读模式
这是我的设计的要求,各位大佬看看能不能用其他的语句替换其中的一部分,但是功能不缺失,期待各位大佬指点
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();
                                }
                        }        
                }                                
        }
}

这是我的电路原理图

这是我的电路原理图
回复

使用道具 举报

ID:235200 发表于 2019-12-18 16:38 | 显示全部楼层
可以采用循环语句和数组进行替换,程序要简洁多了
回复

使用道具 举报

ID:655376 发表于 2019-12-18 19:26 | 显示全部楼层
csmyldl 发表于 2019-12-18 16:38
可以采用循环语句和数组进行替换,程序要简洁多了

首先谢谢大佬给的思路,不过这个东西我也是今年刚学
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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