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

📄 4x4key.c

📁 meg16 的所有功能实例
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               ADEmbed Development Co.,LTD.                                    
**                                 http://www.adembed.com
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2008-12-13
** Last Version:		1.0
** Descriptions:		4*4Key Test.
** 
**------------------------------------------------------------------------------------------------------
** Created by:			junbolu
** Created date:		2008-12-13
** Version:				1.0
** Descriptions:		
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
**ICC-AVR application builder : 2008-12-13
**Target : M16
**Crystal: 7.3728Mhz
**PA0--->L1			PA1--->L2			PA2--->L3			PA3--->L4			
**PA4--->H1			PA5--->H2			PA6--->H3			PA7--->H4	
--------------------------
| H4   C    D    E    F  |
| H3   8    9    A    B  |
| H2   4    5    6    7  |
| H1   0    1    2    3  |
| /    L1   L2   L3   L4 |
--------------------------	   
**描述:扫描4*4按键的状态,扫描到按键被按下后,将此键码发送到串口
**      
**
**涉及知识点:
**          DI输入DO输出
**          while循环,case循环
**			8位定时器,串口的应用
*******************************************************************************************************/

#include<iom16v.h>
#include<macros.h>
#include"Define.h"


#define F_osc           7372800
#define Baud_rate       9600   	   		  		 
//管脚定义
#define PIN_RXD			0 	//PD0   RXD
#define PIN_TXD			1 	//PD1   TXD


#define L1   	     BIT0	
#define L2   	     BIT1
#define L3   	     BIT2
#define L4   	     BIT3
#define H1   	     BIT4	
#define H2   	     BIT5
#define H3   	     BIT6
#define H4   	     BIT7

#define KEY_DDR		 DDRA
#define KEY_PORT	 PORTA
#define KEY_IN		 PINA


#define L1_H1		 0x00
#define L2_H1		 0x01
#define L3_H1		 0x02
#define L4_H1		 0x03
#define L1_H2		 0x04
#define L2_H2		 0x05
#define L3_H2		 0x06
#define L4_H2		 0x07
#define L1_H3		 0x08
#define L2_H3		 0x09
#define L3_H3		 0x0A
#define L4_H3		 0x0B
#define L1_H4		 0x0C
#define L2_H4		 0x0D
#define L3_H4		 0x0E
#define L4_H4		 0x0F

#define ON_PUSH		 0xFF

unsigned char Key_State;
unsigned char Key_Value;

void Uart_Init(void); 
void USART_TXD(uint8 data);

void KEY_Init(void)
{
 KEY_DDR |= L1&L2&L3&L4;  	            //设为输出
 KEY_PORT|= L1&L2&L3&L4;				//输出为高
 KEY_DDR &= ~(H1&H2&H3&H4);				//设为输入
 KEY_PORT|= H1&H2&H3&H4;				//上拉输入
 
 //t/c0初始化
 TCCR0=0X0D;
 TCNT0=0X00;
 OCR0=0XF0;         //定时30ms
 TIMSK|=0X02;
 
}

#pragma interrupt_handler timer0comp:20
void timer0comp (void)
{ 
 Read_Key();
}

//=======================================================================
unsigned char KEYDIN(void)
{
 	KEY_PORT |= L1&L2&L3&L4;				//输出为高
	KEY_PORT &= ~L1;						//扫描L1
	
 	if((KEY_IN&H1)==H1)	 return L1_H1;
	if((KEY_IN&H2)==H2)	 return L1_H2;
	if((KEY_IN&H3)==H3)	 return L1_H3;
	if((KEY_IN&H4)==H4)	 return L1_H4;
	
	KEY_PORT |= L1&L2&L3&L4;				//输出为高
	KEY_PORT &= ~L2;						//扫描L2
	
 	if((KEY_IN&H1)==H1)	 return L2_H1;
	if((KEY_IN&H2)==H2)	 return L2_H2;
	if((KEY_IN&H3)==H3)	 return L2_H3;
	if((KEY_IN&H4)==H4)	 return L2_H4;
	
	KEY_PORT |= L1&L2&L3&L4;				//输出为高
	KEY_PORT &= ~L3;						//扫描L3
	
 	if((KEY_IN&H1)==H1)	 return L3_H1;
	if((KEY_IN&H2)==H2)	 return L3_H2;
	if((KEY_IN&H3)==H3)	 return L3_H3;
	if((KEY_IN&H4)==H4)	 return L3_H4;
	
	KEY_PORT |= L1&L2&L3&L4;				//输出为高
	KEY_PORT &= ~L4;						//扫描L4
	
 	if((KEY_IN&H1)==H1)	 return L4_H1;
	if((KEY_IN&H2)==H2)	 return L4_H2;
	if((KEY_IN&H3)==H3)	 return L4_H3;
	if((KEY_IN&H4)==H4)	 return L4_H4;

	return ON_PUSH;
	
}

//=======================================================================
void Read_Key(void)
{
 switch(Key_State)
     {
  	 case 0:
         if(KEYDIN() != ON_PUSH)
		 	{
			Key_State++;
			}  
		 break;
  	 case 1:
         if(KEYDIN() != ON_PUSH)
		    {
			 Key_State++;
			 Key_Value=KEYDIN();
			}
		 else 
		    {
			Key_State--;
			}
		 break;
     case 2:
         if(KEYDIN() == ON_PUSH)
		    {
			Key_State=0;
			}
		 break;
     }
 
}

void main(void)
{
 KEY_Init();
 
 Key_State = 0;
 Key_Value = ON_PUSH;
 
 Uart_Init();                 //TART初始化
 SEI();                       //全局中断使能
 
 while(1)
     {
     if(Key_Value != ON_PUSH)
         {
	     USART_TXD(Key_Value);
		 Key_Value = ON_PUSH;
	     }
     }
}

//===============================================================
void Uart_Init(void)          //UART初始化
  { 
     
    //设置侦格式
	//异步,8位数据,无奇偶校验,一个停止位,无倍速
	UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
	
    //设置波特率
    UBRRL= (F_osc/Baud_rate/16-1)%256;
    UBRRH= (F_osc/Baud_rate/16-1)/256;

	//使能接收中断,使能接收,使能发送
    UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
  }
  

//===============================================================
void USART_TXD(uint8 data) //发送采用查询方式
{
	while( !(UCSRA & BIT(UDRE)) );
	UDR=data;
	while( !(UCSRA & BIT(TXC )) );
	UCSRA|=BIT(TXC);
}

//=======================================================================

#pragma interrupt_handler USART_RXC:12
void USART_RXC(void)
{
  
}

⌨️ 快捷键说明

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