📄
字号:
0x20,0x020,0x58,0x20,0x21,0x20,0x70,0x61,
0x73,0x73,0x77,0x6f,0x72,0x64,0x73,//X ! passwords:
0x20,0x20,0x20,0x20,0x20,
0x45,0x52,0x52,0x4f,0x52,0x20,0x21,//ERROR !
};
LCD_display(0x0c,26,failed);
for(a=0;a<=254;a++)
delay();
}
//---------------------------------------------------
//操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操
// 键 盘 操 作 区
//作作作作作作作作作作作作作作作作作作作作作作作作作作作作作作作作作作
//------ 按 "优先级" 顺序呼叫下一号顾客 -------
void call() //
{
option = check = a = A = 0;
if(restsum!=0)
{
send(waiting_numbers[0],address);
recall = waiting_numbers[0];
restsum--;
LCD_data(waiting_numbers[0].number,restsum);
pack_up(waiting_numbers);
}
else
LCD_data(waiting_numbers[0].number,restsum);
}
//---------------------------------------------
//---------- 重新呼叫"当前号码"的顾客 ----------
void re_call()
{
option = check = a = A = 0;
if(recall.number!=0)
{
recall.PRI=10;
send(recall,address);
LCD_data(recall.number,restsum);
}
}
//----------------------------------------------
//----------- 设置键 程序---- 输入正确密码后进入控制面板 ------------
void set()
{
unsigned char keyboard[]=
{
0x30,0x31,0x32,0x33,0x34,0x35, //0,1,2,3,4,5,
0x36,0x37,0x38,0x39,0xef //6,7,8,9,*
};
unsigned char ad[]=
{
0x50,0x6c,0x65,0x61,0x73,0x65,0x20, //Please
0x69,0x6e,0x70,0x75,0x74,0x20, //input
0x74,0x68,0x65,0x20, //the
0x61,0x64,0x64,0x72,0x65,0x73,0x73, //address
0x20,0x3a,0x20,0x20,0x20,0x7f,0x20,0x20 // : <
};
unsigned char operations[]=
{
0x50,0x6c,0x65,0x61,0x73,0x65,0x20, //Please
0x73,0x65,0x74,0x20, //set
0x6f,0x70,0x65,0x72,0x61,0x74,0x69,0x6f,0x6e, //operation
0x30,0x28,0x4f,0x4e,0x2f,0x4f,0x46,0x46,0x29 //X(ON/OFF)
};
unsigned char pass_word[]=
{
0x49,0x6e,0x70,0x75,0x74,0x20, //Input
0x74,0x68,0x65,0x20, //the
0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x73,0x3a //passwords:
};
unsigned char new_password[]=
{
0x49,0x6e,0x70,0x75,0x74,0x20, //Input
0x6e,0x65,0x77,0x20, //new
0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x73,0x3a //passwords:
};
check = 1; //告诉CPU此时程序已进入控制面板
if(option>=13)
option=1;
switch(option)
{
case 0 : LCD_display(0x0f,19,pass_word); //显示"要求输入密码的对话框"
a = A = 0;
break;
case 1 : ad[27] = keyboard[address/10]; //显示"操作器地址"或"修改操作器地址"
ad[28] = keyboard[address%10];
LCD_display(0x0f,29,ad);
option++;
break;
case 2 : LCD_display(0x0c,28,operations);//设置 "业务0" 为 "启用" 或 "关闭"
show_ON_or_OFF(0x30);
option++;
break;
case 3 : show_ON_or_OFF(0x31); //设置 "业务1" 为 "启用" 或 "关闭"
option++;
break;
case 4 : show_ON_or_OFF(0x32); //设置 "业务2" 为 "启用" 或 "关闭"
option++;
break;
case 5 : show_ON_or_OFF(0x33); //设置 "业务3" 为 "启用" 或 "关闭"
option++;
break;
case 6 : show_ON_or_OFF(0x34); //设置 "业务4" 为 "启用" 或 "关闭"
option++;
break;
case 7 : show_ON_or_OFF(0x35); //设置 "业务5" 为 "启用" 或 "关闭"
option++;
break;
case 8 : show_ON_or_OFF(0x36); //设置 "业务6" 为 "启用" 或 "关闭"
option++;
break;
case 9 : show_ON_or_OFF(0x37); //设置 "业务7" 为 "启用" 或 "关闭"
option++;
break;
case 10: show_ON_or_OFF(0x38); //设置 "业务8" 为 "启用" 或 "关闭"
option++;
break;
case 11: show_ON_or_OFF(0x39); //设置 "业务9" 为 "启用" 或 "关闭"
option++;
break;
case 12: LCD_display(0x0f,19,new_password);//修改密码
option++;
break;
}
}
//-------------------------------------------------------------------------
//------- 控制各业务的 "开启" 和 "关闭" 并且实时显示-------
void on_off()
{
if((option>=3)&(option<=12))
{
if(control[option-3]==0)
{control[option-3]=1;
PORTB = 0x02;//光标复位
enable();
PORTB = 0xcd;//显示起始位置
enable();
PORTB = 0x20;
enshow();
PORTB = 0x4f;
enshow(); //显示 ON
PORTB = 0x4e;
enshow();}
else
{control[option-3]=0;
PORTB = 0x02;//光标复位
enable();
PORTB = 0xcd;//显示起始位置
enable();
PORTB = 0x4f;
enshow();
PORTB = 0x46;
enshow(); //显示OFF
PORTB = 0x46;
enshow();}
}
}
//--------------------------------------------------------
//------------ "取消键"程序 -------------
void concel() //取消操作
{
unsigned char b;
for(b=0;b<=9;b++)
PASSWORD[b]=new_password[b]=10;
LCD_data(waiting_numbers[0].number,restsum);
check = option = a = A = 0;
}
//---------------------------------------
//----------- "确定键"的功能 -----------------
void sure()
{
if(check == 1)
{
unsigned char b;
switch(option)
{
case 0 : { //确认密码是否正确,真则进入功能设置面板,否则退出
for( b=0; b<=9; b++)
if( PASSWORD[b] != password[b] )
{
for( b=0; b<=9; b++)
PASSWORD[b] = 10;
failed();
goto back;
}
else
{
PASSWORD[b] = 10;
continue;
}
option++;
A=0;
set();
goto out;
}
break;
case 2 : switch(a) //保存控制面板中设定的该操作器地址至EEPROM
{
case 0:break;
case 1:address = keynum[--a];
break;
case 2:address = keynum[--a]+keynum[--a]*10;
break;
}
b = 11;
EEPROM_WRITE(0x0000,address);
EEPROM_WRITE(0x0001,b);
save_completed();
break;
case 3 :
case 4 :
case 5 :
case 6 :
case 7 :
case 8 :
case 9 :
case 10 :
case 11 : //保存设置好的业务至EEPROM
case 12 : {
EEPROM_WRITE(0x0011,control);
b = 22;
EEPROM_WRITE(0x0002,b);
save_completed();
}
break;
case 13 : { //提示用户"再次输入密码"--更改密码时用
pass_again();
A = 0;
option++;
goto out;
}
break;
case 14 : { //比较两个新密码,真则保存新密码至EEPROM
for( b=0; b<=9; b++ ) //否则退出
if(PASSWORD[b]!=new_password[b])
{
failed();
goto back;
}
else continue;
for( b=0; b<=9; b++ )
{
password[b] = PASSWORD[b];
PASSWORD[b] = new_password[b] = 10;
}
EEPROM_WRITE(0x002b,password);
b = 33;
EEPROM_WRITE(0x0003,b);
save_completed();
goto back;
}
break;
}
back:
check = option = a = A = 0; //复位各控制标志
LCD_data(waiting_numbers[0].number,restsum);
out:;
}
}
//-----------------------------------------------
//--------------------- (0-9)号码键的处理程序 ------------------------
void key_switch(unsigned char KEY)
{
if( check==1 ) //判断是否已进入控制面板,是则继续,否则退出
{
unsigned char t;
unsigned char keyboard[] = {
0x30,0x31,0x32,0x33,0x34,
0x35,0x36,0x37,0x38,0x39,0xef
};
switch(option)
{
case 0 :
if(A<=9) //进入控制面板时,供用户输入密码
{PORTB=keyboard[10];
enshow();
PASSWORD[A]=KEY;
A++;}
break;
case 2 : if(a<2) //设置 " 2位数 " 的操作器地址
{PORTB=keyboard[KEY];
enshow();
keynum[a]=KEY;
a++;}
break;
case 13 : if(A<=9) //修改密码时,供用户输入密码
{PORTB=keyboard[10];
enshow();
PASSWORD[A]=KEY;
A++;}
break;
case 14 : if(A<=9) //修改密码时,供用户输入确认密码
{PORTB=keyboard[10];
enshow();
new_password[A]=KEY;
A++;}
break;
}
for(t=0;t<=30;t++) //延时一段时间,确保"数字"可靠输入
delay();
}
}
//---------------------------------------------------------------------
//----- 键盘号判别程序 ---- 确定输入的是哪个按键-----
void dealkey(unsigned char k)
{
switch(k)
{
case 0 : key_switch(1);
break;
case 1 : key_switch(2);
break;
case 2 : key_switch(3);
break;
case 3 : sure();
break;
case 4 : key_switch(4);
break;
case 5 : key_switch(5);
break;
case 6 : key_switch(6);
break;
case 7 : concel();
break;
case 8 : key_switch(7);
break;
case 9 : key_switch(8);
break;
case 10: key_switch(9);
break;
case 11: on_off();
break;
case 12: key_switch(0);
break;
case 13: set();
break;
case 14: re_call();
break;
case 15: call();
break;
}
}
//---------------------------------------------------
//---- "按键触发"的外部中断1入口程序--4X4键盘就是从此处输入 ----
void int_1()
{
unsigned char first,second,key;
GICR = 0x00;//关闭所有外部中断;
SEI();//允许TWI嵌套中断
first = PINA;
DDRA=0xf0;
PORTA=0x0f;
delay();
second = PINA;
DDRA = 0x0f;
PORTA = 0xf0;
delay();
while(!(0x08&PIND))
;
buzzer(0);//蜂鸣器响一声;
switch (first)
{
case 0x70 : key=0;
break;
case 0xb0 : key=4;
break;
case 0xd0 : key=8;
break;
case 0xe0 : key=12;
break;
}
switch (second)
{
case 0x07 : key+=0;
break;
case 0x0b : key+=1;
break;
case 0x0d : key+=2;
break;
case 0x0e : key+=3;
break;
}
dealkey(key);
GICR = 0x80;//开启外部中断1;
}
//-------------------------------------------------------------
//---- main 主程序;系统通电启动后 cpu 从此处进入程序 ----
void main()
{
unsigned char reset;
unsigned char aa;
EEPROM_READ(0x0001,aa);
if( aa == 11 )
{
EEPROM_READ(0x0000,aa);
address = aa;
}
EEPROM_READ(0x0002,aa);
if( aa == 22 )
{
EEPROM_READ(0x0011,control);
}
EEPROM_READ(0x0003,aa);
if( aa == 33 )
{
EEPROM_READ(0x002b,control);
}
DDRA = 0x0f;
PORTA = 0xf0;
PORTD |= 0x08;
SEI();
GICR = 0x80;
MCUCR = 0x00;
TWAR = 0x07;
TWCR = reset = (1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);
for(aa=0;waiting_numbers[aa].number!=0;aa++)
restsum++;
DDRB = 0xff;
DDRD = 0xe0;
PORTD = 0xe0;
LCD_data(waiting_numbers[0].number,restsum);
do{
if(TWCR != reset)
TWCR = reset;
;
}
while(1);
}
//------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -