计价器.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 + -
显示快捷键?