⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 HT1621液晶控制测试
💻 C
📖 第 1 页 / 共 3 页
字号:
/*  ********************************************************  */
#include "REG51STC.H"
#include "CMD16887.H"
#include "variable.h"
#include <ABSACC.H>

/********************************************************/
/**************************************************************************
*   功能:清除工作面A加油数据
*
***************************************************************************/
void clear_worka(void)
{  uchar i;
	if(state1==0x00 || ration_pulse_a==0){ration_num_a=999999;ration_mode_a=0;calculate_ration(0);}
	gun1.liter=0x00;   //升
	gun1.sale=0x00;   //金额
	gun1.pulse=0;
	jl1s=0;
	for(i=40;i<49;i++)
	{
		table_buf[i]=0;
	}
	//cgq1s1old=cgq1s1;
	//cgq1s2old=cgq1s2;
	if(!cease_power)disp_lcd1(price_a,0x0);
   updatea=1;
}
/**************************************************************************
*   功能:清除工作面B加油数据   [ok]
*
***************************************************************************/
void clear_workb(void)  
{  uchar i;
	if(state2==0x00 || ration_pulse_b==0){ration_num_b=999999;ration_mode_b=0;calculate_ration(1);}
	gun2.liter=0x00;   //升
	gun2.sale=0x00;   //金额
	gun2.pulse=0;
	jl2s=0;
	for(i=40+53;i<49+53;i++)
	{
		table_buf[i]=0;
	}
	//cgq1s2old=cgq2s1;
	//cgq2s2old=cgq2s2;
	if(!cease_power)disp_lcd2(price_b,0x0);
	updateb=1;
}
/*****************************************************************************
*          
*功能:系统上电初始化
;     BOUD=57600,由定时器1产生
*****************************************************************************/
void InitializeSystem(void)
{   uchar  i;
	for(i=0;i<106;i++)
	{
		table_buf[i]=0;
	}
   Get1302(); //上电读时间,便于打印
 
	k1spk_time=0;
    keyinput_a=0;
	hang_cnt1=0;hang_cnt2=0;
	jl1s=0;
	jl2s=0;
	//oil_types_a=1;  //油枪a的油类别
	timer_time=20;
	time_seccnt=20;
	prn1time=0;
	prn2time=0;
	TMOD&=0x0f;
	TMOD|=0x21;
	PCON|=0x80;
	SCON=0xf0;   /* MODEL --3,REN=1,SM2=1  */
	TH1=0xd0;
	TL1=0xd0;  //fdh--波特率19200  fah--9600,均为单倍速时  d0,e8
	TR1=1;
	TH0=0xf8;
	TL0=0x30;
	
	isp_err=0;
	
	
	RCAP2H=0xd8;
	RCAP2L=0xf0;
	TH2=0xd8;
	TL2=0xf0;
	T2CON=0x00;
	TCON=0x01;
	
	ration_a=0;   
	ration_b=0;
	ration_mode_a=0;  //1--a枪为定升加油  0--a枪为定元加油模式
	ration_mode_b=0;  //1--a枪为定升加油  0--a枪为定元加油模式
	vip_mode_a=0;
	vip_mode_b=0;
	/************************/
	// AUXR |=0x02;
	// cmdmem=XBYTE[TQJLADD];
	// AUXR &=0xfd;
	
	/************************/
	clear_worka();
	clear_workb();
	state1=0;state2=0;
	keya_num[0]=0x7e;
	keya_num[1]=0x00;
	keya_num[2]=0x00;
	keya_num[3]=0x00;
	keya_num[4]=0x00;

	keyb_num[0]=0x7e;
	keyb_num[1]=0x00;
	keyb_num[2]=0x00;
	keyb_num[3]=0x00;
	keyb_num[4]=0x00;
	save_oka=0;idle_numa=0;
	save_okb=0;idle_numb=0;
	printformat_saveok=0;
	TR2=1;
	IP=0x00;
	TR0=1;
   TR1=1;
	IE=0xb3;
	EX0=1;
}
/***************************************************************************
*    中断0:外部中断0
****************************************************************************/
void int_int0(void) interrupt 0 using 1
{	cease_power=1;
}
/***************************************************************************
*    中断1:定时器0   12T时2mS中断一次
****************************************************************************/
void int_timer0(void) interrupt 1 using 1
{   uchar data  mem_inn;  //做堆栈用--AUXR
	bit   bittemp=0;
	 TH0=0xf8;	 
    TL0=0x30;
	 scanfkey=1;

	 mem_inn=AUXR;  //做堆栈用
	 AUXR |=0x02;
	 cmdmem=XBYTE[TQJLADD];	                
	 AUXR &=0xfd;
    
    if  (state1==1)
	 {
		 if(cgq1s1 && !cgq1s1old)
		 {
			jl1s++;
			if(ration_pulse_a>0) ration_pulse_a--;
			if(ration_pulse_a<residue_a) {if(DCFD1==0){DCFD1=1;bittemp=1;}}
			if(ration_pulse_a==0) {ration_a=1;DCFX1=1;DCFD1=1;state1=0x0;}
		 }
		 cgq1s1old=cgq1s1;
		 if(cgq1s2 && !cgq1s2old)
		 {
			jl1s++;
			if(ration_pulse_a>0) ration_pulse_a--;
			if(ration_pulse_a<residue_a) {if(DCFD1==0){DCFD1=1;bittemp=1;}}
			if(ration_pulse_a==0) {ration_a=1;DCFX1=1;DCFD1=1;state1=0x0;}
		 }
		 cgq1s2old=cgq1s2;
	  }
	  ///////////////////
	  if (state2==1)
	  {
		 if(cgq2s1old && !cgq2s1)
		 {
			jl2s++;
			if(ration_pulse_b>0) ration_pulse_b--;
			if(ration_pulse_b<residue_b) {if(DCFD2==0){DCFD2=1;bittemp=1;}}
			if(ration_pulse_b==0) {ration_b=1;DCFX2=1;DCFD2=1;state2=0x0;}
		 }
		 cgq2s1old=cgq2s1;
		 if(cgq2s2old && !cgq2s2)
		 {
			jl2s++;
			if(ration_pulse_b>0) ration_pulse_b--;
			if(ration_pulse_b<residue_b) {if(DCFD2==0){DCFD2=1;bittemp=1;}}
			if(ration_pulse_b==0) {ration_b=1;DCFX2=1;DCFD2=1;state2=0x0;}
		 }
		 cgq2s2old=cgq2s2;
	  }
	  //if(bittemp) dcespk_out();  //关电磁阀
	  //////////////////////////
    timer_time--;
	 switch (timer_time)
	 {
	 	case 0:
			timer_time=40;
			if (jsq1out) {jsq1out=0;jsq1=0;}   //计数器输出
			else	jsq1=1;
			if (jsq2out) {jsq2out=0;jsq2=0;}   //计数器输出
			else	jsq2=1;
			break;
		case 5:
		  update_worka=1; 
			
			break;
		case 10:
		   if(hang_time1!=0)  hang_time1--;  //挂枪延时
  			if(hang_time2!=0)  hang_time2--;  //挂枪延时
			break;
		case 15:
		   update_workb=1;
			break;
		case  20:
			break;
		case  25:
			
			break;
		case  30:
			if(hang_time1!=0)  hang_time1--;  //挂枪延时
  			if(hang_time2!=0)  hang_time2--;  //挂枪延时
			break;
		case  32:
		   time_seccnt--;   //6T时刚好1秒
			if(time_seccnt==0)	{time_seccnt=2;}   //温度转换
			break;
		/*default:  
 	   	timer_time=40;
			break;*/
	 }
	 AUXR=mem_inn;   //做堆栈用  //AUXR &=0xfd;
}
/*****************************************************************************
*         功能:串行中断,接收上位机数据
*****************************************************************************/
void seri_int (void) interrupt 4 using 2
{  uchar data  mem_inn;  //做堆栈用--AUXR
   uchar data  i;
   uchar data rece_data;
   uchar data verify=0;
   mem_inn=AUXR;  //做堆栈用
   AUXR &=0xfd;
	rece_data=SBUF;
   if(RI)
   {  RI=0;
		if(RB8)  
		{
			//rece_num=1;  //记数器清零
			if(rece_data==gunadd_a || rece_data==gunadd_b || rece_data==0) {SM2=0;rece_buf[0]=rece_data;rece_num=1;}
		}
		else
		{
			i=rece_num++;
			rece_buf[i]=rece_data;
		
			i=rece_buf[1];    //长度
			if(rece_num>i)  
			{  SM2=1;
				
				verify=0;
				for(i=0;i<rece_buf[1];i++)
			   {
			   	verify+=rece_buf[i];   //计算检验字			
			   }
			   verify=~verify+1;  //取反+1
			   if(verify==rece_buf[rece_buf[1]])
			   {   
					//rece_ok=1;
					
					rece_command();   //通讯处理
			   }
				else   //返回错误代码
				{
				}
				rece_num=1;
			}
		}
		if(rece_num>158)
		{
		   rece_num=0;
		}
    }
    else if(TI)  //发送
    {
    	TI=0;
		send_unm++;
		if(send_unm<send_buf[0])SBUF=send_buf[send_unm];
    }
	AUXR=mem_inn;   //做堆栈用
}
/***************************************************************************
*    中断5:定时器2    12T时:20mS中断1次
*    时长[100:1长2短,50:2短,20:1短,<20:不鸣]
****************************************************************************/
void int_timer2(void) interrupt 5 using 1
{	uchar data  mem_inn;  //做堆栈用--AUXR
	TF2=0;
	TH2=0xb1;
	TL2=0xe1;
	mem_inn=AUXR;
	AUXR &=0xfd;
	dispkeyok=1;
	disp_key();
   if (k1spk_time==100 || k1spk_time==50 || k1spk_time==20) k1spk=0;   //打开蜂鸣器1
	if (k1spk_time==60 || k1spk_time==30 || k1spk_time==0) k1spk=1;   //关闭蜂鸣器1

	if (k1spk_time>0)  k1spk_time--;
	if (k1spk_time==0)  k1spk=1;
	/****************************/
	if (k2spk_time==110 || k2spk_time==50 || k2spk_time==20) k2spk=0;   //打开蜂鸣器1
	if (k2spk_time==60 || k2spk_time==30 || k2spk_time==0) k2spk=1;   //关闭蜂鸣器1

	if (k2spk_time>0)  k2spk_time--;
	if (k2spk_time==0)  k2spk=1;	
	timesec++;
	if(timesec==100)  //秒
	{	timesec=0;dispprn_a=1;
		if(disp_floor_level_a>(gun1.pulse+4))disp_floor_level_a-=4;
		if(disp_floor_level_b>(gun2.pulse+4))disp_floor_level_b-=4;
		if(prn1time>0)prn1time--;
		if(state1==4 && menu1==4 && temp_mema==4) temp_mema=0; 
		if(state2==4 && menu2==4 && temp_memb==4) temp_memb=0;
		//------------------- 临时时间继电器
		time_temp_delay--;
		if(time_temp_delay>9) time_temp_delay=9;
		if(time_temp_delay==5)dely1=1;
		if(time_temp_delay==0){dely1=0;time_temp_delay=9;}  
		//-------------------
	}
	if(mcstoptime_a>0)mcstoptime_a--;
	if(mcstoptime_b>0)mcstoptime_b--;
	AUXR=mem_inn;
}
/**************************************************************************
*   功能:累计并保存数据a
***************************************************************************/
void sum_a(void)
{	uint  add;
	void  *pt;
	if(gun1.pulse>disp_floor_level_a)
	{
		gun1.sum_liter+=gun1.liter;
		gun1.sum_sale+=gun1.sale;
		gun1.work_liter+=gun1.liter;
		gun1.work_sale+=gun1.sale;
	   //----------------------
		pt=&invoice_number;
	    readbyteseq(506,pt,4);
	    invoice_number++;
		gun1.ppu=invoice_number;
	    writebyteseq(506,pt,4);
		 //------------------------
		pt=&gun1;
		writebyteseq(0x01,pt,37);  //写EEPROM
		/////////////////////////////////////
		temp_mema=readbyte(0);
		temp_mema++;
		if(temp_mema<0) temp_mema=0;
		if(temp_mema>9) temp_mema=0;   //共10条记录
		writebyte(0,temp_mema);
		add=temp_mema*10+101;  //记录地址从:101开始-->144
		pt=&(gun1.liter);
		writebyteseq(add,pt,8);  //写加油记录
		add+=8;  
		pt=&price_a;
		writebyteseq(add,pt,2);
		Get1302();
		if(printermode_a==0)print_proof(0);   //打印加油票据A
		accumulative_total_list_a();  //累计转换至列表a
	}
}
/**************************************************************************
*   功能:累计并保存数据b   [ok]
***************************************************************************/
void sum_b(void)
{	uint  add;
	void  *pt;	
	if(gun2.pulse>disp_floor_level_b)
	{
		gun2.sum_liter+=gun2.liter;
		gun2.sum_sale+=gun2.sale;
		gun2.work_liter+=gun2.liter;
		gun2.work_sale+=gun2.sale;
	   //-----------------------
		pt=&invoice_number;
	    readbyteseq(506,pt,4);
	    invoice_number++;
		gun2.ppu=invoice_number;
	    writebyteseq(506,pt,4);
		 //--------------------------
		pt=&gun2;
		writebyteseq(38,pt,37);  //写EEPROM
		/////////////////////////////////////
		temp_memb=readbyte(300);
		temp_memb++;
		if(temp_memb<0) temp_memb=0;
		if(temp_memb>9) temp_memb=0;   //共10条记录
		writebyte(0+300,temp_memb);
		add=temp_memb*10+301;  //记录地址从:101+300开始-->144+300
		pt=&(gun2.liter);
		writebyteseq(add,pt,8);  //写加油记录
		add+=8;  
		pt=&price_b;
		writebyteseq(add,pt,2); 
		Get1302();
		if(printermode_b==0)print_proof(1);   //打印加油票据B
		accumulative_total_list_b();  //累计转换至列表b
	}
}
/***************************************************************************
*   功能: 工作面A计量处理
****************************************************************************/
void workajl(void)
{  if(update_worka)
	{	update_worka=0;
		if(jl1s>0)     
		{
			while  (jl1s>0)
			{  gun1.pulse+=1;
				jl1s--;
				gun1.pulse_jsq++;
			   if (gun1.pulse_jsq==120) {	gun1.pulse_jsq=0;jsq1out=1;} //通知计数器
				updatea=1;save_oka=1;idle_numa=0;
			}
		}
		else
		{
			if(state1!=1  || !INT0)  //if(state1==0  || !INT0)  2006-07-11
			{
				if(idle_numa<20)idle_numa++;				
				if(ration_a && (idle_numa>3))  //定量加油完毕
				{  ration_a=0;
				   save_oka=1;idle_numa=20;
					if(ration_mode_a)gun1.liter=ration_num_a;
					else gun1.sale=ration_num_a;
					disp_key_clear_a();
					updatea=1;
				}	
				if(idle_numa==20 && save_oka){save_oka=0;sum_a();}  //累計
			}
			else idle_numa=0;
		}
		
	}	
}


/***************************************************************************
*   功能: 工作面B计量处理   [ok]
****************************************************************************/
void workaj2(void)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -