给你一段代码参考,我这是4个按键的。
//===============================================================================
// 键盘处理
//-------------------------------- OK --------------------------------------------
void key_pro(void)
{
u8 i,k,keytemp,dat[4];
u8 flag_exit,flag_ok,temp;
u16 temp1;
i=2;
k=0;
led_buf[0] = '-';
led_buf[1] = '-';
led_buf[2] = '-';
led_buf[3] = '-';
// led_buf[4] = '-';
// get_segm(led_buf,LED_LEN); //查段码
// led_buf_segm[i]|=0x80; //第三位加小数点
flag_exit = 1; //进入手动设置数据
flag_ok = 0;
do{
// dog=1; //CLR WDT
get_segm(led_buf,LED_LEN); //查段码
led_buf_segm[i]|=0x80; //加点
disp_ta6932(COM_1_SET,COM_2_ADDR,LED_LEN,led_buf_segm,COM_3_DISP); //显示
keytemp = get_key(); //读键值
switch(keytemp)
{
// case _EXIT :
// flag_exit=0;//退出
// break;
case _OK : if(flag_ok !=1) //
flag_ok=1; //设置数据有效
flag_exit=0;//退出
break;
case _MODE: //设置温度值
switch(k) //设置项目选择
{
case 0 : led_buf[0] = '1';//1
led_buf[1] = 's';
temp = temperature.temper_st; //1号位置上限温度
led_buf[2] = temp/10 + 0x30; //十位数
led_buf[3] = temp%10 + 0x30; //个位数
// led_buf[4] = 0x30; //小数不设置
break;
case 1 : led_buf[0] = '1';//1
led_buf[1] = 'x';
temp = temperature.temper_xt; //1号位置下限温度
led_buf[2] = temp/10 + 0x30; //十位数
led_buf[3] = temp%10 + 0x30; //个位数
// led_buf[4] = 0x30; //小数不设置
break;
// case 2 : led_buf[0] = '2';//1
// led_buf[1] = '-';
// temp = temperature.count; //开关窗时铁管转动圈数
// led_buf[2] = temp/10 + 0x30; //十位数
// led_buf[3] = temp%10 + 0x30; //个位数
// // led_buf[4] = 0x30; //小数不设置
// break;
}
k++;
if(k>1)
k = 0;
get_segm(led_buf,LED_LEN);//查段码
led_buf_segm[i]|=0x80; //加点
break;
case _RL : //处理指示位置的点
get_segm(led_buf,LED_LEN);//查对应段码
i++; //移动点
if(i>3) //如果点的位置超界
{
led_buf_segm[i-1]&=0x7f;//清除末位点
i=2; //恢复点的原位置
}
led_buf_segm[i]|=0x80; //设置当前位置的点
if(i!=2) //如果点的位置移动
led_buf_segm[i-1]&=0x7f; //去掉前一位的点
break;
case _SET : //设置数据
led_buf[i] = led_buf[i] + 1;
if(led_buf[i] > '9')
led_buf[i] = '0'; //0~9之间的数据
get_segm(led_buf,LED_LEN); //查段码
led_buf_segm[i]|=0x80; //加点
break;
}
disp_ta6932(COM_1_SET,COM_2_ADDR,LED_LEN,led_buf_segm,COM_3_DISP); //送显
//以下将字符转换成数据
if((led_buf[0]=='1')&&(led_buf[1]=='s')) //1号位上限数据
{
memcpy(dat,led_buf+2,2);
temperature.temper_st = a_to_int(dat);
}
if((led_buf[0]=='1')&&(led_buf[1]=='x')) //1下限数据
{
memcpy(dat,led_buf+2,2);
temperature.temper_xt = a_to_int(dat);
}
// if((led_buf[0]=='2')&&(led_buf[1]=='-')) //转动圈数
// {
// memcpy(dat,led_buf+2,2);
// temperature.count = a_to_int(dat);
// }
//保存上限温度,下限温度,转动圈数
if(flag_ok) //添加存储设置的数据->EEPROM,显示当前温度,
{
flag_ok = 0;
eeprom_sector_erase(ISP_START_ADDR);
eeprom_byte_write(ISP_START_ADDR,temperature.temper_st);
eeprom_byte_write(ISP_START_ADDR+1,temperature.temper_xt);
temp1 = temperature.temper_p; //当前实时温度
led_buf[0]='*'; //关显示
led_buf[1]=temp1/100+0x30;
led_buf[2]=temp1%100/10+0x30;//十位
led_buf[3]=temp1%100%10+0x30;//个位
get_segm(led_buf,LED_LEN); //查段码
led_buf_segm[2]|=0x80; //
disp_ta6932(COM_1_SET,COM_2_ADDR,LED_LEN,led_buf_segm,COM_3_DISP); //送显
}
}while(flag_exit);
}
|