|
給你一段代碼參考,我這是4個(gè)按鍵的。
//===============================================================================
// 鍵盤處理
//-------------------------------- 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; //第三位加小數(shù)點(diǎn)
flag_exit = 1; //進(jìn)入手動(dòng)設(shè)置數(shù)據(jù)
flag_ok = 0;
do{
// dog=1; //CLR WDT
get_segm(led_buf,LED_LEN); //查段碼
led_buf_segm[i]|=0x80; //加點(diǎn)
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; //設(shè)置數(shù)據(jù)有效
flag_exit=0;//退出
break;
case _MODE: //設(shè)置溫度值
switch(k) //設(shè)置項(xiàng)目選擇
{
case 0 : led_buf[0] = '1';//1
led_buf[1] = 's';
temp = temperature.temper_st; //1號(hào)位置上限溫度
led_buf[2] = temp/10 + 0x30; //十位數(shù)
led_buf[3] = temp%10 + 0x30; //個(gè)位數(shù)
// led_buf[4] = 0x30; //小數(shù)不設(shè)置
break;
case 1 : led_buf[0] = '1';//1
led_buf[1] = 'x';
temp = temperature.temper_xt; //1號(hào)位置下限溫度
led_buf[2] = temp/10 + 0x30; //十位數(shù)
led_buf[3] = temp%10 + 0x30; //個(gè)位數(shù)
// led_buf[4] = 0x30; //小數(shù)不設(shè)置
break;
// case 2 : led_buf[0] = '2';//1
// led_buf[1] = '-';
// temp = temperature.count; //開關(guān)窗時(shí)鐵管轉(zhuǎn)動(dòng)圈數(shù)
// led_buf[2] = temp/10 + 0x30; //十位數(shù)
// led_buf[3] = temp%10 + 0x30; //個(gè)位數(shù)
// // led_buf[4] = 0x30; //小數(shù)不設(shè)置
// break;
}
k++;
if(k>1)
k = 0;
get_segm(led_buf,LED_LEN);//查段碼
led_buf_segm[i]|=0x80; //加點(diǎn)
break;
case _RL : //處理指示位置的點(diǎn)
get_segm(led_buf,LED_LEN);//查對(duì)應(yīng)段碼
i++; //移動(dòng)點(diǎn)
if(i>3) //如果點(diǎn)的位置超界
{
led_buf_segm[i-1]&=0x7f;//清除末位點(diǎn)
i=2; //恢復(fù)點(diǎn)的原位置
}
led_buf_segm[i]|=0x80; //設(shè)置當(dāng)前位置的點(diǎn)
if(i!=2) //如果點(diǎn)的位置移動(dòng)
led_buf_segm[i-1]&=0x7f; //去掉前一位的點(diǎn)
break;
case _SET : //設(shè)置數(shù)據(jù)
led_buf[i] = led_buf[i] + 1;
if(led_buf[i] > '9')
led_buf[i] = '0'; //0~9之間的數(shù)據(jù)
get_segm(led_buf,LED_LEN); //查段碼
led_buf_segm[i]|=0x80; //加點(diǎn)
break;
}
disp_ta6932(COM_1_SET,COM_2_ADDR,LED_LEN,led_buf_segm,COM_3_DISP); //送顯
//以下將字符轉(zhuǎn)換成數(shù)據(jù)
if((led_buf[0]=='1')&&(led_buf[1]=='s')) //1號(hào)位上限數(shù)據(jù)
{
memcpy(dat,led_buf+2,2);
temperature.temper_st = a_to_int(dat);
}
if((led_buf[0]=='1')&&(led_buf[1]=='x')) //1下限數(shù)據(jù)
{
memcpy(dat,led_buf+2,2);
temperature.temper_xt = a_to_int(dat);
}
// if((led_buf[0]=='2')&&(led_buf[1]=='-')) //轉(zhuǎn)動(dòng)圈數(shù)
// {
// memcpy(dat,led_buf+2,2);
// temperature.count = a_to_int(dat);
// }
//保存上限溫度,下限溫度,轉(zhuǎn)動(dòng)圈數(shù)
if(flag_ok) //添加存儲(chǔ)設(shè)置的數(shù)據(jù)->EEPROM,顯示當(dāng)前溫度,
{
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; //當(dāng)前實(shí)時(shí)溫度
led_buf[0]='*'; //關(guān)顯示
led_buf[1]=temp1/100+0x30;
led_buf[2]=temp1%100/10+0x30;//十位
led_buf[3]=temp1%100%10+0x30;//個(gè)位
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);
}
|
|