?? key.c
字號:
/*
* Copyright (c) 2005, 廣州力源電器公司開發部
* All rights reserved.
* 文件名稱:key.c 負責驅動鍵盤以獲得按鍵狀態
* 當前版本: 1.0
* 作者: 張洪強
* 完成日期: 2005.7.25
*/
#include <iom8v.h>
#include <macros.h>
#include <eeprom.h>
//#include <interrupt.h>
#include "init.h"
extern void CHECK_EDATA_A(void);
unsigned char key_scan(void) //鍵盤函數
{
if(!( PINB & 0x01 )) //是第一行
{
return POWER_DOWN; //電源鍵按下
}
else if(!( PINB & 0x02 )) //是第二行
{
return A_V_DOWN; //電流/電壓切換鍵按下
}
else if(!( PINB & 0x04 )) //是第二行
{
return CC_CV_DOWN; //穩流/穩壓切換鍵按下
}
else if(!( PINB & 0x08 )) //是第二行
{
return AUTO_MAN_DOWN; //自動/手動切換鍵按下
}
return 0; //返回鍵值
}
unsigned char key_down(void) //判鍵盤是否活動函數
{
if (( PINB & 0x0f) != 0x0f ) //如果有鍵按下
{
return 1; //返回1
}
else
{
return 0; //否則返回0
}
}
void key_board(void)
{
unsigned char key_first, key_end, key_press = 0;
static unsigned int KEY_DOWN_TIME = 0,NUM_CHANGE = FALSE,i = 0;
if ( ( TIMER_NUM > 500 ) && SET_STATU )
//如果超時
{
SET_STATU = FALSE;
TIMER_EN = FALSE;
if ( NUM_CHANGE )
{
NUM_CHANGE = FALSE;
eeprom_busy_wait();
cli();
eeprom_write_block( (char*)MAX_A,(char*)0x20,6 );
sei();
}
KEY_DOWN_TIME = 0;
TIMER_NUM = 0;
delayMS(100); //延時10MS
}
if ( key_down() )
{
key_first = key_scan(); //得到鍵值
delayMS(20); //延時10MS;
key_end = key_scan();
if ( key_end == key_first )
{
key_press = KEY_TEMP ^ key_end;
if ( key_end == A_V_DOWN ) //如果是電壓/電流切換鍵
{
KEY_DOWN_TIME++; //按鍵記時
if ( KEY_DOWN_TIME > 1000 ) //如果持續按下
{
SET_STATU = TRUE;
TIMER_EN = TRUE;
KEY_DOWN_TIME = 0;
}
}
if (( KEY_INPUT == AUTO_MAN_DOWN ) && SET_STATU )
//如果是電壓/電流切換鍵
{
SET_STATU = FALSE;
TIMER_EN = FALSE;
if ( NUM_CHANGE )
{
NUM_CHANGE = FALSE;
eeprom_busy_wait();
cli();
eeprom_write_block( (char*)MAX_A,(char*)0x20,6 );
sei();
}
key_press = 0x00;
KEY_INPUT = 0x00;
KEY_DOWN_TIME = 0;
TIMER_NUM = 0;
delayMS(100); //延時10MS
}
}
if ( key_press )
{
KEY_INPUT = KEY_TEMP = key_end;
if ( !SET_STATU )
{
//處理電源鍵
if ( KEY_INPUT == POWER_DOWN )
{
POWER_STATE = !POWER_STATE; //改變電源按鍵的狀態
KEY_INPUT = 0;
if ( POWER_STATE )
{
PORTB |= ( 1 << POWER ); //開啟電源
eeprom_busy_wait();
cli();
eeprom_write_byte ( (char*)0x07, 0x01 );
sei();
}
else
{
PORTB &= ~( 1 << POWER ); //關閉電源
eeprom_busy_wait();
cli();
eeprom_write_byte ( (char*)0x07, 0x00 );
sei();
}
}
//處理電流/電壓切換,默認狀態是顯示電壓
else if ( KEY_INPUT == A_V_DOWN )
{
KEY_A_V_STATE = !KEY_A_V_STATE; //切換AV狀態
KEY_INPUT = 0;
if ( KEY_A_V_STATE )
{
PORTB |= ( 1 << OUT_A ); //顯示電流
eeprom_busy_wait();
cli();
eeprom_write_byte ( (char*)0x01, 0x01 );
sei();
}
else
{
PORTB &= ~( 1 << OUT_A ); //顯示電壓
eeprom_busy_wait();
cli();
eeprom_write_byte ( (char*)0x01, 0x00 );
sei();
}
}
//處理穩流/穩壓切換,默認狀態是穩流
if ( KEY_INPUT == CC_CV_DOWN )
{
KEY_CC_CV_STATE = !KEY_CC_CV_STATE;
//改變穩流/穩壓按鍵的狀態
KEY_INPUT = 0;
if ( KEY_CC_CV_STATE )
{
PORTB |= ( 1 << OUT_CV ); //穩壓
eeprom_busy_wait();
cli();
eeprom_write_byte ( (char*)0x05, 0x01 );
sei();
}
else
{
PORTB &= ~( 1 << OUT_CV ); //穩流
eeprom_busy_wait();
cli();
eeprom_write_byte ( (char*)0x05, 0x00 );
sei();
}
}
//處理手動/自動切換,默認狀態是手動
if ( KEY_INPUT == AUTO_MAN_DOWN )
{
KEY_AUTO_MAN_STATE = !KEY_AUTO_MAN_STATE;
//改變手動/自動按鍵的狀態
KEY_INPUT = 0;
if ( KEY_AUTO_MAN_STATE )
{
PORTB |= ( 1 << OUT_AUTO ); //自動
eeprom_busy_wait();
cli();
eeprom_write_byte ( (char*)0x03, 0x01 );
sei();
}
else
{
PORTB &= ~( 1 << OUT_AUTO ); //手動
eeprom_busy_wait();
cli();
eeprom_write_byte ( (char*)0x03, 0x00 );
sei();
}
}
}
}
}
else
{
KEY_INPUT = KEY_TEMP = 0x00;
KEY_DOWN_TIME = 0;
}
if ( SET_STATU )
{
CHECK_EDATA_A();
if ( KEY_INPUT == POWER_DOWN )
{
i++;
TIMER_NUM = 0;
NUM_CHANGE = TRUE;
if ( ( i % 25 ) == 0 )
{
if ( MAX_A[0] > 0 )
{
MAX_A[0]--;
MAX_A[1] = MAX_A[2] = MAX_A[0];
}
}
}
else if ( KEY_INPUT == CC_CV_DOWN )
{
i++;
TIMER_NUM = 0;
NUM_CHANGE = TRUE;
if ( ( i % 25 ) == 0 )
{
if ( MAX_A[0] < 2000 )
{
MAX_A[0]++;
MAX_A[1] = MAX_A[2] = MAX_A[0];
}
else
{
MAX_A[1] = MAX_A[2] = MAX_A[0] = 0;
}
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -