欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2270|回復: 2
打印 上一主題 下一主題
收起左側

關于單片機地鐵計價器C語言程序語句替換的小問題

[復制鏈接]
跳轉到指定樓層
樓主
這是我的設計的要求,各位大佬看看能不能用其他的語句替換其中的一部分,但是功能不缺失,期待各位大佬指點
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();
                                }
                        }        
                }                                
        }
}

1.png (131.21 KB, 下載次數: 19)

這是我的電路原理圖

這是我的電路原理圖
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表