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

📄 de.c

📁 本程序是按键程序,通过RS232串口显示按键值,按键扫描是用定时器T0来实现的,特别适合初学者学习学习
💻 C
字号:
/**********************************************************************
/* 文件名称: de.C																			
/* 文件标识: none
/* 适用器件: C8051F120 
/* 摘 要: 本文件是键盘子程序;使用外部22.1184MHz晶振. 
/* 当前版本:1.0
/* 作 者:李国涛
/* 完成日期:2007年11月2日
/***********************************************************************/

/**********************************************************************/
//INCLUDE引用外部头文件	

#include <c8051f120_VarantReg.h> 
#include <ABSACC.H>		
#include "da-i.c"

/**********************************************************************/

/************************************************************************
// 常量及全局变量定义
************************************************************************/
/***********************************************************************/

unsigned char Key_Value_Table[48]={ 0x53,0x30,0x31,0x53,0x30,0x32,0x53,0x30,0x33,0x53,0x30,0x34, //S01,S02,S03,S04
                                    0x53,0x30,0x35,0x53,0x30,0x36,0x53,0x30,0x37,0x53,0x30,0x38, //S05,S06,S07,S08
                                    0x53,0x30,0x39,0x53,0x31,0x30,0x53,0x31,0x31,0x53,0x31,0x32, //S09,S10,S11,S12
                                    0x53,0x31,0x33,0x53,0x31,0x34,0x53,0x31,0x35,0x53,0x31,0x36};//S13,S14,S15,S16		 
                                  
uchar rs232_send_size;
uchar key;    //key 是执行keyscan读取的值 
uchar temp;  //temp是执行KeySPI的结果

/*	TIMER0 INI 	*/
bit time_1ms_flag;
bit time_10ms_flag;
bit time_50ms_flag;
bit time_100ms_flag;
bit time_500ms_flag;
bit time_1s_flag;
bit time_60s_flag;
sbit P3_5=P3^5;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
uchar time_1ms;
uchar time_10ms;
uchar time_50ms;
uchar time_100ms;
uchar time_500ms;	
uchar time_1s;
uchar time_60s;
bit send_flag ;
/************************************************************************/ 

/************************************************************************

* 函数名称:send_232;

* 函数功能描述:向232发送字符到SBUF0;

************************************************************************/

void send_232(send_232_end,uchar send_232_code[])  
{	
  if(rs232_send_size<send_232_end)

	{
	  SBUF0=send_232_code[rs232_send_size];
	  rs232_send_size++;
    }
}

/******************************************************
* 函数名称:serial_0();
*
* 函数功能描述:UART0采用定时中断的方式通过串0口发送字符,字符个数为3个
*              
* 输入参数:none
*
* 返回数据:none;
******************************************************/

void serial_0(void) interrupt 4
{	                 
  if ( TI0 )                
   {										
	  send_232(3,&Key_Value_Table[3*temp-3]);  
	  TI0=0;
	}
     if ( RI0 )                   
	  {
	     RI0=0;
	   }		  
}

/*********************************************************

* 函数名称:delay();
*
* 函数功能描述:是一个延时程序;
*              
* 输入参数:x1
*
* 返回数据:none;

********************************************************/

void delay(int x1)
{
  unsigned int y1;
  for (y1=1;y1<x1;y1++);
}

/**********************************************************
*将按键的原代码转化为1--16

* 函数名称:char KeySPI();
*
* 函数功能描述:执行keyscan函数出来的编码原则是  {11 21 41 81}	如果要显示1--16的数值.那么就用case语句.再返回数值;
							                     {12 22 42 82}
							                     {14 24 44 84}
							                     {18 28 48 88}	             
* 输入参数:key;
*
* 返回数据:temp;
***********************************************************/
unsigned char KeySPI(unsigned char key)
{
	switch(key)
	{
		case 0x11: 		return 1;//0x01 	   
		break;
		case 0x21: 		return 2;//0x02
		break;
		case 0x41: 		return 3;//0x03
		break;
		case 0x81: 		return 4;//0x04
		break;
		case 0x12: 		return 5;//0x05
		break;
		case 0x22: 		return 6;//0x06
		break;
		case 0x42: 		return 7;//0x07
		break;
		case 0x82: 		return 8;//0x08
		break;
		case 0x14: 		return 9;//0x09
		break;
		case 0x24: 		return 10;//0x0a
		break;
		case 0x44: 		return 11;//0x0b
		break;
		case 0x84: 		return 12;//0x0c
		break;
		case 0x18: 		return 13;//0x0d
		break;
		case 0x28: 		return 14;//0x0e
		break;
		case 0x48: 		return 15;//0x0f
		break;
		case 0x88: 		return 16;//0x10
		break;
		default: 		return 0x00;
		break;
	}
}

