?? 4x4key.c
字號(hào):
/****************************************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按鍵的狀態(tài),掃描到按鍵被按下后,將此鍵碼發(fā)送到串口
**
**
**涉及知識(shí)點(diǎn):
** DI輸入DO輸出
** while循環(huán),case循環(huán)
** 8位定時(shí)器,串口的應(yīng)用
*******************************************************************************************************/
#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; //設(shè)為輸出
KEY_PORT|= L1&L2&L3&L4; //輸出為高
KEY_DDR &= ~(H1&H2&H3&H4); //設(shè)為輸入
KEY_PORT|= H1&H2&H3&H4; //上拉輸入
//t/c0初始化
TCCR0=0X0D;
TCNT0=0X00;
OCR0=0XF0; //定時(shí)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初始化
{
//設(shè)置偵格式
//異步,8位數(shù)據(jù),無(wú)奇偶校驗(yàn),一個(gè)停止位,無(wú)倍速
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
//設(shè)置波特率
UBRRL= (F_osc/Baud_rate/16-1)%256;
UBRRH= (F_osc/Baud_rate/16-1)/256;
//使能接收中斷,使能接收,使能發(fā)送
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
}
//===============================================================
void USART_TXD(uint8 data) //發(fā)送采用查詢(xún)方式
{
while( !(UCSRA & BIT(UDRE)) );
UDR=data;
while( !(UCSRA & BIT(TXC )) );
UCSRA|=BIT(TXC);
}
//=======================================================================
#pragma interrupt_handler USART_RXC:12
void USART_RXC(void)
{
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -