給你一段代碼參考,我這是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);
}
|