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;