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

📄 timer00.c

📁 这是一个带键盘处理
💻 C
字号:
//------------------------------------------------------------------------------
// Project: 	TIMER FOR ATMEL 89S52 MCU AND THE DISPLAY WITH MAX7219
//
// Filename: 	Timer00.c
// Version: 	1.0.0
// Description:	
//
//				CPU Frequency: 6 MHz
//
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
// Header files
//------------------------------------------------------------------------------#include <stdio.h>//  
#include <string.h>//
#include <absacc.h> //
#include <stdlib.h>//
#include <regx52.h>
//#include <float.h>
//#include <math.h>


void Initial();
unsigned char keysub(void);
void keyoff(void);
void keykey(unsigned char tmp);
unsigned int Dis7219(unsigned int a, unsigned int b);
void Delay(unsigned int a);

sbit led1=P3^7;
sbit led2=P3^6;
sbit speaker=P2^4;

unsigned char keytemp=0xff;
unsigned char keynum=0x00;
unsigned char symbol=0;         //设定键值 
unsigned char key=0x00;
 

main(void){
	unsigned int data x=1;
	unsigned int data y=0x0014;
	unsigned char i=0;
	unsigned int data j=0x003b;

	P0=0xff;P1=0xff;P2=0xff;P3=0xff;
	Initial();	
	speaker=1;
START:	   
	while(symbol==0){	
		led1=1;led2=1;i=0;	//Light the diodes	
		while(i<58){
			Delay(100);
			i++;
			if (symbol==1){
				break;
			}
		}
		led1=0;led2=0;i=0;		
		while(i<58){
			Delay(100);	 //half a second
			i++;
			if (symbol==1){
				break;
			}
		}

		x--;
		if (x==0&&y==0){
			break;		 
	  	}

		if ((x==0)&&(y!=0)){
			y--;
			x=0x003b;
		}
		Dis7219(y,x); 
	}
	Dis7219(y,x);    
	while((x==0)&&(symbol==0)){
		speaker=0;i=0;
		while(i<58){
			Delay(100);
			i++;
		}
		speaker=1;i=0;		
		while(i<58){
			Delay(100);
			i++;
		}
		
	}

	EX0=0;j=0;speaker=1;
	while(symbol==1){
		keytemp=y; 
		keysub();
		if (key==1){	  //Done key  P0.6
			speaker=0;
			Delay(500);
			Delay(500);
			speaker=1;
			break;
		}	 
		else if(key==2){	// Increasing key P0.5
			y=y+keynum;
			x=0;
		}	   	
		else if(key==3){ 	   // Decreasing key P0.4
			y=y-keynum;
			x=0;
		}	   		
		else if(key==4){	   // Configuring key P0.7
			
		}					

		if (y>=99){
			y=0;
			keytemp=0;
		}
		keynum=0;
		Dis7219(y,x);
		
	} 
	symbol=0;EX0=1;x=1;
	keynum=0;	 

goto START;
}

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

//键盘键值判断 
unsigned char keysub(void){  	//传回键值
  	unsigned char temp1,temp2;//存储P1值 
	
	temp1=P1;               //读P1口 
	Delay(20);               //延时10ms,防抖动 
	temp2=P1; 
	if((temp1==temp2)&&(temp2!=0xff)) 
	{//有键按下 
		if((temp2&0X40)==0){ 
		    key=1;      		//确认键---第6位 
		    keyoff(); 			//键松开 
	 	} 	
	 	else if((temp2&0X20)==0){ 
	 		key=2;      		//增---第5位 
	     	keykey(temp2); 		//连续减
	  	} 	
	  	else if((temp2&0X10)==0){ 
	     	key=3;      		//减---第4位
	     	keykey(temp2); 		//连续增
	  	} 
	  	else if((temp2&0X80)==0){ 
	     	key=4;     			//开/停键---第7位 
		 	keyoff(); 
	  	} 
	 }							//有键按下 
	 else{ 						//无键按下 
	    key=9;     
	    keynum=0;   			//恢复keynum为0,取消连续键值  
	  }
	   
	return(key);      			//返回键值 
} 
//%%%%%%判断键是否松开%%%%%%%%%%%%%%%%%%%%%%
void keyoff(void) 
{ 
	unsigned char temp; 
	while(1) 
	{ 
	  Delay(100);     //延时200ms,以保证按确认键,开停键松开后才进入程序 
	  temp=P1; 
	
//判断健是否松开,如果松开,则退出循环 
	  if(temp==0xff) 
	    { break;} 
	}   
} 
//%%%%%%%判断键是否连续按下%%%%%%%%%%%%%% 
void keykey(unsigned char tmp){ 
	unsigned char temp; 
	Delay(3000);  //延时300us
	temp=P1;   //再读键值  
	
	//如果松开 
	if(temp!=tmp){
		keynum++;//keynum=0;
	}   	 
	else 	//没松开
	{ 
		keynum++; 
	    if(keytemp>=20){ 
	  		keynum=10;
	    } 
	  	if(keytemp<=5){
			Delay(250);Delay(250);Delay(250);
	    } 
	  	else if(keytemp<=10){
	  		Delay(250);Delay(250);
	  	} 
	  	else if(keytemp<=15){
			Delay(50);
	  	} 
	  	else{
			Delay(40);
	  	} 	  
	} 
} 
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void Initial(void){
	SCON=0x50;TMOD=0x11;PCON=0;
	TCON=0x00;	  //set to specify level-sensitive detection (i.e., zero level).
	T2CON=0x34;
	EA=1;ET0=1;EX0=1;symbol=0;	//
   	RCAP2H=0xfe;            
   	RCAP2L=0xdf;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%	
void Ext0_INT (void) interrupt 0{	 	
	symbol=1;						 
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void Timer0_INT(void) interrupt 1{
	symbol=0;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void Delay(unsigned int a){				//crystal 4M; Instruction Cycles:1us;  a=1, time=1.019ms
	unsigned int i=0;
	unsigned int j=0;
	unsigned int m=20;
	while(i<a+m)
		i++;
		while(j<(a+m))
			j++;
}

⌨️ 快捷键说明

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