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

📄 adc_key.c

📁 实现ucos任务调度时保存LCD上的显示信息
💻 C
字号:
#include "includes.h"

extern OS_EVENT * msgq_key;
/******************************************************
*    P2.1为ADC模拟输入端口
******************************************************/
void PORT2_Init(void)
{
	P2MDIN &=0xFD;     								//模拟输入
  	P2SKIP |=0x02;     								//交叉开关跳过
}


void Delay(unsigned int i)
{
	unsigned char j;
    for(;i>0;i--)
    {
		for(j = 0;j<100;j++);
	}
}

void ADC0_Init(void)
{
  	AMX0P =0x01;       					 			//P2.1为ADC0的模拟输入
  	AMX0N =0x1F;        							//单端方式
  	ADC0CF =0x78;       							//右对齐,16分频  CLK(SAR)=SYSCLK/(AD0SC+1)=3MHz
  	ADC0CN =0x80;       							//ADC0允许,工作于正常方式,向AD0BUSY写1时启动ADC0转换
  	REF0CN =0x0A;       							//VDD为参考电压,关温度传感器,关偏压和电压基准
  	EIE1 |=0x08;	       							//使能ADC0中断

  	Delay(2000);       								//延时等候ADC0初始化稳定   
}


void ADC0_isr(void) interrupt INTERRUPT_ADC0_EOC    //ADC0转换结束中断函数
{    	  		   
	unsigned int ADCNum;
	static char key,flag=0;
	char key_value;   

    AD0INT =0;                    					//清ADC0转换结束中断标志
    AD0WINT =0;                   					//清ADC0窗口比较匹配中断标志,即未发生匹配,不会发生中断

    ADCNum =(ADC0H<<8)+ADC0L;  

    if((ADCNum < 496) || (ADCNum > 528))   			//有按键处在按下的状态
    {
    	if(!flag)
		{
	    	flag =1;    
	  		key =(ADCNum+16)>>5;           			//首次取键值
		} 
		else
		{
			if(key == ((ADCNum+16)>>5))    			//两次采样结果是否相等  
				key =(ADCNum+16)>>5;        		//取第二次键值为最终键值
		}                          
	
  	} 
	switch(key)
	{
		case 0:
			key_value ='*';
			OSQPost(msgq_key, (void *)(& key_value));
			break;
		case 1:
			key_value ='0';
			OSQPost(msgq_key, (void *)(& key_value));
			break;
		case 2:
			key_value ='#';
			OSQPost(msgq_key, (void *)(& key_value));
			break;
		case 3:
			key_value ='9';
			OSQPost(msgq_key, (void *)(& key_value));
			break;
		case 4:
			key_value ='8';
			OSQPost(msgq_key, (void *)(& key_value));
			break;
		case 5:
			key_value ='7';
			OSQPost(msgq_key, (void *)(& key_value));
			break;
		case 6:
			key_value ='4';
			OSQPost(msgq_key, (void *)(& key_value));
			break;
		case 7:
			key_value ='5';
			OSQPost(msgq_key, (void *)(& key_value));
			break;
		case 8:
			key_value ='6';
			OSQPost(msgq_key, (void *)(& key_value));
			break;
		case 9:
			key_value ='3';
			OSQPost(msgq_key, (void *)(& key_value));
			break;
		case 10:
			key_value ='2';
			OSQPost(msgq_key, (void *)(& key_value));
			break;
		case 11:
			key_value ='1';
			OSQPost(msgq_key, (void *)(& key_value));
			break;
		case 12:
			key_value =HANG_UP;
			OSQPost(msgq_key, (void *)(& key_value));
			break;
		case 13:
			key_value =KEY_DOWN;
			OSQPost(msgq_key, (void *)(& key_value));
			break;
		case 14:
			key_value =KEY_LEFT;
			OSQPost(msgq_key, (void *)(& key_value));
			break;
		case 15:
			key_value =OK_ENTER;
			OSQPost(msgq_key, (void *)(& key_value));
			break;
		case 17:
			key_value =KEY_RIGHT;
			OSQPost(msgq_key, (void *)(& key_value));
			break;
		case 18:
			key_value =KEY_UP;
			OSQPost(msgq_key, (void *)(& key_value));
			break;
		case 19:
			key_value =OUT_MENU;
			OSQPost(msgq_key, (void *)(& key_value));
			break;
		case 20:
			key_value =IN_MENU;
			OSQPost(msgq_key, (void *)(& key_value));
			break;
		default:
			break;
	}
}   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -