📄 4x4key.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 + -