?? key_pro.c
字號:
/*
----------------------------------------------------------
; (c) Copyright xami All Rights Reserved
----------------------------------------------------------
; SOURCE_FILE: KEY_PRO.C
; APPLICATION: 80c51\80c52
; DESCRIPTION: 用戶交互,按鍵處理<程序核心>
; AUTHOR: xami
; DATE: 28 Apr. 2007
----------------------------------------------------------
*/
#include<put_digit.c> //輸入頻率數(shù)據(jù)
#include<get_digit.c> //取得頻率數(shù)據(jù)
#include<format.c> //格式化頻率值,送顯示
void key_process(uchar key)
{
uchar legit_f_num= 0; //作為輸入的頻率是否正確的判斷位
switch(key){
/*菜單鍵*/
case 0x18:{ //無條件響應
mode= in_menu;
for(i= 0;i<= 9;i++){
dis_num[i]= menu[mode_list][i];}
}break;/*end case 0x18*/
/*向上、向下鍵處理*/
//up:
case 0x28:{ //菜單、設置幅度模式下響應
if(mode== in_menu){ //+菜單模式下
if(mode_list< 5){
mode_list++;
for(j= 0;j<= 9;j++){
dis_num[j]= menu[mode_list][j];}
}else{ //直接顯示err_
show_err();}
}else if((mode== in_submenu) && (mode_list== SE_U)){ //+設置幅度模式下
if(mode_set_u_list< 5){
mode_set_u_list++;
for(j= 0;j<= 9;j++){
dis_num[j]= u_step[mode_set_u_list][j];}
}else{
show_err();}
}else if((mode== in_submenu) && (mode_list== STEP)){ //+步進顯示模式
if(have_step== 0){
show_err();
}else{
if(step_i< 10){
step_i++;
for(j= 0;j<= 3;j++){ //voltage
dis_num[j]= step_u[step_i][j];}
temp_f= step_i*step_long + setf_f;
panduan();
for(j= 4;j<= 9;j++){ //frequency(為簡化計算,直接對緩存的頻率顯存改變)
dis_num[j]= digit_temp[j-4];}
}else{
show_err();}
}
}else{show_err();} //其他模式下,直接顯示err_
}break;/*end case 0x28*/
//down:
case 0x48:{ //菜單、設置幅度模式下響應
if(mode== in_menu){ //+菜單模式下
if(mode_list> 0){
mode_list--;
for(j= 0;j<= 9;j++){
dis_num[j]= menu[mode_list][j];}
}else{ //直接顯示err_
show_err();}
}else if((mode== in_submenu) && (mode_list== SE_U)){ //+設置幅度模式下
if(mode_set_u_list> 0){
mode_set_u_list--;
for(j= 0;j<= 9;j++){
dis_num[j]= u_step[mode_set_u_list][j];}
}else{
show_err();}
}else if((mode== in_submenu) && (mode_list== STEP)){ //+步進顯示模式
if(have_step== 0){
show_err();
}else{
if(step_i> 0){
step_i--;
for(j= 0;j<= 3;j++){ //voltage
dis_num[j]= step_u[step_i][j];}
temp_f= step_i*step_long + setf_f;
panduan();
for(j= 4;j<= 9;j++){ //frequency(為簡化計算,直接對緩存的頻率顯存改變)
dis_num[j]= digit_temp[j-4];}
}else{
show_err();}
}
}else{show_err();} //其他模式下,直接顯示err_
}break;/*end case 0x48*/
//確認鍵處理
case 0x88:{ //無條件響應,判斷在哪個菜單下,相應處理
if(mode == in_menu){ //+在主菜單模式下//
mode= in_submenu; //轉(zhuǎn)到子菜單
switch(mode_list){
case SH_O:{ //+顯示零偏
if(u_zero!= 0){
/*
dis_num[9]= 0x6D;
dis_num[8]= 0x76;
dis_num[7]= 0x08;
dis_num[6]= 0x3F;
*/
dis_num[5]= digit[0][((int)(u_zero/100))%10];
dis_num[4]= digit[0][((int)(u_zero/10))%10];
dis_num[3]= digit[1][((int)u_zero)%10];
dis_num[2]= digit[0][((int)(u_zero*10))%10];
dis_num[1]= digit[0][((int)(u_zero*100))%10];
dis_num[0]= digit[0][((int)(u_zero*1000))%10];
}else{ //顯示"null"
show_null();
}
return;
}break;
case SH_F:{ //+顯示頻率
if(setf_f== 0){ //未設定過頻率,顯示null
show_null();
}else{ //設定過頻率,則把值放入顯存
//結果放進顯存
/*
dis_num[0]= 0x6D;
dis_num[1]= 0x76;
dis_num[2]= 0x08;
dis_num[3]= 0x71;
*/
//把頻率放真值放到臨時頻率,以便運行下面的panduan(),生成想要的頻率顯存
temp_f= setf_f;
panduan();
dis_num[4]= digit_temp[0];
dis_num[5]= digit_temp[1];
dis_num[6]= digit_temp[2];
dis_num[7]= digit_temp[3];
dis_num[8]= digit_temp[4];
dis_num[9]= digit_temp[5];
return;
}
}break;
case SH_U:{ //+顯示電壓
res_u= get_u();
res_u+= u_zero; //加上零偏值
/*
dis_num[0]= 0x6D;
dis_num[1]= 0x76;
dis_num[2]= 0x08;
dis_num[3]= 0x3E;
*/
dis_num[4]= digit[0][((int)(res_u/100))%10];
dis_num[5]= digit[0][((int)(res_u/10))%10];
dis_num[6]= digit[1][((int)res_u)%10];
dis_num[7]= digit[0][((int)(res_u*10))%10];
dis_num[8]= digit[0][((int)(res_u*100))%10];
dis_num[9]= digit[0][((int)(res_u*1000))%10];
return;
}break;
case SE_F:{
//初始化數(shù)字緩存
digit_temp[0]= 0x00;
digit_temp[1]= 0x00;
digit_temp[2]= 0x00;
digit_temp[3]= 0x00;
digit_temp[4]= 0x00;
digit_temp[5]= 0x00;
for(i= 0;i< 6;i++){
have_p[i]= 0;}
w= 6;
}break;
case SE_U:{
for(i= 0;i<= 9;i++){
dis_num[i]= u_step[mode_set_u_list][i];}
}break;
case STEP:{
//初始化數(shù)字緩存
digit_temp[0]= 0x00;
digit_temp[1]= 0x00;
digit_temp[2]= 0x00;
digit_temp[3]= 0x00;
digit_temp[4]= 0x00;
digit_temp[5]= 0x00;
for(i= 0;i< 6;i++){
have_p[i]= 0;}
w= 6;
}break;
default: break;
}
}else if(mode == in_submenu){ //+在子菜單模式下//
//mode = in_menu;
switch(mode_list){
case SH_O:{
mode= in_menu;
for(i= 0;i<= 9;i++){
dis_num[i]= menu[mode_list][i];}
}break;
case SH_F:{
mode= in_menu;
for(i= 0;i<= 9;i++){
dis_num[i]= menu[mode_list][i];}
}break;
case SH_U:{
mode= in_menu;
for(i= 0;i<= 9;i++){
dis_num[i]= menu[mode_list][i];}
}break;
case SE_F:{
while(legit_f_num == 0){ //是合法的頻率退出
key= get_digit();
setf_f= temp_f;
if(key == 0x18){
mode= in_menu;
for(i= 0;i<= 9;i++){
dis_num[i]= menu[mode_list][i];}
return;
}
/*判斷是不是合法的頻率,合法則使循環(huán)結束*/
if((setf_f> 0) && (setf_f< 20971520)){ //0~20 MHz
show_good();
legit_f_num = 1; //跳出while(legit_f_num == 0)
}else{
show_err();
}
}//end for "while(legit_f_num == 0)"
mode= in_menu;
for(i= 0;i<= 9;i++){
dis_num[i]= menu[mode_list][i];}
//送ad9851,產(chǎn)生相應的頻率
input9851(setf_f);
}
case SE_U:{
switch(mode_set_u_list){ //硬件開關轉(zhuǎn)換
case 0:{
P2_2=1;
P2_3=0;
P2_4=1;
}break;
case 1:{
P2_2=0;
P2_3=0;
P2_4=1;
}break;
case 2:{
P2_2=1;
P2_3=1;
P2_4=0;
}break;
case 3:{
P2_2=0;
P2_3=1;
P2_4=0;
}break;
case 4:{
P2_2=1;
P2_3=0;
P2_4=0;
}break;
case 5:{
P2_2=0;
P2_3=0;
P2_4=0;
}break;
default: break;
}
mode= in_menu;
for(i= 0;i<= 9;i++){
dis_num[i]= menu[mode_list][i];}
}break;
case STEP:{
while(legit_f_num == 0){ //是合法的頻率退出
key= get_digit();
if(key == 0x18){
mode= in_menu;
for(i= 0;i<= 9;i++){
dis_num[i]= menu[mode_list][i];}
return;
}
step_f= temp_f;
/*判斷是不是合法的頻率,合法則使循環(huán)結束*/
if((step_f> 0) && (step_f< 10971520)){ //0MHz~(20MHz-10000000) (*和設置頻率不同點,以便10次步進后為20MHz)
show_good();
legit_f_num = 1; //跳出while(legit_f_num == 0)
}else{
show_err();
}
}//end for "while(legit_f_num == 0)"
mode= in_menu;
for(i= 0;i<= 9;i++){
dis_num[i]= menu[mode_list][i];}
//計算步進值,并送ad9851,產(chǎn)生相應的頻率,
if(step_f< 100)step_long= 10;
else if(step_f< 1000)step_long= 100;
else if(step_f< 10000)step_long= 1000;
else if(step_f< 100000)step_long= 10000;
else if(step_f< 1000000)step_long= 100000;
else step_long= 1000000;
for(i= 0;i<= 10;i++){ //實際進行11次步進
temp_f= i*step_f;
input9851(temp_f);
delay(7); //等待頻率穩(wěn)定
res_u= get_u();
res_u+= u_zero; //加上零偏值
/*
dis_num[0]= 0x6D;
dis_num[1]= 0x76;
dis_num[2]= 0x08;
dis_num[3]= 0x3E;
*/
//不高兩位
//dis_num[4]= digit[0][((int)(res_u/100))%10];
//dis_num[5]= digit[0][((int)(res_u/10))%10];
step_u[i][0]= digit[1][((int)res_u)%10];
step_u[i][1]= digit[0][((int)(res_u*10))%10];
step_u[i][2]= digit[0][((int)(res_u*100))%10];
step_u[i][3]= digit[0][((int)(res_u*1000))%10];
show_good();//步進完一次顯示一下成功(因為此過程可能比較長,使用戶知道還在正常運行)
}
have_step= 1; //設置過步進(用于向上、向下鍵控制時的判斷)
if((step_f> 0) && (step_f< 20971520)){ //再控制ad9851設置為設定的頻率
input9851(setf_f);
}
}break;
default:break;
}
}else{ //+別的情況//
show_err();
}
}break;/*end case 0x88*/
default:break;
}/*end switch(key)*/
}/*end key_process*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -