?? app.c
字號:
#include "avr/io.h"
#include "util/delay.h"
#include "avr/pgmspace.h"
#define No_key 255
#define K0_0 0
#define K1_0 1
#define K2_0 2
#define K3_0 3
#define K0_1 4
#define K1_1 5
#define K2_1 6
#define K3_1 7
#define K0_2 8
#define K1_2 9
#define K2_2 10
#define K3_2 11
#define K0_3 12
#define K1_3 13
#define K2_3 14
#define K3_3 15
#define Key_mask 0b00001111
char read_keyboard()
{
static char key_state = 0, key_value, key_line;
char key_return = No_key,i;
switch (key_state)
{
case 0:
key_line = 0b00010000;
for (i=0; i<4; i++) // 掃描鍵盤
{
PORTD = ~key_line; // 輸出行線電平
PORTD = ~key_line; // 必須送2次!!!
key_value = Key_mask & PIND; // 讀列電平
if (key_value == Key_mask)
key_line <<= 1; // 沒有按鍵,繼續掃描
else
{
key_state++; // 有按鍵,停止掃描
break; // 轉消抖確認狀態
}
}
break;
case 1:
if (key_value == (Key_mask & PIND)) // 再次讀列電平,
{
switch (key_line | key_value) // 與狀態0的相同,確認按鍵
{ // 鍵盤編碼,返回編碼值
case 0b00011110:
key_return = K0_0;
break;
case 0b00011101:
key_return = K0_1;
break;
case 0b00011011:
key_return = K0_2;
break;
case 0b00010111:
key_return = K0_3;
break;
case 0b00101110:
key_return = K1_0;
break;
case 0b00101101:
key_return = K1_1;
break;
case 0b00101011:
key_return = K1_2;
break;
case 0b00100111:
key_return = K1_3;
break;
case 0b01001110:
key_return = K2_0;
break;
case 0b01001101:
key_return = K2_1;
break;
case 0b01001011:
key_return = K2_2;
break;
case 0b01000111:
key_return = K2_3;
break;
case 0b10001110:
key_return = K3_0;
break;
case 0b10001101:
key_return = K3_1;
break;
case 0b10001011:
key_return = K3_2;
break;
case 0b10000111:
key_return = K3_3;
break;
}
key_state++; // 轉入等待按鍵釋放狀態
}
else
key_state--; // 兩次列電平不同返回狀態0,(消抖處理)
break;
case 2: // 等待按鍵釋放狀態
PORTD = 0b00001111; // 行線全部輸出低電平
PORTD = 0b00001111; // 重復送一次
if ( (Key_mask & PIND) == Key_mask)
key_state=0; // 列線全部為高電平返回狀態0
break;
}
return key_return;
}
const prog_char SegCode[16]={
/* Cathode common Smg display code*/
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char DisBuffer[8]={0,0,0,0,0,0,0,0};
void Scanf(void)
{
unsigned char i=0;
for(i=0;i<8;i++)
{
PORTB = pgm_read_byte(&SegCode[DisBuffer[i]]);
PORTA|= (1<<PA4);
PORTA&=~(1<<PA4);
PORTB = (1<<i);
PORTA|= (1<<PA5);
PORTA&=~(1<<PA5);
_delay_ms(2);
}
}
int main(void)
{
unsigned char KeyNumber=0;
/* Set LED and Smg LE pin as output , databus as output */
DDRA |=(1<<PA4)|(1<<PA5)|(1<<PA6);
DDRB = 0xFF;
/* Off the LED display */
PORTB = 0xFF;
PORTA|= (1<<PA6);
PORTA&=~(1<<PA6);
/* Set the direction of the keyboard interface */
DDRD = 0xF0;
while(1)
{
KeyNumber=read_keyboard();
if(KeyNumber!=255)
DisBuffer[7]=KeyNumber;
Scanf(); /* 16ms */
}
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -