计价器.c
来自「刚学时编的小程序」· C语言 代码 · 共 770 行 · 第 1/2 页
C
770 行
}
if(erjian()==1) //按下二键,暂停/开始
{
TR1=~TR1;
}
if(shangjian()==1) //按下三键,停止
{
k=~k;
if(k==1) //第一次按下,停止计价
{
TR1=0;
a=4;
}
if(k==0) //第二次按下,显示时间,数据清0
{
a=0;
lucheng[5]=0;
lucheng[6]=18;
lucheng[7]=0;
lucheng[0]=0;
lucheng[1]=0;
lucheng[2]=18;
lucheng[3]=0;
zongjia[0]=18;
zongjia[1]=0;
zongjia[5]=0;
zongjia[6]=18;
zongjia[7]=0;
break;
}
}
}
}
gaijia() //改价子程序
{
a=2; //改价显示
i=8;
while(1)
{
if(shangjian()==1) //三键按下,退出程序
goto loop;
if(erjian()==1) //二键按下,进入输密码程序
{
if(mi()==1) //密码正确,跳出循环
{
a=2;
break;
}
else
{
a=0;goto loop; //密码错误,退出
}
}
if(yijian()==1) //按下一键,进入改密码单元
{
gaimi();
goto loop;
}
}
for(i=7;i>=0;i--) //循环8次
{
if(i==5|i==2) continue; //如果是第二位或第五位,不改
if((i==7|i==4|i==1)&jiage[i]<18) jiage[i]=18; //一、四、七位显示小数点
while(1)
{
if(shangjian()==1) //按下三键,价格减1
{
jiage[i]--;
if(jiage[i]<0|jiage[i]==17)
jiage[i]=jiage[i]+10;
}
if(erjian()==1) //按下二键,价格加1
{
jiage[i]++;
if(jiage[i]==10|jiage[i]==28)
jiage[i]=jiage[i]-10;
}
if(yijian()==1) break; //按下一键,移到下一位
}
}
wrtorom(jiage,8,8);
jia=1;
loop:;
a=0; //退出后显示时间
i=0;
}
void main() //主程序
{
TMOD=0x42; //初始化
TH0=0x06;
TL0=0x06;
TH1=7192;
TL1=7192;
TR0=1;
ET0=1;
ET1=1;
EA=1;
P0=duanma[shijian[dis]] ; //P0口输出段码
P2=weima[dis] ; //P2口输出位码
while(1)
{
if(yijian()==1) //一键按下,进入改时间程序
{
tiaoshi();
}
if(erjian()==1) //二键按下,进入计价程序
{
led=0;
jijia();
}
if(shangjian()==1) //三键按下,进入改价格程序
{
gaijia();
}
if(kaiguan()==1) //白天,晚上转换开关
{
m=1;
}
else m=0;
}
}
void t0(void) interrupt 1 using 1 //定时器0中断
{
tcnt++;
ms++;
if(ms==8)
{
ms=0;
switch(a) //显示模块开关
{
case 0: if((i==dis|(i-1)==dis)&i>0) //0:显示时间
{
if(tcnt<1500) //闪动程序
{
P0=duanma[17];
}
else P0=duanma[shijian[dis]];
break;
}
else P0=duanma[shijian[dis]]; break;
case 1: P0=duanma[lucheng[dis]]; break; //1:显示路程
case 2: if(i==dis&i>=0) //2:显示价格
{
if(tcnt<1500)
{
P0=duanma[17];
}
else P0=duanma[jiage[dis]] ; break;
}
else P0=duanma[jiage[dis]] ; break;
case 3: if(shijian[1]%2==1) //3:路程,总价循环显示
{
P0=duanma[lucheng[dis]] ; break;
}
else P0=duanma[zongjia[dis]]; break;
case 4: P0=duanma[zongjia[dis]]; break; //4:总价显示
case 5: if(i==dis&i>=0) //5:输密码显示
{
if(tcnt<1500)
{
P0=duanma[17];
}
else P0=duanma[mima[dis]];
break;
}
else P0=duanma[mima[dis]]; break;
case 6: if(i==dis&i>=0) //6:改密码显示
{
if(tcnt<1500)
{
P0=duanma[17];
}
else P0=duanma[mima1[dis]];
break;
}
else P0=duanma[mima1[dis]]; break;
}
P2=weima[dis]; //位码扫描
dis++;
if(dis==8)
{
dis=0;
}
}
if(tcnt==3685)
{
if(TR1==1) //计数器开始状态,计时间
{
lucheng[0]++;
if(lucheng[0]==10)
{
lucheng[0]=0;
lucheng[1]++;
if(lucheng[1]==6)
{
lucheng[1]=0;
lucheng[2]++;
if(lucheng[2]==28)
{
lucheng[2]=18;
lucheng[3]++;
if(lucheng[3]==6)
lucheng[3]=0;
}
}
}
}
tcnt=0;
if(k==0)
second++; //秒加1
if(second>=60) //到60清0,分加1
{
if(w==1)
{
hour1++;
if(hour1==2)
{
hour1=0;
w=0;
}
}
second=0;
minite++;
if(x==1&TR1==1) //是否在进行中断(中途等待程序)
{
y++; //没进行y+1
if(y==1) //是否等待1分钟
{
y=0; //清0
zongjia[0]=jiage[3]; //价格显示位显示中途等待价
zongjia[1]=jiage[4];
zongjia[5]=zongjia[5]+jiage[3];if(zongjia[5]>9) //总价加中途等待价
{
n=1; zongjia[5]=zongjia[5]%10;
}
zongjia[6]=zongjia[6]+jiage[4];if(n==1)
{
zongjia[6]++;n=0;
}
zongjia[6]=zongjia[6]-18; if(zongjia[6]>27)
{
n=1; zongjia[6]=zongjia[6]-10;
}
if(n==1)
{
zongjia[7]++;
n=0;
if(zongjia[7]>9)
zongjia[7]=0;
}
}
}
if(minite>=60) //分到60清0
{
minite=0;
hour++; //时加1
if(hour>=24) //时到24清0
{
hour=0;
}
/* if(w==1)
{
hour1++;
if(hour1==24)
{
hour1=0;
w=0;
}
} */
}
}
shijian[0]=second%10;
shijian[1]=second/10;
shijian[3]=minite%10;
shijian[4]=minite/10;
shijian[6]=hour%10;
shijian[7]=hour/10;
}
}
void t1(void) interrupt 3 using 2
{
x=0; //进入中断标志
tcnt2++;
switch(m) //判断白天还是晚上
{
case 0: zongjia[0]=jiage[0]; //白天总价0、1位显示白天单价
zongjia[1]=jiage[1];
break;
case 1: zongjia[0]=jiage[6]; //晚上总价0、1位显示白天单价
zongjia[1]=jiage[7];
break;
}
if(tcnt2<=10)
{
zongjia[6]=23;
}
else
{
c++;
if(c==5)
{
c=0;
switch(m) //判断白天还是晚上
{
case 0: zongjia[5]=zongjia[5]+jiage[0];if(zongjia[5]>9) //白天:总价加白天单价
{
n=1; zongjia[5]=zongjia[5]%10;
}
zongjia[6]=zongjia[6]+jiage[1];if(n==1)
{
zongjia[6]++;n=0;
}
zongjia[6]=zongjia[6]-18;if(zongjia[6]>27)
{
n=1; zongjia[6]=zongjia[6]-10;
}
if(n==1)
{
zongjia[7]++;
n=0;
if(zongjia[7]>9)
zongjia[7]=0;
}
break;
case 1: zongjia[5]=zongjia[5]+jiage[6];if(zongjia[5]>9) //晚上:总价加晚上单价
{
n=1; zongjia[5]=zongjia[5]%10;
}
zongjia[6]=zongjia[6]+jiage[7];if(n==1)
{
zongjia[6]++;n=0;
}
zongjia[6]=zongjia[6]-18;if(zongjia[6]>27)
{
n=1; zongjia[6]=zongjia[6]-10;
}
if(n==1)
{
zongjia[7]++;
n=0;
if(zongjia[7]>9)
zongjia[7]=0;
}
zongjia[0]=jiage[6];
zongjia[1]=jiage[7];
break;
}
}
}
lucheng[5]++; //路程位加1
if(lucheng[5]>9)
{
n=1; //大于9进1位
lucheng[5]=lucheng[5]%10; //本位10取余
}
if(n==1) //是否有进位
{
n=0; //进位清0
lucheng[6]++; //上一位加1
if(lucheng[6]>27) //是否到有小数点的9
{
n=1; //进位
lucheng[6]=lucheng[6]-10; //本位减10
}
}
if(n==1) //是否有进位
{
n=0; //进位清0
lucheng[7]++; //加1
if(lucheng[7]>9) //如果大于9清0
{
lucheng[7]=0;
}
}
x=1; //中断完成标志
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?