?? keyscan.c
字號(hào):
/*******************************************************************
實(shí)驗(yàn)二
實(shí)驗(yàn)名稱: 鍵盤掃描實(shí)驗(yàn)
實(shí)驗(yàn)?zāi)康? 進(jìn)一步了解AVR單片機(jī)端口的操作,加深對(duì)AVR單片機(jī)端口寄存器的
理解
實(shí)驗(yàn)現(xiàn)象: 按鍵按下對(duì)應(yīng)的LED發(fā)亮
環(huán) 境: ICCAVR6.31A
設(shè) 計(jì) 者: shinea8868
說 明: 部分程序原型源自網(wǎng)絡(luò),經(jīng)本人修改調(diào)試可用,請(qǐng)尊重知識(shí)產(chǎn)權(quán),如
作商業(yè)用途請(qǐng)保留本段文字
完成日期: 2007年4月9日
*******************************************************************/
#include <iom16v.h>
#include <macros.h>
#include "..\ICC_H\SOFTWARE.h"
/*-----------------------------------------------------------------
延時(shí)程序計(jì)算方法
計(jì)數(shù)個(gè)數(shù)j = 延時(shí)時(shí)間/6*晶振頻率 - 1
函數(shù)名稱: void DelayMs(uchar i)
函數(shù)功能: 毫秒延時(shí)
參 數(shù):
返 回 值: 無
-----------------------------------------------------------------*/
void DelayMs(uchar i)
{
uchar j;
while(i--)
{
j = 167;//1mhz 1ms延時(shí)
while(j--);
}
}
/*-----------------------------------------------------------------
函數(shù)名稱: void KeyScan(void)
函數(shù)功能: 鍵盤掃描程序
參 數(shù):
返 回 值: 無
-----------------------------------------------------------------*/
void KeyScan(void)
{
uchar KeyNum = 0; //用來存放按鍵信息
DDRA = 0xff; //置端口A為輸出
PORTA = 0xff; //全部輸出為高電平
DelayMs(1); //延時(shí)一段時(shí)間
DDRA = 0x00; //置端口A為輸入
if( PINA != 0xff) //是否有按鍵按下
DelayMs(1); //延時(shí)去抖動(dòng)
DDRA = 0xff; //置端口A為輸出
PORTA = 0xff; //全部輸出為高電平
DelayMs(1); //延時(shí)一段時(shí)間
DDRA = 0x00; //置端口A為輸入
if( PINA != 0xff) //是否有按鍵按下
{ //確實(shí)有按鍵按下
switch (PINA & 0xff)//判斷是哪個(gè)按鍵按下
{
case 0b11111110: KeyNum = 1;break;
case 0b11111101: KeyNum = 2;break;
case 0b11111011: KeyNum = 3;break;
case 0b11110111: KeyNum = 4;break;
case 0b11101111: KeyNum = 5;break;
case 0b11011111: KeyNum = 6;break;
case 0b10111111: KeyNum = 7;break;
case 0b01111111: KeyNum = 8;break;
default: break;
}
while(PINA != 0xff)
{
DDRB = 0xff;
PORTB&= ~(1<<(KeyNum-1));//顯示對(duì)應(yīng)的發(fā)光二極管
DDRA = 0xff; //置端口A為輸出
PORTA = 0xff; //全部輸出為高電平
DelayMs(1); //延時(shí)一段時(shí)間
DDRA = 0x00;
}
DDRB = 0xff; //設(shè)為輸出
PORTB = 0xff; //滅所有的二極管
}
}
/*-----------------------------------------------------------------
函數(shù)名稱: void main(void)
函數(shù)功能:
參 數(shù):
返 回 值: 無
-----------------------------------------------------------------*/
void main(void)
{
DDRB = 0xff;
PORTB = 0xff;
while(1)
{
DelayMs(200);
KeyScan();
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -