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

📄 w79e825.c

📁 华邦单片机W79E825用AD实现键盘扫描的源代码
💻 C
字号:
/****************************************************************************/
/*     深圳恒森微电子有限公司  (华邦单片机香港及中国区代理商)		        */
/*     香港恒森科技有限公司    (华邦单片机香港及中国区代理商)		        */
/*     陈文    email:chenwen@hengsen.cn (有 bug 请提交)                   */
/****************************************************************************/
/*  文件名:	W79e825.c														*/
/*	版本					1.0												*/
/*  创建日期:				2007-10-29 10:58								*/
/*  概述:	本文件为 w79e825 kit demo 软件									*/
/*--------------------------------------------------------------------------*/
/*  历史修改记录:															*/
/*  名字                   日期                   注释						*/
/*  陈文                   2007.10.28           ver 1.0						*/
/****************************************************************************/
#include <w79e825.h>
#include <intrins.h>

#define uint8 unsigned char
#define uint16 unsigned int
#define uchar unsigned char
#define uint unsigned int

uint8 led[2];
//led code 共阳极       0    1   2    3    4    5    6    7    8     9   a     b   c     d    e   f    灭  高位先出  bit顺序 h,g,f,e,d,c,b,a : Q1--a.....Q8--h
//uint8 code tab[17] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0x0a,0x86,0x8e,0xff};
uint8 code tab[17] = {0x41,0xf5,0x0d,0x15,0xb1,0x13,0x03,0xd5,0x01,0x11,0x81,0x83,0xc6,0x0a,0x86,0x8e,0xff};

sbit Csg1 = P1^6;			
sbit Csg0 = P1^7;


#define nop() _nop_();_nop_();_nop_();_nop_();

void init_cpu(void);
void Display(void);
uchar key_scan(void);
void ADC_Select(ADC_C);
void ADC_EN(void);
void ADC_DIS(void);
uchar basetime;
uchar sec;
uchar min;
uchar adc_save;
uchar key_time;
uchar key_valume;

//每10毫秒中断一次
void Timer0_int(void) interrupt 1 using 1
{
	TL0 = 0x0f;
	TH0 = 0xdb;				
	TF0 = 0;
	
	key_time++;
	if(99 != basetime)
	{
		basetime++;
		return;
	}
	basetime = 0;
	if(59 != sec)		//1分钟
	{		
		sec++;
		return;
	}
	else 
	{
		sec = 0;		
		min++;
	}
}

void main(void)
{	
	uchar sec_save;
	uchar base_save;
	key_time = 0;
	init_cpu();	
	P07 = 0;	
	led[0] = 0;
	led[1] = 0x10;
	Display();
	for(;;)
	{	
		if(key_time>=2)
		{
			key_valume = key_scan();		//20ms
		}
		if(base_save != basetime)
		{
			base_save = basetime;
			if(key_valume != 0xff)
			{
				led[0] = key_valume;
				led[1] = 0x10;
			}
			Display();
		}		
		if(sec_save != sec)
		{
			sec_save = sec;			
			P07 = (!P07);
		}
	}
}

void init_cpu(void)
{	
	P0M1 = 0x00;
	P0M2 = 0x1f;

	P0 = 0xff;
	P1M1 = 0x00;
	P1M2 = 0xc0;
	P1 = 0xff;
//	P2M1 = 0x03;
//	P2M2 = 0;
//	P2 = 0x03;					//IO初始化完成	
	
	TMOD = 0x21;	
	SCON  = 0x50;			/* SCON: mode 1, 8-bit UART, enable rcvr      */	
	TH1   = 0xfd;            /* TH1:  reload value for 9600 baud @ 11.0592MHz   */
    TL1   = 0xfd;			
    TR1   = 1;  			//T1 timer run
   // ES    = 1;				//uart interrupt enable	
	EA = 1;					//all interrupt enable
	P1 = 0xff;
	
	TL0 = 0x0f;
	TH0 = 0xdb;
	ET0 = 1;
	TR0 = 1;	
	
	basetime = 0;		//init timer 
	sec = 0;
	min = 0;
}



void Display(void)
{
	bit  B_disp_flag;	
	uint8 temp;
	Csg1 = 1;
	Csg0 = 1;
	if(B_disp_flag == 1)
	{
		B_disp_flag = 0;
		temp = led[0];
		temp = tab[temp];
		P0 &= 0xe0;
		P0 |= (temp&0x1f);
		P1 &= 0xe3;
		P1 |= ((temp >> 3)&0x1c);
		Csg1 = 1;
		Csg0 = 0;
	}
	else
	{
		B_disp_flag = 1;
		temp = led[1];
		temp = tab[temp];//&0xfe;		//小数点
		P0 &= 0xe0;
		P0 |= (temp&0x1f);
		P1 &= 0xe3;
		P1 |= ((temp >> 3)&0x1c);
		Csg0 = 1;
		Csg1 = 0;
	}	
}


void ADC_Select(ADC_C)
{
	switch(ADC_C)
    {
	    case 0:P0M1|=0x08;P0M2&=0xF7;ADCCON=0;P0|=0x08;break;
	    case 1:P0M1|=0x10;P0M2&=0xef;ADCCON=1;P0|=0x10;break;
	    case 2:P0M1|=0x20;P0M2&=0xdf;ADCCON=2;P0|=0x20;break;
	    case 3:P0M1|=0x40;P0M2&=0xbf;ADCCON=3;P0|=0x40;break;
	    default: break;
    }
}

void ADC_EN(void)
{
	AUXR1|=0x04;
}

void ADC_DIS(void)
{
	AUXR1&=0xFB;
}


#define k1_adc 678
#define k2_adc 512
#define k3_adc 308
#define k4_adc 167
uchar key_scan(void)
{
	uchar adc_h,adc_l;
	uint adc_data;
	ADC_Select(3);	//select channel
	ADC_EN();		//enable adc
	ADCCON = ADCCON | 0x08;	//start adc
	while(!(ADCCON & 0x10));//wait adc finish
	adc_h = ADCH;
	ADCCON = ADCCON & 0xF7;	//DISABLE adc
	adc_l = ADCCON;
	ADC_DIS();
	adc_l = adc_l>>6;
	adc_data = adc_h;
	adc_data = adc_data<<2;
	adc_data = adc_data | adc_l;	
	
	if((adc_data>k1_adc-32)&&(adc_data<k1_adc+32))		//+/-32是电阻误差范围
	{
		return 1;
	}
	if((adc_data>k2_adc-32)&&(adc_data<k2_adc+32))
	{
		return 2;
	}
	if((adc_data>k3_adc-32)&&(adc_data<k3_adc+32))
	{
		return 3;
	}
	if((adc_data>k4_adc-32)&&(adc_data<k4_adc+32))
	{
		return 4;
	}
	return 0xff;
}

⌨️ 快捷键说明

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