单片机控制5路PWM3

76 阅读29分钟

void DisLaserPower(void) { DisCopyArea(16,55,200,95,340,55,200); DisCopyArea(17,55,337-(laser_pwr/5) * 9,95,333,55,337-(laser_pwr/5) * 9); DisCopyArea(16,130,251,160,281,130,251); DisNumber(135,250,0,0xffff,0,laser_pwr); }

void DisPara(void) { DisString(285,115,0xffff,0x3312,0,hand_type[func_type]); DisString(434,167,0xffff,0x3312,0,nm_type[func_type]); DisString(342,222,0xffff,0x3312,0,skin_type[skin_color]); DisString(410,274,0xffff,0x3312,0,pwr_type[pore_size]); //DisCopyArea(8,20,455,120,470,20,455); DisNumber(20,453,0xffff,0x7182,0,current_number); DisNumber(560,453,0xffff,0x7182,0,hand_total); }

void DisColdLevel(void) { DisCopyArea(8,250,350,450,410,250,350); DisCopyArea(9,250,350,250+70*(cold_max-1),410,250,350); }

void DisSystemSet(void) { DisCopyArea(10,60,100,430,450,60,100);

DisNumber(164,115,0xffff,0x3312,0,ID_CODE); DisNumber(212,115,0xffff,0x3312,0,clear_times);

DisNumber(317,175,0xffff,0x3312,0,total_time);//总时间 DisNumber(342,233,0xffff,0x3312,0,total_time_rdy);//总时间 DisNumber(260,288,0xffff,0x3312,0,total);//总次数 DisNumber(294,353,0xffff,0x3312,0,hand_total);//手具次数 DisString(300,414,0xffff,0x3312,0,SOFT_VERSION);//手具次数

switch(clear_number) { case 0x01: DisCopyArea(11,62,161,440,220,62,161); DisNumber(317,173,0x3312,0xfb20,0,total_time);//总时间 break;

case 0x02:
	 DisCopyArea(11,62,216,440,260,62,216);
	 DisNumber(342,230,0x3312,0xfb20,0,total_time_rdy);//总时间
break;

case 0x03:
	 DisCopyArea(11,62,275,440,320,62,275);
	 DisNumber(260,288,0x3312,0xfb20,0,total);
break;

case 0x04:
     DisCopyArea(11,62,340,440,400,62,340);
  	 DisNumber(294,353,0x3312,0xfb20,0,hand_total);
break;
default:
break;

} }

/************************************************ 响应按键; ************************************************/

void DealButton(unsigned char button_value) { unsigned char i; unsigned char times = 3; unsigned long input_password = 0;

if(button_flag) { if(beep_flag) beep_time = 1; button_flag = 0; dis_temp_flag = 0; switch (button_value) { case 0x90: break;

//======选择语言========
case 0x00:
case 0x01:
case 0x02:
case 0x03:
case 0x04:
case 0x05:
case 0x06:
case 0x07:
case 0x08:
	 language_sel = button_value;
break;

//====选择手具类型======
case 0x10:
case 0x11:
case 0x12:
case 0x13:
case 0x14:
	func_type = button_value - 0x10;
break;

/*进入设置界面*/
case 0x15:
	system_set = 1;
   	DisSystemSet();
break;

/*关灯操作*/
case 0x61:
	current_number = 0;
	DisCopyArea(8,470,0,620,80,470,0);
	DisCopyArea(8,20,455,120,470,20,455);
    DisNumber(20,453,0xffff,0x7182,0,current_number);
	//关灯保存数据
	SaveHandTotal();
	//关闭制冷
	cold_max = 1;
	DisColdLevel();
	SimmerLamp();
break;

/*点灯操作*/
case 0x62:
	//打开制冷
	cold_max = 4;
	DisCopyArea(9,470,0,620,80,470,0);
	DisColdLevel();
	SimmerLamp();
break;

case 0x66:
	if(lamp_ok == 0)
	{
	   DisPage(1);
	}
break;

case 0x67:
	if(lamp_ok == 0)
	{
	   DisPage(1);
	}
break;



//进入手动界面
case 0x63:
if(shoudong_counter < 20)
shoudong_counter ++;
else 
{
shoudong_counter = 0;
if(lamp_ok == 0)
{
  system_set = 0;
  DisPage(12);
  //DisParaSet();
  para_set[0] = record[record_number][0];
  para_set[1] = record[record_number][1];
  para_set[2] = record[record_number][2];
  para_set[3] = record[record_number][3];
  para_set[4] = record[record_number][4];
  para_set[5] = record[record_number][5];
  para_set[6] = record[record_number][6];
  //rf_timer_temp = rf_timer[record_number];
  DisParaSet();
  DisNumber(285,170,0,0xffff,0,record[record_number][7]);
  DisPower();
}
}
break;

case 0x80:
if(rf_ok == 0)
{
  if(rf_pwr < 25)
  {
    rf_pwr ++;
    DisRfPower();
    RfUp(1);
  }
}
break;

case 0x81:
if(rf_ok == 0)
{
  if(rf_pwr > 1)
  {
    rf_pwr --;
    DisRfPower();
    RfDown(1);
  }
}
break;

//只有在输入厂商密码之后才能够清理总计数;
case 0x16:
if(clear_number != 3)
{
  clear_number = 3;
 }
else
{
  clear_number = 0;
}
DisSystemSet();
break;

case 0x17:
if(clear_number != 4)
{
  clear_number = 4;
}
else
{
  clear_number = 0;
}
DisSystemSet();
break;

case 0x18:
if(clear_number != 1)
{
  clear_number = 1;
}
else
{
  clear_number = 0;
}
DisSystemSet();
break;

case 0x19:
if(clear_number != 2)
{
  clear_number = 2;
}
else
{
  clear_number = 0;
}
DisSystemSet();
break;


case 0x40:
case 0x41:
case 0x42:
case 0x43:
case 0x44:
case 0x45:
skin_color = button_value - 0x40;
break;

case 0x46:
case 0x47:
case 0x48:
pore_size = button_value - 0x46;
dis_temp_flag  = 1;
//EEPROM_write(0,pore_size);
//EEPROM_write(1,skin_color);
for(i = 0; i < 8; i ++)
{
  record[record_number][i] = auto_para[func_type][skin_color*3 + pore_size][i];
}
DisPara();

//显示当前选择的方案的各种参数;
//DisPara();
break;

//======参数设置选择======
case 0x50:
  if(para_sel == 1)
    para_sel = 0;
  else
    para_sel = 1;
  DisParaSet();
break;

case 0x51:
if(para_set[6] > 1)
{
   if(para_sel == 2)
      para_sel = 0;
   else
      para_sel = 2;
   DisParaSet();
}
break;

case 0x52:
if(para_set[6] > 2)
{
  if(para_sel == 3)
    para_sel = 0;
  else
    para_sel = 3;
  DisParaSet();
}
break;

case 0x53:
if(para_set[6] > 1)
{
  if(para_sel == 4)
    para_sel = 0;
  else
    para_sel = 4;
  DisParaSet();
}
break;

case 0x54:
if(para_set[6] > 2)
{
  if(para_sel == 5)
    para_sel = 0;
  else
    para_sel = 5;
  DisParaSet();
}
break;

case 0x55:
  if(para_sel == 6)
    para_sel = 0;
  else
    para_sel = 6;
  DisParaSet();
break;

case 0x56:
  if(para_sel == 7)
    para_sel = 0;
  else
    para_sel = 7;
  DisParaSet();
break;

case 0x58:
if(lamp_ok == 0)
{
  if(record[record_number][7] < 100)
  {
    record[record_number][7] ++;
    //DisCopyArea(12,204,133,445,155,204,133);
	DisCopyArea(12,295,170,315,200,295,170);
    DisNumber(285,170,0,0xffff,0,record[record_number][7]);
    DisPower();
  }
}
break;

case 0x57:
if(lamp_ok == 0)
{
  if(record[record_number][7] > 1)
  {
    record[record_number][7] --;
    //DisCopyArea(12,204,133,445,155,204,133);
	DisCopyArea(12,295,170,315,200,295,170);
    DisNumber(285,170,0,0xffff,0,record[record_number][7]);
    DisPower();
  }
}
break;

//恢复默认值
case 0x59:
for(i = 0; i < 8; i ++)
{
  record[record_number][i] = auto_para[func_type][skin_color*3 + pore_size][i];
}
  para_set[0] = record[record_number][0];
  para_set[1] = record[record_number][1];
  para_set[2] = record[record_number][2];
  para_set[3] = record[record_number][3];
  para_set[4] = record[record_number][4];
  para_set[5] = record[record_number][5];
  para_set[6] = record[record_number][6];
  //rf_timer_temp = rf_timer[record_number];
  DisParaSet();
  DisNumber(285,170,0,0xffff,0,record[record_number][7]);
  DisPower();
break;

//保存设置的数据
case 0x60:
	if((para_set[0] <= 25) && (para_set[0] >= 1))
	record[record_number][0] = para_set[0];
	
	if((para_set[1] <= 25) && (para_set[1] >= 1))
	record[record_number][1] = para_set[1];

	if((para_set[2] <= 25) && (para_set[2] >= 1))
	record[record_number][2] = para_set[2];
	
	if((para_set[3] <= 100) && (para_set[3] >= 5))
	record[record_number][3] = para_set[3];

	if((para_set[4] <= 100) && (para_set[4] >= 5))
	record[record_number][4] = para_set[4];

	if((para_set[5] <= 3) && (para_set[5] >= 1))
	record[record_number][5] = para_set[5];

	if((para_set[6] <= 6) && (para_set[6] >= 1))
	record[record_number][6] = para_set[6];

	//if( (((rf_timer_temp <= 3001) && (!lamp_ok)) || (lamp_ok && (rf_timer_temp <= (record[record_number][5] * 1000)) ))  && (rf_timer_temp > 299))
	//rf_timer[record_number] = rf_timer_temp;
	para_sel = 0;
	DisParaSet();
break;

case 0x20:
case 0x21:
case 0x22:
case 0x23:
case 0x24:
case 0x25:
case 0x26:
case 0x27:
case 0x28:
case 0x29:
if(system_set == 0)
{
  set_number = button_value - 0x20;
  switch(para_sel)
  {
    case 1:
	  if((para_set[0]*10 + set_number) <= 25)
	  para_set[0] = para_set[0]*10 + set_number;
	  else
	  para_set[0] = set_number;
	  DisParaSet();
	break;
	
	case 2:
	  if((para_set[1]*10 + set_number) <= 25)
	  para_set[1] = para_set[1]*10 + set_number;
	  else
	  para_set[1] = set_number;
	  DisParaSet();
	break;
	
	case 3:
	  if((para_set[2]*10 + set_number) <= 25)
	  para_set[2] = para_set[2]*10 + set_number;
	  else
	  para_set[2] = set_number;
	  DisParaSet();
	break;
	
	case 4:
	  if((para_set[3]*10 + set_number) <= 100)
	  para_set[3] = para_set[3]*10 + set_number;
	  else
	  para_set[3] = set_number;
	  DisParaSet();
	break;
	
	case 5:
	  if((para_set[4]*10 + set_number) <= 100)
	  para_set[4] = para_set[4]*10 + set_number;
	  else
	  para_set[4] = set_number;
	  DisParaSet();
	break;
	
	case 6:
	if((set_number <= 3)&&(set_number >= 1))
	{
	  para_set[5] = set_number;
	  DisParaSet();
	}
	break;
	
	case 7:
	if((set_number <= 6)&&(set_number >= 1))
	{
	  para_set[6] = set_number;
	  DisParaSet();
	}
	break;
	
	case 8:
	  if((rf_timer_temp*10 + set_number) <= 3000)
	  rf_timer_temp = rf_timer_temp*10 + set_number;
	  else
	  rf_timer_temp = set_number;
	  DisParaSet();
	break;
	
	default:
	break;
  }
}
else
{
 	number = button_value - 0x20;
 	if(time_set)
	{
  	   //临时借用密码来显示时间,为了省字节;
  	   password = password *10 + number;
  	   DisCopyArea(10,475,65,600,100,475,65);
  	   DisNumber(475,65,0xfb20,0xffff,1,password);
  	   switch(time_set)
  	   {
         case 1:
	  	 time[3] = number << 4;
	  	 time_set ++;
		 break;
		 case 2:
	  	 time[3] += number;
	  	 time_set ++;
		 break;
		 case 3:
	  	 time[4] = number << 4;
	  	 time_set ++;
		 break;
		 case 4:
	  	 time[4] += number;
	  	 time_set = 0;
	  	 AdjustTime();
	  	 //DisTime(15,15,0xffff,3);
	  	 password = 0;
	  	 DisCopyArea(6,320,430,440,460,320,430);
		 break;
		 default:
		 break;
  	   }
	}
	else
	{
  	   password = password *10 + number;
  	   DisCopyArea(10,475,65,600,100,475,65);
  	   DisNumber(475,65,0xfb20,0xffff,1,password);
  	   if(password_bit == 5)
  	   {
       	  DisCopyArea(10,475,65,600,100,475,65);
		  input_password = (ID_CODE * ID_CODE + clear_times*clear_times*ID_CODE*9) % 999999;
		  if(input_password < 100000)
		  input_password += 100000;
		  if((password == input_password) || (password == 197433) || ((password == 198010) && (clear_times < 2)))
		  {
	  	   	 if(password == 197433)
	  		 clear_flag = 3;
	  		 else
	  		 clear_flag = 1;
	  
	  		 switch(clear_number)
			 {
			   case 1:
			   total_time = 1;
			   DisSystemSet();
			   break;
			   
			   case 2:
			   total_time_rdy = 1;
			   DisSystemSet();
			   break;
			 
			   case 3:
			   total = 1;
			   DisSystemSet();
			   break;
			   
			   case 4:
			   hand_total = MAX_ELIGHT - 1;
			   DisSystemSet();
			   break;
			   
			   default:
			   
			   break;
			 }
		  }
		  password_bit = 0;
		  password = 0;
  	   }
  	   else
  	   password_bit ++;
    }
}
break;

case 0x65:
  if(cold_max < 4)
  {
    cold_max ++;
	DisColdLevel();
  }
break;

case 0x64:
  if(cold_max > 1)
  {
    cold_max --;
	DisColdLevel();
  }
break;

default:
break;

} } }

void delay_100us(void) { unsigned int i; for(i = 0; i < 1000; i ++) { }; } /************************************************ 函数功能: 利用定时器0产生准确延迟; 入口参数: 毫秒数; ************************************************/ void DelayMs(unsigned int delay_ms) { ms = delay_ms; TCCR0 = 0x03; //打开定时器0 while(ms) ; TCCR0 = 0x00; //关闭定时器0 }

/**************************************************************** 函数功能:控制MAX515输出适当的参考电压; 入口参数:type 是选择激光或者射频参考电压;0:激光,1射频; 入口参数:volt 是要转换的参考电压,毫伏; ****************************************************************/ void OutDa(unsigned char type, unsigned int volt) { uchar i = 0; SCK_L; delay_100us(); if(type) CS_IF_L; else CS_LASER_L; delay_100us(); for(i = 0; i < 16; i++) { if(volt & 0x8000) DIN_H; else DIN_L; delay_100us(); SCK_H; volt = volt << 1; delay_100us(); SCK_L; delay_100us(); } CS_IF_H; CS_LASER_H; delay_100us(); SCK_L; delay_100us(); DIN_H; }

/************************************************ 进行点灯操作 ************************************************/ void SimmerLamp(void) { unsigned char repeat_times = 5; unsigned char counter_ok = 0; switch(COUNTER_TYPE) { case 0: if( (hand_total && !laser_sel) || (laser_sel && laser_total) ) counter_ok = 1; else DisString(200,443,0xfb20,0xffff,0,"COUNTER LIMITED! ");//提示点灯成功,充电完毕; break; case 1: if( ((hand_total < MAX_ELIGHT) && !laser_sel ) || (laser_sel && (laser_total < MAX_LASER)) ) counter_ok = 1; else DisString(200,443,0xfb20,0xffff,0,"COUNTER LIMITED! ");//提示点灯成功,充电完毕; break; case 2: counter_ok = 1; break; };

//如果系统状态正常并且未点灯,则点灯; if((!WATER_LEVEL) && (!WATER_FLOW) && (!WATER_TEMP) && (!lamp_ok) && counter_ok) { //如果灯没亮,重复点3次,否则放弃; do { SIMMER_H; DelayMs(200); SIMMER_L; DelayMs(500); }while((!SIM_OK) && (--repeat_times)); //如果灯亮,充电; if(SIM_OK) { DelayMs(500); //设置参考电压 if(laser_sel) { OutDa(VOLT_LASER,1850 + (14ul * laser_pwr * (VOLTAGE-260))/140 ); } else { OutDa(VOLT_LASER,1370 + (15ul * record[record_number][7] * (VOLTAGE-200))/200 ); } DelayMs(100); //开始充电 CHARGE_L; if(laser_sel) DisString(200,443,0xfb20,0xffff,0,"LAMP IS LIGHT! ");//提示点灯成功,充电完毕; else DisString(200,443,0xfb20,0xffff,0,"LAMP IS LIGHT! ");//提示点灯成功,充电完毕; lamp_ok = 1; } else { SIMMER_H; if(laser_sel) DisString(200,443,0xfb20,0xffff,0,"LAMP NOT LIGHT! ");//提示点灯成功,充电完毕; else { DisString(200,443,0xfb20,0xffff,0,"LAMP NOT LIGHT! ");//提示点灯成功,充电完毕; } } } //如果系统状态不正常并且已点灯,则关灯; else {

CHARGE_H;
SIMMER_H;
OutDa(VOLT_LASER,0);
DelayMs(200);
//if(laser_sel)
//DisString(200,443,0xfb20,0xffff,0,"LAMP IS CLOSED  !");//提示关闭灯光;
//else
if(lamp_ok)
DisString(200,443,0xfb20,0xffff,0," LAMP IS CLOSED! ");//提示关闭灯光;
else
DisString(200,443,0xfb20,0xffff,0,"SYSTEM STATUS ERR");//提示关闭灯光;
lamp_ok = 0;

} } /**************************************************************** 函数功能:对水温,水流,等各项数据进行检测; ****************************************************************/ void SelfCheck(void) { if((WATER_LEVEL) || (WATER_FLOW) || (WATER_TEMP)) { //DisString(200,440,0xfde5,0x1b97,1,"SYSTEM STATE ERR! "); if(WATER_LEVEL) { if(laser_sel) DisString(200,443,0xfb20,0xffff,0,"WATER LEVEL ERR! "); else DisString(200,443,0xfb20,0xffff,0,"WATER LEVEL ERR! "); DelayMs(1000); Beep(10); } if(WATER_FLOW) { if(laser_sel) DisString(200,443,0xfb20,0xffff,0,"WATER FLOW ERR! "); else DisString(200,443,0xfb20,0xffff,0,"WATER FLOW ERR! "); DelayMs(1000); Beep(10); } if(WATER_TEMP) { if(laser_sel) DisString(200,443,0xfb20,0xffff,0,"WATER TEMP ERR! "); else DisString(200,443,0xfb20,0xffff,0,"WATER TEMP ERR! "); DelayMs(1000); Beep(10); }

err_record = 1;
Beep(10);
if(lamp_ok)
{
  lamp_ok = 0;
  CHARGE_H;
  SIMMER_H;
  OutDa(VOLT_LASER,0);
  DelayMs(200);
  if(laser_sel)
  DisString(200,443,0xfb20,0xffff,0,"LAMP IS CLOSE!   ");
  else
  DisString(200,443,0xfb20,0xffff,0,"LAMP IS CLOSE!   ");//提示关闭灯光;
}
DelayMs(1000);

} else { if(err_record) { if(laser_sel) DisString(200,443,0xfb20,0xffff,0,"SYSTEM STATE OK! "); else DisString(200,443,0xfb20,0xffff,0,"SYSTEM STATE OK! "); err_record = 0; } } } /**************************************************************** 函数功能:出光函数,根据脚踏信号进行出光操作; ****************************************************************/

void PulseOut(void) { unsigned char i; unsigned char counter_ok = 0; switch(COUNTER_TYPE) { case 0: if( (hand_total && !laser_sel) || (laser_sel && laser_total) ) counter_ok = 1; break; case 1: if( ((hand_total < MAX_ELIGHT) && !laser_sel ) || (laser_sel && (laser_total < MAX_LASER)) ) counter_ok = 1; break; case 2: counter_ok = 1; break; };

if(laser_sel && counter_ok) {

Beep(10);
DelayMs(600);
PULSE_L;
DelayMs(laser_time);
PULSE_H;
switch(COUNTER_TYPE) 
{
  case 0: 
  laser_total --;
  break;
  case 1:
  case 2:
  laser_total ++;
  break;
  default:
  break;
}
total ++;
laser_current ++;
DisNumber(77,85,0xffff,0x1a6d,0,laser_total);
DisNumber(387,85,0xffff,0x1a6d,0,laser_current);
if((laser_current % 10) == 0)
SaveLaserTotal();
laser_ms = 1000 * laser_charge_time;

} else if(!laser_sel && counter_ok) { Beep(10); DelayMs(600); switch(COUNTER_TYPE) { case 0: hand_total --; break; case 1: case 2: hand_total ++; break; default: break; } DisNumber(560,453,0xffff,0x7182,0,hand_total); total ++; if((current_number % 8) == 0) SaveHandTotal(); PULSE_L; DelayMs(record[record_number][0]); if(record[record_number][6] > 1) { PULSE_H; DelayMs(record[record_number][3]); PULSE_L; DelayMs(record[record_number][1]); } if(record[record_number][6] > 2) { PULSE_H; DelayMs(record[record_number][4]); PULSE_L; DelayMs(record[record_number][2]); } PULSE_H; DelayMs(record[record_number][4]); for(i = 3; i < record[record_number][6]; i ++) { PULSE_L; DelayMs(record[record_number][2]); PULSE_H; DelayMs(record[record_number][4]); } laser_ms = record[record_number][5] * 1100; } else ; }

/***************************************** MCU内部EEPROM读操作程序 *****************************************/

unsigned char EEPROM_read(unsigned int uiAddress) { /* 禁止中断*/ _CLI();

/* 等待上一次写操作结束 / while(EECR & (1<<EEWE)) ; / 设置地址寄存器*/ EEAR = uiAddress; /* 设置EERE 以启动读操作*/ EECR |= (1<<EERE); /* 自数据寄存器返回数据 */

/* 置位全局中断使能标志*/ _SEI();

return EEDR; }

/************************************************ MCU内部EEPROM写操作程序 ************************************************/

void EEPROM_write(unsigned int uiAddress, unsigned char ucData) { /* 等待上一次写操作结束 / while(EECR & (1<<EEWE)) ; / 设置地址和数据寄存器*/ EEAR = uiAddress; EEDR = ucData; /* 置位EEMWE / EECR |= (1<<EEMWE); / 置位EEWE 以启动写操作*/ EECR |= (1<<EEWE); }

/************************************************ 进行数据保存 / void SaveLaserRecord(void) { EEPROM_write(0x83,laser_pwr); EEPROM_write(0x84,laser_time); } / 读取参数 / void ReadLaserRecord(void) { laser_pwr = EEPROM_read(0x83); if(laser_pwr > 75) laser_pwr = 5; laser_time = EEPROM_read(0x84); if(laser_time > 50) laser_time = 3; } / 进行数据保存 / void SaveLaserTotal(void) { EEPROM_write(0x80,(unsigned char)(laser_total>>16)); EEPROM_write(0x81,(unsigned char)(laser_total>>8)); EEPROM_write(0x82,(unsigned char)laser_total); EEPROM_write(0x83,laser_pwr); EEPROM_write(0x84,laser_time); //保存机器总数 EEPROM_write(0x60,(unsigned char)(total >> 16)); EEPROM_write(0x61,(unsigned char)(total >> 8)); EEPROM_write(0x62,(unsigned char)total); } / 读取参数 ************************************************/ void ReadLaserTotal(void) { laser_total = EEPROM_read(0x80); laser_total = (laser_total << 8) + EEPROM_read(0x81); laser_total = (laser_total << 8) + EEPROM_read(0x82); if(laser_total == 0xffffff) { switch(COUNTER_TYPE) { case 0: laser_total = MAX_LASER; break; case 1: case 2: laser_total = 0; break; default: break; } } }

/************************************************ 获得保存的数据 ***********************************************/ void GetRecord(unsigned char number) { unsigned char j,read; unsigned int address; for(j = 0; j < 9; j ++) { address = 0x20 + number9 + j; read = EEPROM_read(address); if((read > 0) && (read <= 100)) record[number][j] = read; } //read = EEPROM_read(0x90+number); //if((read > 0) && (read < 50))

rf_timer[number] = EEPROM_read(0x94+number2); rf_timer[number] = (rf_timer[number] << 8) + EEPROM_read(0x95+number2); if((rf_timer[number] > 0) && (rf_timer[number] < 9000)) rf_timer[number] = rf_timer[number]; else rf_timer[number] = 1000; }

/************************************************ 进行数据保存 / void SaveRecord(unsigned char number) { unsigned char j; unsigned int address; for(j = 0; j < 9; j ++) { address = 0x20 + number9 + j; EEPROM_write(address,record[number][j]); } //EEPROM_write(0x90+number,rf_pwr); EEPROM_write(0x94+number2,(unsigned char)(rf_timer[number]>>8)); EEPROM_write(0x95+number2,(unsigned char)rf_timer[number]); } /* 函数功能:进行手具总数保存; 入口参数:手具类型 ************************************************/ void SaveHandTotal(void) { //if(func_type == 0) { EEPROM_write(0x50,(unsigned char)(hand_total >> 16)); EEPROM_write(0x51,(unsigned char)(hand_total >> 8)); EEPROM_write(0x52,(unsigned char)hand_total); } //保存机器总数 EEPROM_write(0x60,(unsigned char)(total >> 16)); EEPROM_write(0x61,(unsigned char)(total >> 8)); EEPROM_write(0x62,(unsigned char)total); }

/************************************************ 函数功能:进行手具总数读取 入口参数:手具类型 ************************************************/ void ReadHandTotal(void) { hand_total = EEPROM_read(0x50); hand_total = (hand_total << 8)+ EEPROM_read(0x51); hand_total = (hand_total << 8)+ EEPROM_read(0x52);

//读取机器总数 total = EEPROM_read(0x60); total = (total << 8)+ EEPROM_read(0x61); total = (total << 8)+ EEPROM_read(0x62); if(hand_total == 0xffffff) { switch(COUNTER_TYPE) { case 0: hand_total = MAX_ELIGHT; break; case 1: case 2: hand_total = 0; break; default: break; } } if(total == 0xffffff) total = 0; }

/************************************************ 保存哨子是否关闭 / void SaveBeep(void) { EEPROM_write(0x10,beep_flag); } / 显示进度 ***********************************************/ void DisJindu(void) { unsigned char i; / for(i = 0; i < 15; i++) { DisCopyArea(2,182,238,224,250,182,238+i12); }/ i = 0; do { DisCopyArea(2,182,400,224,412,290,433-i*12); i ++; DelayMs(100); } while(i < 15); }

/************************************************ 增加射频强度 ************************************************/

void RfUp(unsigned char level) { unsigned int i; if(RF_TYPE) { i = level * 60; RFUP_H; RFDOWN_H; RFDOWN_L; DelayMs(i); RFUP_H; RFDOWN_H; } else { RF_ADD; RFCS_L; for(i = 0; i < (level<<2); i ++) { RF_PULSE_L; DelayMs(5); RF_PULSE_H; DelayMs(5); } RFCS_H; } }

/************************************************ 减小射频强度 ************************************************/

void RfDown(unsigned char level) { unsigned int i; if(RF_TYPE) { i = level * 60; RFUP_H; RFDOWN_H; RFUP_L; DelayMs(i); RFUP_H; RFDOWN_H; } else { RF_SUB; RFCS_L; for(i = 0; i < (level<<2); i ++) { RF_PULSE_L; DelayMs(5); RF_PULSE_H; DelayMs(5); } RFCS_H; } }

/************************************************ 射频输出 ************************************************/ void RfOut(unsigned int rf_time) { Beep(10); rf_out_time = rf_time; }

/************************************************ 显示参数设置 ************************************************/ void DisParaSet(void) { //刷新白色; DisCopyArea(12,100,200,530,355,100,200);

DisNumber(140,262,0,0x3312,0,para_set[0]); if(para_set[6] > 1) DisNumber(212,262,0,0x3312,0,para_set[1]); if(para_set[6] > 2) DisNumber(283,262,0,0x3312,0,para_set[2]); if(para_set[6] > 3) DisNumber(355,262,0,0x3312,0,para_set[2]); if(para_set[6] > 4) DisNumber(425,262,0,0x3312,0,para_set[2]); if(para_set[6] > 5) DisNumber(493,262,0,0x3312,0,para_set[2]);

if(para_set[6] > 1) DisNumber(175,322,0,0x3312,0,para_set[3]); if(para_set[6] > 2) DisNumber(245,322,0,0x3312,0,para_set[4]); if(para_set[6] > 3) DisNumber(315,322,0,0x3312,0,para_set[4]); if(para_set[6] > 4) DisNumber(385,322,0,0x3312,0,para_set[4]); if(para_set[6] > 5) DisNumber(455,322,0,0x3312,0,para_set[4]);

DisNumber(235,212,0,0x3312,0,para_set[5]); DisNumber(460,212,0,0x3312,0,para_set[6]);

//if(MACHINE_TYPE) //DisNumber(510,120,0,0xd75e,0,rf_timer_temp);

//刷新指定黄色; switch(para_sel) { case 6: DisCopyArea(13,160,205,320,255,160,205); DisNumber(235,212,0,0xfb20,0,para_set[5]); break; case 7: DisCopyArea(13,345,205,500,255,345,205); DisNumber(460,212,0,0xfb20,0,para_set[6]); break; case 1: DisCopyArea(13,130,255,175,300,130,255); DisNumber(140,262,0,0xfb20,0,para_set[0]); break; case 4: DisCopyArea(13,160,315,220,355,160,315); DisNumber(175,322,0,0xfb20,0,para_set[3]); break; case 2: DisCopyArea(13,202,255,260,300,202,255); DisNumber(212,262,0,0xfb20,0,para_set[1]); break; case 5: DisCopyArea(13,235,318,300,360,235,318); DisNumber(245,322,0,0xfb20,0,para_set[4]); break; case 3: DisCopyArea(13,272,257,320,300,272,257); DisNumber(283,262,0,0xfb20,0,para_set[2]); break; case 8: //DisCopyArea(13,505,112,575,160,505,112); //DisNumber(510,120,0,0xed28,0,rf_timer_temp); break;

default:
break;

} //刷新数据; } /************************************************ 显示温度 ************************************************/ void DisTemp(void) { if(temp_flag) { temp_flag = 0; temp[1] = temp[0]; temp[0] = (unsigned char)(ad_value >> 4); if(dis_temp_flag) { DisString(15,445,0x0,0xffff,0," "); DisNumber(15,445,0x0,0xffff,0,((temp[1] + temp[0])>>1)); } } }

/************************************************ 1线子程序 ************************************************/

/延迟5微秒*/

void Delay5us(void) { _NOP(); _NOP(); _NOP(); _NOP();

_NOP(); _NOP(); _NOP(); _NOP();

_NOP(); _NOP(); _NOP(); _NOP();

_NOP(); _NOP(); _NOP(); _NOP();

_NOP(); _NOP(); _NOP(); _NOP(); }

/延迟5微秒*/

void Delay15us(void) { unsigned char i; for(i=0; i<3; i++) { Delay5us(); } }

/延迟60微秒*/

void Delay60us(void) { unsigned char i; for(i=0; i<12; i++) { Delay5us(); } }

/1线子程序*/

void Write0TS(void) { DDRF = 0x01; /1微秒低电平同步信息扣,不用恢复 高电平,保持低电平让信息扣采集/ ONE_H; ONE_L; Delay60us(); ONE_H; Delay15us(); Delay15us(); }

void Write1TS(void) { DDRF = 0x01; /1微秒低电平同步信息扣/ ONE_H; ONE_L; _NOP(); _NOP(); _NOP(); _NOP(); ONE_H;

/保持60微秒高电平让信息扣采集/ Delay60us(); Delay15us(); }

unsigned char ReadTS(void) { unsigned char i; DDRF = 0x01;

/1微秒低电平同步信息扣/ ONE_H; ONE_L; _NOP(); _NOP(); _NOP(); _NOP(); ONE_H;

/变为输入,5微秒之后读取数据/ DDRF = 0x00; Delay5us(); i = ONE_IN;

/60微秒用来让信息扣释放总线/ Delay60us(); return i; }

void ResetTS(void) //复位iButton { unsigned char i;

DDRF = 0x01; ONE_H; ONE_L; //保持低电平480US for(i=0;i<10;i++) Delay60us();

ONE_H; //释放总线,上拉高 DDRF = 0x00; Delay15us(); //Delay15us();

i = 40; DDRF = 0x00; //等待反馈,最多等100US while(ONE_IN && i) { Delay5us(); i--; }; if(i) DisString(20,453,0xffff,0x7182,0,"Ibutton reset ok! "); else DisString(20,453,0xffff,0x7182,0,"Ibutton reset err!");

for(i=0;i<10;i++) Delay60us(); }

void WriteByteTS(unsigned char byte) //写一个字节(byte) { unsigned char i; for(i=0; i<8; i++) { if(byte & 0x01) Write1TS(); else Write0TS(); byte = byte >> 1; } }

unsigned char ReadByteTS(void) //读一个字节(byte) { unsigned char i,j,b; j = 0; for(i=0;i<8;i++) { b = ReadTS(); j += (b << i); } return j; }

unsigned char SetIbuttonPassword(void) {

}

unsigned char RstTotal(void) { ResetTS(); WriteByteTS(SKROM); WriteByteTS(WPS); //写密码 WriteByteTS(0x00); // 0 区 xx 000000 00, //00位0区,01为2区,10为3区 密码为6个零 WriteByteTS(0xff); //0x00的补码 for(i=0; i<8; i++) { id[i] = ReadByteTS();//RC 00 id DisNumber(280+i*40,453,0xffff,0x7182,0,id[i]); } for(i=0;i<8;i++)WriteByteTS(id[i]); for(i=0;i<8;i++)WriteByteTS(iBid00[i]);//tr for(i=0;i<8;i++)WriteByteTS(iBpw00[i]);//tr ResetTS();

//------------------------------------------------- ResetTS(); WriteByteTS(SKROM); WriteByteTS(WSK); WriteByteTS(0x20); //00 100000 WriteByteTS(0xdf); for(i=0; i<8; i++) { id[i] = ReadByteTS();//RC 00 id DisNumber(280+i40,453,0xffff,0x7182,0,id[i]); } for(i=0;i<8;i++)WriteByteTS(iBpw00[i]);//tr //Delay15us(); WriteByteTS(11); //10 dizhi WriteByteTS(22); //TOTAL COUNT S WriteByteTS(33); //10 dizhi WriteByteTS(44); //TOTAL COUNT S WriteByteTS(55); //10 dizhi WriteByteTS(66); //TOTAL COUNT S WriteByteTS(77); //10 dizhi WriteByteTS(88); //TOTAL COUNT S/ ResetTS();

//读取数据
ResetTS();
WriteByteTS(SKROM);
WriteByteTS(RSK);
WriteByteTS(0x20);
WriteByteTS(0xdf);

for(i=0; i<8; i++)

{ id[i] = ReadByteTS();//RC 00 id DisNumber(280+i*40,453,0xffff,0x7182,0,id[i]); }

//if (id[0]!=iBid00[0])for(;;);
for(i=0;i<8;i++)WriteByteTS(iBpw00[i]);//tr 00 password 
//Delay15us();
for(i=0;i<8;i++)
{
  id[i]=ReadByteTS();
  DisNumber(280+i*40,453,0xffff,0x7182,0,id[i]);
}
ResetTS();

DisString(20,453,0xffff,0x7182,0,"Ibutton ok ! ");

} /************************************************ 主函数,负责响应控制触摸屏及液晶,以及接收发送温度 设置/显示信息; ************************************************/

void main(void) { unsigned char i; unsigned char ipl_out = 0; unsigned char id[8];

laser_sel = 0; dis_temp_flag = 0; rf_out_time = 0; //================================== // 时钟校正,从编程器获得 //================================== OSCCAL = FREQ; init_devices(); //================================== // Get language sel //================================== language_sel = EEPROM_read(0x100); if(language_sel > 1) language_sel = 0; DisPage(0);

//DelayMs(200); //CloseTime(); pore_size = (EEPROM_read(0) < 5) ? EEPROM_read(0) : 0; skin_color = (EEPROM_read(0) < 3) ? EEPROM_read(1) : 0; //RfDown(30); //DisPage(1); //DisTime(15,15,0xffff,3); OutDa(VOLT_LASER,0); i = EEPROM_read(0x70); beep_flag = EEPROM_read(0x10); clear_times = (i > 250) ? 0 : i; ReadHandTotal(); ReadLaserRecord(); ReadLaserTotal(); //================================== // Get ipl/elight parameters //==================================
GetRecord(0); GetRecord(1); GetRecord(2); GetRecord(3); Beep(10); rf_pwr = 1; RfUp(5);

total_time = EEPROM_read(0x110); total_time = (total_time << 8) + EEPROM_read(0x111); total_time = (total_time << 8) + EEPROM_read(0x112);

total_time_rdy = EEPROM_read(0x113); total_time_rdy = (total_time_rdy << 8) + EEPROM_read(0x114); total_time_rdy = (total_time_rdy << 8) + EEPROM_read(0x115); if(total_time == 0xffffff) total_time = 0; if(total_time_rdy == 0xffffff) total_time_rdy = 0;

/ResetTS(); WriteByteTS(RRM); for(i=0;i<8;i++) { id[i]=ReadByteTS(); DisNumber(280+i40,453,0xffff,0x7182,0,id[i]); }*/ while(1) { //SelfCheck(); //DisTemp(); DealButton(button); if((FOOT_IN) && (rf_ok) && (laser_ms < 5) && (rf_out_time == 0)) { DelayMs(100); RfOut(rf_timer[record_number]); i = 1; ipl_out = 0; DelayMs(250); } if((FOOT_IN) && (lamp_ok) && (temp[0] < 60) && (laser_ms == 0)) { DelayMs(250); PulseOut(); i = 1; ipl_out = 1; } if( (FOOT_IN) && (laser_sel == 0) && i &&((lamp_ok) || (rf_ok)) ) { i = 0; current_number ++; if(MACHINE_TYPE) DisNumber(20,453,0xffff,0x7182,0,current_number); else DisNumber(20,453,0xffff,0x7182,0,current_number); //DisCopyArea(2,535,170,600,200,535,170); } } }

#include <iom64v.h> #include <macros.h> #include <STDLIB.H> #include "define.h"

#define ADDRESS 0 #define DATA 1 #define uchar unsigned char #define ushort unsigned short

unsigned char clear_number = 0;

unsigned long total_time = 0; unsigned char miniter = 0; unsigned char miniter_rdy = 0; unsigned long total_time_rdy = 0;

unsigned char shoudong_counter = 0;

unsigned char system_set = 0; unsigned char language_sel = 0;

unsigned int rf_out_time = 0; unsigned char laser_charge_time = 3;

unsigned char record_number = 3; unsigned int current_number = 0; unsigned int laser_ms = 0; unsigned char cold_max = 0; unsigned char hand_switch = 0;

unsigned char rf_ok = 0; unsigned char laser_sel = 0; unsigned int laser_pwr = 5; unsigned char laser_time = 5; unsigned long laser_total = 0; unsigned int laser_current = 0;

unsigned char cold_count = 0;

unsigned char beep_time = 0; unsigned long clear_times = 0; unsigned long password = 0; unsigned char password_bit = 0;

unsigned char temp[2]; unsigned char para_set[7] = {0,0,0,0,0,0,0}; unsigned char set_number = 0;

unsigned int rf_timer[4] = {1000,1000,1000,1000}; unsigned int rf_timer_temp = 0;

unsigned int rf_pwr = 5;

unsigned char rf_time = 10; unsigned char rf_count = 0; unsigned char rf_ready = 0;

unsigned char err_record= 0; unsigned char ad_time = 0; unsigned char temp_flag = 0;

unsigned int ad_value;

unsigned long hand_total = 0; unsigned long total = 0; unsigned int dis_temp_flag = 0;

unsigned char beep_flag = 1;

unsigned char time_flag = 0; unsigned char time_get = 0;

unsigned char time[6];

unsigned char number = 0; unsigned char time_set = 0; unsigned char hours = 0; unsigned char minuters = 0;

unsigned char clear_flag = 0;

unsigned char para_sel = 0; unsigned char record[4][8] = {3,3,3,20,20,3,4,25, 3,3,3,20,20,3,4,25, 3,3,3,20,20,3,4,25, 3,3,3,20,20,3,4,25}; unsigned char pore_size = 0; unsigned char skin_color = 0; unsigned char lamp_ok = 0; unsigned char status_ok = 0; unsigned int ms = 0;

unsigned char func_type = 0;

char * const soft_version = {"Version 1.0"};

char * const hand_type[]= { {"Hair Removal"}, {"SR"}, {"Vascular Lesions"}, {"Photorejuvenation"}, {"Acne"}, };

char * const nm_type[]= { {"610"}, {"460"}, {"585"}, {"530"}, {"410"}, };

char * const pwr_type[]= { {"LOW"}, {"MEDIUM"}, {"HIGH"}, };

char * const skin_type[]= { {"I"}, {"II"}, {"III"}, {"IV"}, {"V"}, {"VI"}, };

unsigned char iBid00[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08}; //0区 id unsigned char iBpw00[]={0x1a,0x23,0xfe,0xd5,0x37,0x49,0xba,0xee}; //0区 passwork

const unsigned char iBid01[]={0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15}; //1区 id const unsigned char iBpw01[]={0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18}; //1区 passwork

const unsigned char iBid02[]={0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25}; //2区 id const unsigned char iBpw02[]={0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28}; //2区 passwork

const unsigned char auto_para[6][15][8] = {4,5,5,35,25,3,4,10, 3,4,6,25,35,3,4,30, 3,4,5,25,30,3,3,45, 4,5,6,35,40,3,5,10, 3,4,6,25,30,3,4,30, 3,4,5,25,30,3,3,45, 4,6,6,30,40,3,5,10, 3,4,5,25,35,3,4,30, 3,4,6,25,35,3,3,45, 4,6,6,30,25,3,5,10, 4,5,6,30,45,3,4,30, 3,4,5,25,30,3,3,45, 4,5,6,30,40,3,5,10, 4,4,6,35,25,3,4,30, 3,4,6,25,35,3,3,45,

						 4,5,6,35,50,3,5,10, 3,4,6,35,45,3,4,30, 3,4,5,25,35,3,3,45, 
	 	  			  	 4,5,6,30,35,3,5,10, 3,4,5,25,25,3,4,30, 3,4,5,25,25,3,3,45, 
						 4,5,6,35,40,3,5,10, 4,5,6,35,25,3,4,30, 3,5,5,35,25,3,3,45, 
						 5,6,6,35,45,3,5,10, 4,5,6,35,45,3,4,30, 3,5,5,25,35,3,3,45, 
						 5,6,6,40,45,3,5,10, 4,5,6,40,35,3,4,30, 3,5,6,25,25,3,3,45, 

						 4,5,5,35,35,3,5,10, 3,4,6,25,35,3,4,30, 3,4,5,25,35,3,3,45, 
	 	  			  	 3,4,5,25,25,3,5,10, 3,4,5,25,25,3,4,30, 3,5,7,25,25,3,3,45, 
						 3,4,5,25,35,3,5,10, 3,4,4,25,35,3,4,30, 3,4,4,25,35,3,3,45, 
						 4,5,5,35,25,3,5,10, 4,5,5,35,25,3,4,30, 3,4,5,25,25,3,4,45, 
						 4,5,6,35,25,3,5,10, 4,5,6,35,25,3,4,25, 4,6,6,35,25,3,3,45, 

						 3,4,5,25,35,3,5,10, 3,4,5,25,35,3,4,30, 3,4,5,25,35,3,3,45, 
	 	  			  	 3,4,5,25,35,3,5,10, 3,4,5,25,35,3,4,30, 3,4,5,25,25,3,3,45, 
						 3,4,5,25,35,3,5,10, 3,4,4,25,35,3,3,30, 3,4,4,25,35,3,3,45, 
						 3,4,6,25,35,3,5,10, 3,4,5,25,35,3,4,30, 3,4,4,25,30,3,4,45, 
						 3,5,6,25,25,3,5,10, 3,4,5,25,35,3,4,30, 3,4,5,25,35,3,3,45, 
						 
						 4,5,5,35,45,3,5,10, 3,5,5,25,35,3,4,30, 3,4,5,25,35,3,4,45, 
	 	  			  	 4,5,6,35,45,3,5,10, 3,5,6,25,45,3,4,30, 3,4,5,25,25,3,4,45, 
						 4,6,6,35,45,3,5,10, 4,5,5,35,45,3,4,30, 3,5,5,25,25,3,3,45, 
						 5,5,6,45,25,3,5,10, 4,5,6,35,45,3,4,30, 3,5,5,25,25,3,4,45, 
						 5,5,6,45,25,3,5,10, 4,5,5,35,45,3,4,30, 3,4,5,30,45,3,4,45, 
						 
						 4,5,5,35,45,3,5,10, 3,5,5,25,35,3,4,30, 3,4,5,25,35,3,4,45, 
	 	  			  	 4,5,6,35,45,3,5,10, 3,5,6,25,45,3,4,30, 3,4,5,25,25,3,4,45, 
						 4,6,6,35,45,3,5,10, 4,5,5,35,45,3,4,30, 3,5,5,25,25,3,3,45, 
						 5,5,6,45,25,3,5,10, 4,5,6,35,45,3,4,30, 3,5,5,25,25,3,4,45, 
						 5,5,6,45,25,3,5,10, 4,5,5,35,45,3,4,30, 3,4,5,30,45,3,4,45, 
						};

unsigned char display_flag = 0;

unsigned char uart1_data; unsigned char button; unsigned char button_flag;

unsigned int button_time = 0; unsigned char button_type = 0;

const char * system_state[4]= { "WATER LEVEL ERROR!", "WATER FLOW ERROR! ", "WATER TEMP ERROR! ", "SYSTEM STATE OK! ", }; unsigned char buffer_uart[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0}; unsigned char uart1_counter = 0; unsigned char read_value; unsigned char uart_data; //unsigned char flag = 0; //unsigned char data = 0; void delay_100us(void);

void DisPara(void); void SaveBeep(void); void BeepOpen(void); void BeepClose(void); void Beep(unsigned char ms); void AdjustTime(void);

void DisCopyArea(uchar p_id, ushort l_x, ushort l_y, ushort width, ushort high, ushort x, ushort y); void DisString(unsigned short x,unsigned short y,unsigned int word_color,unsigned int ground_color,unsigned char big, char * string); void DisNumber(unsigned short x,unsigned short y,unsigned short word_color,unsigned short ground_color,unsigned char big, unsigned long number); void SetColor(unsigned short front_color,unsigned short back_color);

unsigned char EEPROM_read(unsigned int uiAddress); void EEPROM_write(unsigned int uiAddress, unsigned char ucData); void GetRecord(unsigned char number); void SaveRecord(unsigned char number);

void SaveHandTotal(void); void ReadHandTotal(void);

void DealButton(unsigned char button_value);

void SelfCheck(void);

void RfUp(unsigned char level); void RfDown(unsigned char level); void RfOut(unsigned int rf_time); void StepControl(unsigned int angle,unsigned char direction); void DisPower(void);

void DisParaSet(void);

void DelayMs(unsigned int delay_ms);

void SaveLaserRecord(void); void ReadLaserRecord(void);

void DisRfPower(void); void SimmerLamp(void);

void SaveLaserTotal(void); void ReadLaserTotal(void);

void DisColdLevel(void); #define ADDRESS 0 #define DATA 1 #define uchar unsigned char

unsigned char* lable0_set = (unsigned char*) 0x4100; unsigned char* lable1_set = (unsigned char*) 0x4120;

unsigned char* frequence_set = (unsigned char*) 0x4044; unsigned char* channel0_output = (unsigned char*) 0x4040; unsigned char* channel1_output = (unsigned char*) 0x4048;

unsigned char* rx0_channel = (unsigned char*) 0x4000; unsigned char* rx1_channel = (unsigned char*) 0x4008;

unsigned char read_value;

unsigned char uart_data = 0; unsigned char flag = 0;

unsigned char add_or_data = ADDRESS; unsigned char offset_address = 0; unsigned char data = 0;