📄 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> //输入频率数据
#include<get_digit.c> //取得频率数据
#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; //转到子菜单
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:{
//初始化数字缓存
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:{
//初始化数字缓存
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;
}
/*判断是不是合法的频率,合法则使循环结束*/
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,产生相应的频率
input9851(setf_f);
}
case SE_U:{
switch(mode_set_u_list){ //硬件开关转换
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;
/*判断是不是合法的频率,合法则使循环结束*/
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,产生相应的频率,
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); //等待频率稳定
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 + -