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

📄 main.c.bak

📁 arm7平台上相关键盘操作的驱动程序
💻 BAK
字号:
/****************************************Copyright (c)**************************************************/
/**                                
;**                                 西南科技大学计算机科学学院
;**                                   
;**                                http://www.cs.suswt.edu.cn
;**            
;**             日期:   2007/
;**             描述:   
;**             作者:
;**
;**--------------*.*文件
;**------------------------------------------------------------------------------------------------------*/

/**------------------------------------------------------------------------------------------------------
 ********************************************************************************************************/

/************************************************
 *          Header File                         * 
 ***********************************************/
 #include"config.h" 
 
 
/************************************************
 *				Macros                          *
 ***********************************************/
 //数码管相关宏定义
 #define LED_NUMBER   0x08 
 #define LED_RCLK     0x00100000               //P0.20 RCLK  遇到同步发送脉冲rclk时,将多位数据一次发送到寄存器中,形成一个相当于8位或多位的并行数据
 #define LED_SRCLK    0x00020000               //P0.17   SRCLK  srclk的高电平发出移位信号,每位数据都移动到下一个移位寄存器中
 #define LED_SER      0x00040000               //P0.18    SER
 #define LED_PINSEL   0xfffffcc3               //110011000011
 #define LED_KEY      0x00080000
 //键盘相关宏定义
 #define  KEY_PINSEL  0xffff00ff
 #define  KEY_SRCLK   0X00000010 
 #define  KEY_SI      0x00000040
 #define  KEY_RCLK    0x00000080
 #define  KEY_KEY     0x00000020 

/************************************************
 *          Globale variable					*
 ***********************************************/
 //数码管相关变量                        //0    1   2    3    4    5    6    7    8     9
 const uint8 led_dis_content[0x10] =	{0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xe6,
                                         //a    b    c    d   e     f 
                                         0xee,0x3e,0x9c,0x7a,0x9e,0x8e};	
 uint8 led_dis_mem[LED_NUMBER] ; 
 uint8 led_dis_bit = 0x00;
 uint8 led_dis_pos = 0xfe;
 //键盘相关变量
 uint8 key_data=0x0f;//键盘初始状态
 uint8 tmp = 0x00;
/************************************************
 *           Function declaration               *
 ***********************************************/
 //数码管相关函数
 void LEDInit(void);                           //数码管初始化设置
 void LEDSendData(uint8 disdata,uint8 dispos); //数码管片选信息和数据信息输入
 void LEDScan(void);                           //数码管扫描函数
 void LEDPrint(uint32 disdata);                //数码管显示函数
 
 //键盘相关函数
 void KEYShift(uint8 mode);                    //数据移位函数
 uint8 KEYScan(void);						   //键盘轮转扫描函数
 void KEYInit(void);						   //键盘初始化设置
 
 //系统初始化程序
 void DeviceInit(void);                        //系统初始化
  
 
 int main(void)
 { 
 	DeviceInit();
 	LEDPrint(0x2007f1fa);
 	while(1)
 	{
 		LEDScan();
 		LEDPrint(KEYScan());
 	} 	
 }
 
/*******************************************************************************
Function Name:	void KEYShift(uint8 mode)   								   *
Function Description :	进行轮转扫描时进行数据移位操作						   *	
*******************************************************************************/ 
void DeviceInit(void)
{
	LEDInit();
	KEYInit();
}
 
 //**-------------------------   键盘扫描部分 -------------------------------**/
 //**               														 **/
 
 
/*******************************************************************************
Function Name:	void KEYShift(uint8 mode)   								   *
Function Description :	进行轮转扫描时进行数据移位操作						   *	
*******************************************************************************/
void KEYShift(uint8 mode)                      //如果mode是0就将KEY_SI置零 如果mode是1就将KEY_SI置1
{
  
     IO0CLR=KEY_RCLK;                          //RCLK=0x00
     	
	 IO0CLR=KEY_SRCLK;                         //SRCLK=0
		if((mode&0x01)==0x00)                  //该位为0
		    {
		        IO0CLR = KEY_SI;
		    }
		else
		    {
		        IO0SET = KEY_SI;
		    } 
	IO0SET=KEY_SRCLK;                           //SLK=1
	 
    IO0SET=KEY_RCLK;                           //RCK=0x00 
}