/***********************************************************

* 函数名称:getkey();

* 函数功能描述:按键的扫描判断与取值  
          
* 输入参数:none;
*
* 返回数据:none;
*
* 注    意:none;
              
**********************************************************/
unsigned char getkey(void)
{
  uchar h;	                      //行扫描值
  uchar l;          	          //列扫描值
  SFRPAGE=CONFIG_PAGE ;
  P5=0xF0;	                      //P5.0~P5.3	发全0.准备读列的状态
 if((P5&0xF0)!=0xF0)              //如果P5.4~P5.7不全为1,可能有键按下
 {
   delay(100);	
   delay(100);			         //延时去抖动

   if((P5&0xF0) != 0xF0)         //重读高4位,如果还是不全为1,有按键按下
   {
     h=0xFE;	                 //P5.0置0,开始行扫描
 while((h&0x10)!=0xF0)	         //判断是否为最后一行,若不是继续扫描=F0的时候表示没有到最后一行;
    {					          //如果为F0,那么还没有到最后一行;如果不为F0那么就已经到最后一行;
       P5=h;
       delay(100);			 

      if((P5&0xF0) != 0xF0)	     //如果P5.4~P5.7不全为1,可能有键按下
        {
          l=((P5&0xF0)|0x0F);	 //保留P5口高四位.低四位变为1,作为列值
		  delay(100);
          return ((~h)+(~l));	 //按键值=行扫描值+列扫描值	                   
		 
        }
      else				        //如果该行无键按下,行扫描值左移.扫描下一行
        
	      h=(h<<1)|0x01;        //这样做保证每一次就只有一位为"0"
	    
    }
  }
 }
  return 0;                    //无键按下,返回0
  } 

/*************************************************
* 函数名称:keyup();

* 函数功能描述:按键的释放;
          
* 输入参数:none;
*
* 返回数据:none;
*
* 注    意: none;
**************************************************/

  
uchar keyup(void)
{
	unsigned char val=0xff;
	while(1)
	{
		val=getkey();
		if(val != 0)
		break;
	}
	while(1)
	{
		if(val!=getkey())break;
	}
	return val;
} 

 /**************************************************
 * TIMER0  

 *定时器0;
 ***************************************************/

timer0() interrupt 1
{ 
  TH0=0xfa;
  TL0=0x00;                   //1ms的初始值
  time_1ms_flag=1;
  time_10ms++;
 if(time_10ms == 10)
  {
     time_50ms++;
	 time_10ms=0;
	 time_10ms_flag=1;
  }
if(time_50ms == 5)	     //设置50ms扫描一次键盘
 {
     time_100ms++;
     time_50ms = 0;
     time_50ms_flag = 1;	  
     key=keyup();	        //按键扫描
   if( key!= 0 )         //表示有按键按下      
    {
      send_flag = 1;
     }
  } 	  
 if(time_100ms == 2)
   {time_500ms++;time_100ms=0;time_100ms_flag=1;}
 if(time_500ms == 5)
   {time_1s++;time_500ms=0;time_500ms_flag=1;}
 if(time_1s == 2)
   {time_60s++;time_1s=0;time_1s_flag=1;}
 if(time_60s == 60)
   {time_60s=0;time_60s_flag=1;}                 
}

/************************************************************************

//主循环程序

*LED灯点亮表示等待按键.

************************************************************************/

void main()
{
  Init_Device(); 
  SFRPAGE=UART0_PAGE;
  P3_5=1;
  P2_4=1;
  P2_5=1;
  P2_6=1;	
  while(1)
   {  
     if(send_flag== 1)     //表示有按键值,下一步的动作就是送串口显示
      { 
	     rs232_send_size=0;
	     temp=KeySPI(key); 
	   	 SFRPAGE=UART0_PAGE;
		 TI0=1;
	   	 send_flag= 0;
		 
	   }	
	}	
}
/***********************************************************************************/
// 文件结束
/***********************************************************************************/

⌨️ 快捷键说明

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