AVR4x4矩陣鍵盤驅(qū)動
#include
#include
#include "key.h"
#include "1602.h"
#include "delay.h"
unsigned char display[3]={0,0,0};//顯示數(shù)據(jù)
void main(void)
{ unsigned char Key;
LCD_init();
delay_nms(50);
while(1)
{
Key = keyboard_Scan(); // 鍵盤掃描
display[1]=Key/100%10+0x30;
display[2]=Key/10%10+0x30;
display[3]=Key%10+0x30;
LCD_write_char(5,0,display[1]);
LCD_write_char(6,0,display[2]);
LCD_write_char(7,0,display[3]);
delay_nms(50);
//switch(Key)
// {
// case 0:
// break;
// default:
// break;
//}
}
}
//key.h
#ifndef _4X4_H_
#define _4X4_H_
#define No_key 255
#define key_port PORTB
#define key_port_ddr DDRB
#define key_port_pin PINB
unsigned char keyboard_Scan(void);
#endif
//key.c
#include
#include
#include "key.h"
const unsigned char key_table[16] =
{
1, 2, 3,12,
4, 5, 6,13,
7, 8, 9,14,
10,0,11,15,
};
//4x4矩陣鍵盤掃描函數(shù)
unsigned char keyboard_Scan(void)
{
unsigned char temp,key,row,Column;
key_port_ddr = 0b00001111;// 高四位輸入行線/低四位輸出列線
key_port = 0b11110000;// 高四位打開上拉電阻/低四位輸出低電平
delay_nus(5);// 延時(shí)5us
if((key_port_pin & 0xF0)!= 0xF0) // 作初檢查有否鍵按下,沒有,就返回
{ // 如果行線不全為1,可能有鍵按下
delay_nms(5);// 延時(shí)去抖動
//設(shè)置列線初始值3~0=1110
for(Column=0,key_port=0b11111110;Column<4;Column++)
{
for(row=0,temp=0b11101111;row<4;row++)// 設(shè)置行線初始值7~4=1110
{
while((key_port_pin & 0xF0)==(temp & 0xF0))// 輸入行線,查看這行有否鍵按下
{
key=4*row+Column;// 鍵編碼=4*行輸入值+列掃描值
key=key_table[key];// 鍵盤編碼轉(zhuǎn)換鍵值
return (key);
}
temp<<=1;// 行線左移1位
}
key_port=((key_port<<1)|0x01);// 列線掃描值左移1位,掃描下一行
}
}
return (No_key);
}