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

📄 key16.c

📁 一些C8051f330的C程序
💻 C
字号:
//-----------------------------------------------------------------------------
//
// 文件名:key16.c
//
// 编写人:宁太阳 
//
// 编写时间:2005/1/8
//
// 目标器件: C8051F33x
//
// 编译工具: Silicon Laboratories IDE
//
//程序描述:
//--------------------------------------------------------------------------  
//   这个程序可以对一个16*16的键盘扫描,并得到相应的键值,这里可以得到从0—F内的数值,
//按下键后可以在键值缓冲区中观察到相应的数据。
//---------------------------------------------------------------------------                               
// 键盘接线图
//---------------------------------------------------------------------------                                    
//                           P0.4  -------- 0/-------4/-------8/-------12/
//                           P0.5  -------- 1/-------5/--------9/------13/
//                           P0.6  -------- 2/-------6/-------10/------14/
//                           P0.7  ---------3/-------7/-------11/------15/                                     
//                           P0.0  ----------/        /        /        /                    
//                           P0.1  ----------|--------/        /        /
//                           P0.2  ----------|--------|--------/        /
//                           P0.3  ----------|--------|--------|--------/
//                                          | |R1    | |R2    | |R3    | |R4
//                                           |        |        |        |
//                                           |--------|--------|--------|------+3V
//
//-----------------------------------------------------------------------------
// 头文件包含
//-----------------------------------------------------------------------------
#include <c8051f330.h>                 
//
//-----------------------------------------------------------------------------
// 常量定义
//-----------------------------------------------------------------------------
//
#define SYSCLK       24500000 / 8         //  系统工作频率
//
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
//位定义
//-----------------------------------------------------------------------------
sbit LED = P1^3;                          // LED所接的引脚
//-----------------------------------------------------------------------------
//全局变量定义
//-----------------------------------------------------------------------------
unsigned char keydatabuffer;
unsigned char keydata1[20];               //键值存放缓冲区
unsigned char *point;                     //此指针指向键值缓冲区
//-----------------------------------------------------------------------------
// 函数定义
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
unsigned char KEY16(void);
//-----------------------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------------------
void main (void) 
{
unsigned int k; 
   PCA0MD &= ~0x40;                       //禁止看门狗定时器

   SYSCLK_Init ();                        // 系统时钟初始化
                                          
   PORT_Init ();                          // 交叉开关和通用I/O口初始化                                      
   point=&keydata1; 
   for(k=0;k<=20;k++)                     //清空键值缓冲区
      {*point=0x00;
        point++;
	   }
   point=&keydata1;
   P0= 0x0f;
   while (1) 
   {                           
    if(P0!=0x0f)                           //是否有键按下
      {
	  for(k=0;k<=20000;k++);               //延时
	  if(P0!=0x0f)                         //再次判断是否有键按下
		{
		*point=KEY16();                    //获得键值,并将键值送往缓冲区
	     point++;     
		 LED=!LED;       
	     }
	   } 
	  
   }
}

//-----------------------------------------------------------------------------
//系统时钟初始化
//-----------------------------------------------------------------------------
//
void SYSCLK_Init (void)
{

   OSCICN = 0x80;                          // 系统时钟初始化为片内的 24.5MHz / 8                       
                                         
   RSTSRC = 0x04;                         // 使能时钟丢失检测器
}

//-----------------------------------------------------------------------------
// 通用I/O口及交叉开关初始化
//-----------------------------------------------------------------------------

void PORT_Init (void)
{

   XBR0     = 0x00;                       // 没有选择数字外设
   XBR1     = 0x40;                       // 使能交叉开关和弱上拉
   P0MDOUT  = 0x00;
   P1MDOUT |= 0xff;                       // P1.3设为推挽方式
}

//-----------------------------------------------------------------------------
// 键盘扫描程序
//-----------------------------------------------------------------------------
unsigned char KEY16(void)
{
unsigned char data i=0,j=0;
unsigned int data k; 
	      i=P0;  
	      i=~i;
		  i &=0x0f;
		  P0=0xf0;
	      for(k=0;k<=2000;k++);             //等待信号稳定
		  j=P0;
		  j=~j;
		  j &=0xf0;
		  P0=0x0f;
	      i+=j;		  
		  while(P0!=0x0f);                  //等待键释放
	switch (i)                              //以下程序可以得到键值
	{
		case 0x11:return(0);  	         
		          break;
		case 0x21:return(1);
		          break;
        case 0x41:return(2);
		          break;
		case 0x81:return(3);
		          break;
		case 0x12:return(4);
		          break;
		case 0x22:return(5);
		          break;
		case 0x42:return(6);
		          break;
		case 0x82:return(7);
			   	  break;
		case 0x14:return(8);
		          break;
		case 0x24:return(9);
		          break;
		case 0x44:return(10);
		          break;
		case 0x84:return(11);
		          break;
		case 0x18:return(12);
		          break;
		case 0x28:return(13);
		          break;
        case 0x48:return(14);
		          break;
		case 0x88:return(15);
		          break;
        default:return(16);              //无效值
	       
	 }
}

⌨️ 快捷键说明

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