|
苦于IO口不够用,或者是为了节省排线,没有办法的情况下,用AD做了人键盘!用起来很用,现在把用AD做键盘的思路理了下,以大家共享!下面是原理图:
应该注意的地方:1 键盘需要速度,所以到地的电容不能大了,电容大了会导致采样出问题,因为电压是缓慢变化的哈,我没有用,其它的硬件接法与普通一样的.2 各级分压应该比较均匀,提高精度哈!做20个键应该没有问题的哈,我做了6个,处理起来感觉很不错!3 程序方面要注意啊!特别是需要等待时间再处理的地方,搞不好就会达不到要求!
下面是程序:
拿一个键来说明下处理方法,其它的就都知道了
//UP/DOWN键按下的情况,进行密码输入
val=AdcConvert(KEY); //AD转换
if((val>580)&&(val<630)&&!FLOCK&&FBG) 转换值判断
{Beep(); //喇叭叫一声
delay3s();
delay3s(); //延时
val=AdcConvert(KEY); //再转换,必要要进行的,不然就会出错,道理很简单啊
if((val>580)&&(val<630)) //与 上次一样,
{FUPDOWN_ON;//数码管56显示0,数码6闪烁 //置标志位
Nokeytime=0;
SMG5=0;SMG6=0;S12_OFF; //输入密码显示内容
Disp_ENTE();
K_Counter=0;
F5s_ON;
D5S=0;
while((val>580)&&(val<630)){val=AdcConvert(KEY);}//等待键弹起
}
}
/********************************************************
Name: KEYSCAN();
Function: KEYSCAN
*********************************************************/
void KEYSCAN(void)
{uint val;uchar i=0;
val=AdcConvert(KEY);
val=AdcConvert(KEY);
val=AdcConvert(KEY);
//UP/DOWN键按下的情况,进行密码输入
if((val>580)&&(val<630)&&!FLOCK&&FBG)
{Beep();
delay3s();
delay3s();
if((val>580)&&(val<630))
{FUPDOWN_ON;//数码管56显示0,数码6闪烁
Nokeytime=0;
SMG5=0;SMG6=0;S12_OFF; //输入密码显示内容
Disp_ENTE();
K_Counter=0;
F5s_ON;
D5S=0;
while((val>580)&&(val<630)){val=AdcConvert(KEY);}//等待键弹起
}
}
//SET键的操作:设置密码,设置参数,设置管理参数,修改密码
if((val>220)&&(val<290)&&!FLOCK&&FBG)
{ Beep();
delay(6000);
val=AdcConvert(KEY);
if((val>220)&&(val<290))
{
Nokeytime=0;
FSET_ON;
Fright1_off;
F5s_ON;
if(FUPDOWN||(Fright&&Fmodi))//UPDOWN标志或密码正确而且要修改密码
{
if(K_Counter<6) K_Counter++;
else K_Counter=1;
SMG5=K_Counter;
S12_OFF;
if(K_Counter==1) SMG6=LScode[0];
if(K_Counter==2) SMG6=LScode[1];
if(K_Counter==3) SMG6=LScode[2];
if(K_Counter==4) SMG6=LScode[3];
if(K_Counter==5) SMG6=LScode[4];
if(K_Counter==6) SMG6=LScode[5];
} //输入密码
if(Fright&&!Fmodi) //UPDOWN标志,密码正确
{if(K_Counter<5) K_Counter++;else K_Counter=1; SMG5=K_Counter;}//设置密码管理参数
if(!FUPDOWN&&!Fright){if(K_Counter<12) K_Counter++;else K_Counter=1;}//正常设置
if(K_Counter==1){
if(Fright&&!Fmodi){S12_ON;Disp_CSTS();eprd0cl();}//除霜温度
if(!FUPDOWN&&!Fright){S12_ON;Disp_RSTS();DISP_CL(eeprd[5]);} //热水温度
}
if(K_Counter==2){
if(Fright&&!Fmodi)//退出除霜温度
{Disp_CSOS();
F9_OFF;
S12_ON;
DISP_CL(eeprd[1]);
}
if(!FUPDOWN&&!Fright)//回差温度
{Disp_RS__();
DISP_CL(eeprd[6]);
S12_ON;
}
}
if(K_Counter==3){
if(Fright&&!Fmodi)
{Disp_HTTS();
if(eeprd[2]>100){ eeprd[2]&=0X7f;
if(eeprd[2]>9){F9_ON;DISP_CL(eeprd[2]);}
if(eeprd[2]<10){SMG5=SUBB;SMG6=eeprd[2];F9_OFF;}
}
else DISP_CL(eeprd[2]);
S12_ON;
}//环境温度
if(!FUPDOWN&&!Fright)//来电重启开关
{Disp_ONOF();
S12_OFF;
if(Frestar){SMG5=0;SMG6=N;}else {SMG5=0;SMG6=ZF;S12_OFF;}
}
}
if(K_Counter==4){
if(Fright&&!Fmodi)//除霜时间
{Disp_CSTC();
F9_OFF;
DISP_CL(eeprd[3]);
S12_OFF;
}
if(!FUPDOWN&&!Fright){Disp_08__();
DISP_CL(hour);
S12_OFF;
} //当前时间小时
}
if(K_Counter==5){
if(Fright&&!Fmodi) //除霜间隔时间
{Disp_STS8();
F9_OFF;
S12_OFF;
DISP_CL(eeprd[4]);
}
if(!FUPDOWN&&!Fright)//当前时间分钟
{Disp_10__();
S12_OFF;
DISP_CL(min);}
}
if(K_Counter==6){
if(!FUPDOWN&&!Fright&&!Fmodi){//定时开机小时
Disp_DONH();
S12_OFF;
DISP_CL(eeprd[9]);
}
}
if(K_Counter==7){if(!FUPDOWN&&!Fright){//定时开机分钟
Disp_DONF();
S12_OFF;
DISP_CL(eeprd[10]);
}
}
if(K_Counter==8) //定时开机开关
{Disp_ONOF();
S12_OFF;
if(Fdk) Disp_on();
else Disp_of();
}
if(K_Counter==9){S12_OFF;Disp_DOFH();DISP_CL(eeprd[12]);} //定时关机小时
if(K_Counter==10){S12_OFF;Disp_DOFF();DISP_CL(eeprd[13]);} //定时关机分钟
if(K_Counter==11)//定时关机开关
{Disp_ONOF();
S12_OFF;
if(Fdg) Disp_on();
else Disp_of();
}
if(K_Counter==12){Disp_pb_t();//屏幕保护时间调节
DISP_CL(eeprd[16]);
}
D5S=0;
while((val>220)&&(val<290)){val=AdcConvert(KEY);}
}
}
//UP按键
if((val>450)&&(val<560)&&!FLOCK&&FBG)
{ Beep();
F5s_ON;
delay(60000);
val=AdcConvert(KEY);
if((val>450)&&(val<560))
{
Nokeytime=0;
if(!FSET&&!FUPDOWN&&!Fright&&!Fmodi)
{
if(K_Counter1<4) K_Counter1++;
else K_Counter1=4;
if(K_Counter1==1){FDOWN_OFF;}
if(K_Counter1==2)
{FDOWN_ON;
Disp_NND();
SMG4=2;
TEMP_CL(EN_temp,FET_);
}
if(K_Counter1==3)
{FDOWN_ON;
Disp_NND();
SMG4=3;
TEMP_CL(PQ_temp,FPQT_);
}
if(K_Counter1==4)
{
FDOWN_ON;
Disp_NND();
SMG4=4;
TEMP_CL(LS_temp,FLNT_);
}
}
if(K_Counter==1)
{
if(FUPDOWN||(Fright&&Fmodi))//密码加处理
{
if(LScode[0]<9) LScode[0]++;
else LScode[0]=9;
SMG6=LScode[0];
}
if(Fright&&!Fmodi)//密码管理,除霜温度加处理
{if(eeprd[0]>0) eeprd[0]--;
else eeprd[0]=0;
eprd0cl();
}
if(!FUPDOWN&&!Fright&&!Fmodi)//正常参数--热水温度
{if(eeprd[5]<65) eeprd[5]++;
else eeprd[5]=65;
DISP_CL(eeprd[5]);
}
}
if(K_Counter==2)
{
if(FUPDOWN||(Fright&&Fmodi))//输入密码
{if(LScode[1]<9) LScode[1]++;
else LScode[1]=9;
SMG6=LScode[1];
}
if(Fright&&!Fmodi)//密码管理,退出温度处理
{if(eeprd[1]<20) eeprd[1]++;
else eeprd[1]=20;
DISP_CL(eeprd[1]);
}
if(!FUPDOWN&&!Fright&&!Fmodi)//正常参数--回差温度
{if(eeprd[6]<15) eeprd[6]++;
else eeprd[5]=15;
DISP_CL(eeprd[6]);
}
}
if(K_Counter==3)
{
if(FUPDOWN||(Fright&&Fmodi))//输入密码
{if(LScode[2]<9) LScode[2]++;
else LScode[2]=9;
SMG6=LScode[2];
}
if(Fright&&!Fmodi)//密码管理,环境温度处理+1度
{if(HW_counter<20) HW_counter++;
else HW_counter=20;
eeprd[2]=EN_TEMP[HW_counter];
HW_dispCL();//调用显示处理程序
}
if(!FUPDOWN&&!Fright&&!Fmodi)//来电重启开
{
Frestar_ON;
Disp_on();
eeprd[7]=1;
}
}
if(K_Counter==4)
{
if(FUPDOWN||(Fright&&Fmodi))//输入密码
{if(LScode[3]<9) LScode[3]++;
else LScode[3]=9;
SMG6=LScode[3];
}
if(Fright&&!Fmodi)//密码管理,除霜时间加1
{if(eeprd[3]<20) eeprd[3]++;
else eeprd[3]=20;
DISP_CL(eeprd[3]);
}
if(!FUPDOWN&&!Fright&&!Fmodi)//当前时间小时
{
if(hour<23) hour++;
else hour=23;
DISP_CL(hour);
}
}
if(K_Counter==5)
{
if(FUPDOWN||(Fright&&Fmodi))//输入密码
{if(LScode[4]<9) LScode[4]++;
else LScode[4]=9;
SMG6=LScode[4];
}
if(Fright&&!Fmodi)//密码管理,除霜间隔时间加1
{if(eeprd[4]<60) eeprd[4]++;
else eeprd[4]=60;
DISP_CL(eeprd[4]);
}
if(!FUPDOWN&&!Fright&&!Fmodi)//当前时间小时
{
if(min<59) min++;
else min=59;
DISP_CL(min);
}
}
if(K_Counter==6)
{
if(FUPDOWN||(Fright&&Fmodi))//输入密码
{if(LScode[5]<9) LScode[5]++;
else LScode[5]=9;
SMG6=LScode[5];
}
if(!FUPDOWN&&!Fright&&!Fmodi)//定时开机小时
{if(eeprd[9]<23) eeprd[9]++;
else eeprd[9]=23;
DISP_CL(eeprd[9]);
}
}
if(K_Counter ==7)//定时开机分钟
{if(eeprd[10]<59) eeprd[10]++;
else eeprd[10]=59;
DISP_CL(eeprd[10]);
}
if(K_Counter ==8){Fdk_ON;
Disp_on();
eeprd[8]=1;
}//定时开机开
if(K_Counter ==9)//定时开机小时
{if(eeprd[12]<23) eeprd[12]++;
else eeprd[12]=23;
DISP_CL(eeprd[12]);
}
if(K_Counter==10)//定时开机分钟
{if(eeprd[13]<59) eeprd[13]++;
else eeprd[13]=59;
DISP_CL(eeprd[13]);
}
if(K_Counter==11)
{Fdg_ON;
Disp_on();
eeprd[11]=1;
}//定时关机开
if(K_Counter==12){
if(eeprd[16]<20) eeprd[16]++;
else eeprd[16]=20;
DISP_CL(eeprd[16]);
}
D5S=0;
while((val>450)&&(val<560)){val=AdcConvert(KEY);}
}
}
//DOWN按键
if((val>320)&&(val<380)&&!FLOCK&&FBG)
{ Beep();F5s_ON;
delay(60000);
val=AdcConvert(KEY);
if((val>320)&&(val<380))
{
Nokeytime=0;
if(!FSET&&!FUPDOWN&&!Fright&&!Fmodi)
{
if(K_Counter1>1) K_Counter1--;
else K_Counter1=1;
if(K_Counter1==1){FDOWN_OFF;}
if(K_Counter1==2)
{FDOWN_ON;
Disp_NND();
SMG4=2;
TEMP_CL(EN_temp,FET_);
}
if(K_Counter1==3)
{FDOWN_ON;
Disp_NND();
SMG4=3;
TEMP_CL(PQ_temp,FPQT_);
}
if(K_Counter1==4)
{
FDOWN_ON;
Disp_NND();
SMG4=4;
TEMP_CL(LS_temp,FLNT_);
}
}
if(K_Counter==1)
{
if(FUPDOWN||(Fright&&Fmodi))//输入密码
{if(LScode[0]>0) LScode[0]--;
else LScode[0]=0;
SMG6=LScode[0];
}
if(Fright&&!Fmodi)//密码管理,除霜温度加处理
{
if(eeprd[0]<15) eeprd[0]++;
else eeprd[0]=15;
eprd0cl();
}
if(!FUPDOWN&&!Fright&&!Fmodi)//正常参数--热水温度
{if(eeprd[5]>10) eeprd[5]--;
else eeprd[5]=10;
DISP_CL(eeprd[5]);
}
}
if(K_Counter==2)
{
if(FUPDOWN||(Fright&&Fmodi))
{if(LScode[1]>0) LScode[1]--;
else LScode[1]=0;
SMG6=LScode[1];
}
if(Fright&&!Fmodi)//密码管理,退出温度处理
{if(eeprd[1]>3) eeprd[1]--;
else eeprd[1]=3;
DISP_CL(eeprd[1]);
}
if(!FUPDOWN&&!Fright&&!Fmodi)//正常参数--回差温度
{if(eeprd[6]>3) eeprd[6]--;
else eeprd[5]=3;
DISP_CL(eeprd[6]);
}
}
if(K_Counter==3)
{
if(FUPDOWN||(Fright&&Fmodi))
{
if(LScode[2]>0) LScode[2]--;
else LScode[2]=0;
SMG6=LScode[2];
}
if(Fright&&!Fmodi)//密码管理,环境温度处理-1度
{if(HW_counter>0) HW_counter--;
else HW_counter=0;
eeprd[2]=EN_TEMP[HW_counter];
HW_dispCL();//调用显示处理程序
}
if(!FUPDOWN&&!Fright&&!Fmodi)//来电重启开
{
Frestar_OFF;
Disp_of();
eeprd[7]=0;
}
}
if(K_Counter==4)
{
if(FUPDOWN||(Fright&&Fmodi))
{if(LScode[3]>0) LScode[3]--;
else LScode[3]=0;
SMG6=LScode[3];
}
if(Fright&&!Fmodi)//密码管理,除霜时间加1
{if(eeprd[3]>1) eeprd[3]--;
else eeprd[3]=1;
DISP_CL(eeprd[3]);
}
if(!FUPDOWN&&!Fright&&!Fmodi)//当前时间小时
{
if(hour>0) hour--;
else hour=0;
DISP_CL(hour);
}
}
if(K_Counter==5)
{
if(FUPDOWN||(Fright&&Fmodi))
{if(LScode[4]>0) LScode[4]--;
else LScode[4]=0;
SMG6=LScode[4];
}
if(Fright&&!Fmodi)//密码管理,除霜间隔时间加1
{if(eeprd[4]>5) eeprd[4]--;
else eeprd[4]=5;
DISP_CL(eeprd[4]);
}
if(!FUPDOWN&&!Fright&&!Fmodi)//当前时间小时
{
if(min>0) min--;
else min=0;
DISP_CL(min);
}
}
if(K_Counter==6)
{
if(FUPDOWN||(Fright&&Fmodi))
{if(LScode[5]>0) LScode[5]--;
else LScode[5]=0;
SMG6=LScode[5];
}
if(!FUPDOWN&&!Fright&&!Fmodi)//定时开机小时
{if(eeprd[9]>0) eeprd[9]--;
else eeprd[9]=0;
DISP_CL(eeprd[9]);
}
}
if(K_Counter ==7)
{if(eeprd[10]>0) eeprd[10]--;
else eeprd[10]=0;
DISP_CL(eeprd[10]);
}
if(K_Counter ==8)
{Fdk_OFF;
Disp_of();
eeprd[8]=0;
}
if(K_Counter ==9)
{if(eeprd[12]>0) eeprd[12]--;
else eeprd[12]=0;
DISP_CL(eeprd[12]);
}
if(K_Counter==10)
{if(eeprd[13]>0) eeprd[13]--;
else eeprd[13]=0;
DISP_CL(eeprd[13]);
}
if(K_Counter==11)
{Fdg_OFF;
Disp_of();//56显示"ON"
eeprd[11]=0;
}
if(K_Counter==12){
if(eeprd[16]>1) eeprd[16]--;
else eeprd[16]=1;
DISP_CL(eeprd[16]);
}
D5S=0;
while((val>320)&&(val<380)){val=AdcConvert(KEY);}
}
}
//POWER键
if((val>160)&&(val<200)&&FLOCK)
{delay(6000);
val=AdcConvert(KEY);
if((val>160)&&(val<200))
{for(i=0;i+20<26;i++){write_EEPROM(i+20,0);}
for(i=0;i<6;i++) {scode=0;}
}
}
if((val>160)&&(val<200)&&!FLOCK)
{ delay(6000);
val=AdcConvert(KEY);
if((val>160)&&(val<200))
{
Nokeytime=0;
Beep();
if(FUPDOWN)
{if(!((scode[0]^LScode[0])||(scode[1]^LScode[1])||(scode[2]^LScode[2])||
(scode[3]^LScode[3])||(scode[4]^LScode[4])||(scode[5]^LScode[5])))
{
Fright_ON; //密码正确标志置位
Fright1_on;
FUPDOWN_OFF; //清除UPDOWN标志
SMG5=9;
SMG6=9;
Fsmg6_OFF;
K_Counter=0; //计数器清零
Ferror_off;
D5S=0;
}
else {SMG5=ZE;SMG6=ZE;Ferror_on;}
}
else {if(Fsysenable) systemoff();
else systemon();
}
while((val>160)&&(val<200)){val=AdcConvert(KEY);}
}
}
if((val>145)&&(val<165)&&!FLOCK&&Fsys&&FBG)//CS强制除霜
{ delay(6000);
Nokeytime=0;
val=AdcConvert(KEY);
if((val>145)&&(val<165))
{
Beep();
delay3s();delay3s();delay3s();delay3s();
if((val>145)&&(val<165)&&!FLOCK&&Fsys)
{FCS_ON;
while((val>145)&&(val<165)){val=AdcConvert(KEY);}
}
}
}
if((val>100)&&(val<144)&&FBG)//LOCK键
{ delay(6000);
val=AdcConvert(KEY);
if((val>100)&&(val<144))
{
Beep();
LCDBG_ON;//开背光
Nokeytime=0;
if(!Fright){delay3s();delay3s();//按下5s
val=AdcConvert(KEY);
if((val>100)&&(val<144)){if(FLOCK) {FLOCK_OFF;S20_OFF;}
else {FLOCK_ON;S20_ON;}
}
}
else {Fmodi_ON;
D5S=0;
SMG5=0;
SMG6=0;
} //可以修改密码
while((val>100)&&(val<144)) val=AdcConvert(KEY);
}
}
} |
|