⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key.c

📁 使用AVR单片机做的单相电表项目,采用取最大值的办法计算有效值,算法比较简单,有protel99的原理图.
💻 C
字号:

/*
* Copyright (c) 2005, 广州力源电器公司开发部
* All rights reserved.
* 文件名称:key.c  负责驱动键盘以获得按键状态

* 当前版本: 1.0
* 作者:	 张洪强
* 完成日期: 2005.7.25
*/

#include <avr/io.h>
//#include <avr/iom8.h>
#include <avr/eeprom.h> 
#include <avr/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 + -