/*******************************************************************************
Function Name:	 uint8 KEYScan(void)										   *
Function Description :	键盘扫描函数,进行轮转扫描							   *	
*******************************************************************************/
uint8 KEYScan(void)
{
 
 //KeyData变化范围为0x00----0x0f
 //扫描过程
 //先进行键盘判断上次键盘的判断
  
  if((IO0PIN&KEY_KEY)==0)                     //有键按下(IO0PIN&KEY_KEY)== 0,即key位为0
    {
       tmp = key_data;
       return key_data;
    }                                         //如果有键盘按下,连续对该键进行扫描,返回该键键值。
  else
    {
       if(key_data==0x0f)
         {
           key_data=0x00;
           KEYShift(0);
         }
       else
         {
           key_data++;
           KEYShift(1);
         }
      return tmp;//0x10;    
    }                                         //没有键盘按下,进行扫描轮转。
}

/*******************************************************************************
Function Name        : void KEYInit(void)									   *
Function Description : 键盘的初始化程序,包括设置引脚链接模块,引脚输入输出设置*	
*******************************************************************************/
void KEYInit(void)
{
    PINSEL0&=KEY_PINSEL;                      //端口选择,这里选择P0.4~P0.7实现GPIO功能
    IO0DIR|=KEY_SRCLK;                        //方向输出
    IO0DIR|=KEY_RCLK;                         //方向输出
    IO0DIR|=KEY_SI;                           //方向输出
    IO0DIR&=(KEY_KEY^0XFFFFFFFF);             //方向输入    
}


//**-------------------------------------------------------------------------------**/
//                                 数码管部分                                       //

/*******************************************************************************
Function Name        :	void LEDInit(void)									   *
Function Description :	LED灯初始化设置,包括引脚连接模块和输入输出设置		   *	
*******************************************************************************/
void LEDInit(void)
 {
 	PINSEL1 &= LED_PINSEL;                    //端口选择,这里选择P0.17,P0.18,P0.20,实现GPIO功能
 	IO0DIR |= LED_SRCLK;                       
 	IO0DIR |= LED_RCLK;
 	IO0DIR |= LED_SER;
 	IO0DIR &= LED_KEY^0xffffffff;             //方向为输入  	 	
 }
 
/*******************************************************************************
Function Name        :	 void LEDSendData(uint8 disdata,uint8 dispos)		   *
Function Description :	 串行发送数据,发送8为数据位,8位片选位                *	
*******************************************************************************/ 
 void LEDSendData(uint8 disdata,uint8 dispos)
 {
 	uint16 datatmp = 0x0000;
 	uint8 tmp = 0x00; 	
 	datatmp = ((datatmp|disdata)<<8)|dispos;   //先发送8位片选位
 	
 	IO0CLR = LED_RCLK ;
 	for(tmp = 0x00;tmp<0x10;tmp++)
 	{
 		IO0CLR = LED_SRCLK;
 		if(datatmp&0x01==0x01)
 		{	
 			IO0SET = LED_SER;
 		}
 		else
 		{ 
 			IO0CLR = LED_SER; 		
 		}
 		datatmp = datatmp>>1;
 		IO0SET = LED_SRCLK; 		
 	}
 	IO0SET = LED_RCLK; 	
 }
 
/*******************************************************************************
Function Name        :	void LEDScan(void)									   *
Function Description :	数码管扫描程序  									   *	
*******************************************************************************/  
void LEDScan(void)
 {
 	LEDSendData(led_dis_mem[led_dis_bit],led_dis_pos);
 	led_dis_bit++;
 	led_dis_pos = (led_dis_pos<<1)|0x01;
 	if(led_dis_bit == LED_NUMBER)
 	{
 		led_dis_bit = 0x00;
 		led_dis_pos = 0xfe;
 	}
 }
 
/*******************************************************************************
Function Name        :	void LEDPrint(uint32 disdata)						   *
Function Description :	数码管显示程序,让缓存区的数据在数码管上面显示。入口参 *
                        数是一个32位的数据,使用时以0x的形式,即十六进制的形式 *
                        传参。                                                 *	
*******************************************************************************/
void LEDPrint(uint32 disdata)
 {
 	uint8 tmp;
 	for(tmp=0x00;tmp<0x08;tmp++)
 	{ 		
 		led_dis_mem[tmp] = led_dis_content[disdata&0x0000000f];
 		disdata = disdata>>4;
 	} 	 	
 }

/*****************************************************************************
 *                         End of Entire File                                *
 ****************************************************************************/


⌨️ 快捷键说明

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