|
這是我的設(shè)計(jì)的要求,各位大佬看看能不能用其他的語句替換其中的一部分,但是功能不缺失,期待各位大佬指點(diǎn)
1、上電或按鍵復(fù)位后顯示器件自動(dòng)顯示0,進(jìn)入準(zhǔn)備階段。
2、共計(jì)兩條地鐵線A與B,每條線上有9個(gè)站點(diǎn),其中5號(hào)站點(diǎn)為兩條地鐵線公共站點(diǎn),任何跨線乘坐必須經(jīng)過5號(hào)站點(diǎn)換乘。
3、每3站計(jì)價(jià)2元,不足3站按2元計(jì)價(jià)。
4、通過鍵盤選擇乘坐起點(diǎn)和終點(diǎn),確認(rèn)及取消購(gòu)買。
5、在顯示器件上顯示起點(diǎn)及終點(diǎn)線路及編號(hào),以及總價(jià)。
單片機(jī)源程序如下:
#include <reg51.h>
#include <stdlib.h>
#include <intrins.h>
#define LEDPORT P0 //LCD數(shù)據(jù)口
//共陽數(shù)字編碼
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; //設(shè)置鍵
sbit K_M = P1^1; //位選建
sbit K_Z = P1^2; //增加鍵
sbit K_J = P1^3; //減小鍵
sbit CC1 = P2^7; //數(shù)碼管位選
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;
//毫秒延時(shí)
void delay_ms(unsigned char ms)
{
unsigned char number,value;
for(number=0;number<ms;number++)
{
value=148;
while(value--);
}
}
//顯示函數(shù)
void display(void)
{
CC1 = 1; //顯示第一位數(shù)碼管
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; //數(shù)碼管位指針
unsigned char cnt = 0; //計(jì)數(shù)值
unsigned char num = 0; //起點(diǎn)和終點(diǎn)之間的站數(shù)
unsigned char flag = 0; //運(yùn)行標(biāo)志
unsigned char datbuff[4]; //選擇結(jié)果
P2 = 0X00;
while(1)
{
display(); //顯示
if(K_S == 0) //設(shè)置鍵動(dòng)作
{
delay_ms(5);
if(K_S == 0) //延時(shí)確認(rèn)
{
flag = 1; //設(shè)置標(biāo)志,進(jìn)入
datbuff[0] = 10; //A
datbuff[1] = 1; //1
datbuff[2] = 10; //A
datbuff[3] = 1; //1
disbuff[0] = datbuff[0]; //顯示初始狀態(tài)
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) //進(jìn)入選擇模式
{
display(); //顯示
cnt++; //計(jì)數(shù)值遞增
if(cnt == 20) //計(jì)數(shù)值達(dá)到20
{
disbuff[wei] = 16; //當(dāng)前選中數(shù)碼管消隱
}
else if(cnt == 40) //計(jì)數(shù)值達(dá)到40
{
disbuff[wei] = datbuff[wei];//顯示字符
cnt = 0; //計(jì)數(shù)值清零
}
if(K_S == 0) //設(shè)置鍵按下
{
delay_ms(5);
if(K_S == 0) //延時(shí)確認(rèn)
{
flag = 0; //清除標(biāo)志,退出選擇模式
wei = 0;
if(datbuff[0] == datbuff[2]) //如果選擇的是同一條線路
{
num = (unsigned char)abs(datbuff[1]-datbuff[3]); //計(jì)算站數(shù)
}
else //如果需要換乘
{
num = (unsigned char)abs(datbuff[1]-5); //計(jì)算一條線路的站數(shù)
num += (unsigned char)abs(datbuff[3]-5); //計(jì)算另一條線路的站數(shù)
}
if((num%3)==0) //如果站數(shù)是3的倍數(shù)
{
num = (num/3)*2; //計(jì)算票價(jià)
}
else //如果不是3的倍數(shù)
{
num = ((num/3)+1)*2; //計(jì)算票價(jià)
}
disbuff[0] = datbuff[0]; //刷新顯示內(nèi)容
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]; //之前指向的位保持顯示狀態(tài)
wei = (wei+1)%4; //指向下個(gè)位置
}
while(K_M == 0) //等待按鍵釋放
{
display();
}
}
if(K_Z == 0) //增加鍵按下
{
delay_ms(5);
if(K_Z == 0)
{
switch(wei) //根據(jù)位指針判斷
{
case 0: if(datbuff[0] == 10) //第一位數(shù)碼管在A,B之間切換
datbuff[0] = 11;
else if(datbuff[0] == 11)
datbuff[0] = 10;
break;
case 1: datbuff[1]++; //第二位數(shù)碼管數(shù)字遞增
if(datbuff[1]==10) //達(dá)到10后回到1
datbuff[1]=1;
break;
case 2: if(datbuff[2] == 10) //第三位數(shù)碼管在A,B之間切換
datbuff[2] = 11;
else if(datbuff[2] == 11)
datbuff[2] = 10;
break;
case 3: datbuff[3]++; //第四位數(shù)碼管數(shù)字遞增
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) //根據(jù)位指針判斷
{
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, 下載次數(shù): 19)
下載附件
2019-12-18 11:35 上傳
這是我的電路原理圖
|