⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyscan.c

📁 AVR程序
💻 C
字号:
/*******************************************************************
                      实验二
实验名称: 键盘扫描实验
实验目的: 进一步了解AVR单片机端口的操作,加深对AVR单片机端口寄存器的
		  理解
实验现象: 按键按下对应的LED发亮
环	  境: ICCAVR6.31A
设 计 者: shinea8868
说    明: 部分程序原型源自网络,经本人修改调试可用,请尊重知识产权,如
	  	  作商业用途请保留本段文字
完成日期: 2007年4月9日
*******************************************************************/
#include <iom16v.h>
#include <macros.h>
#include "..\ICC_H\SOFTWARE.h"

/*-----------------------------------------------------------------
    延时程序计算方法
	计数个数j = 延时时间/6*晶振频率 - 1
函数名称: void DelayMs(uchar i)
函数功能: 毫秒延时
参    数: 
返 回 值: 无
-----------------------------------------------------------------*/
void DelayMs(uchar i)
{
 	uchar j;
	while(i--)
	{
	 	j = 167;//1mhz 1ms延时
	    while(j--);
	}
}

/*-----------------------------------------------------------------
函数名称: void KeyScan(void)
函数功能: 键盘扫描程序
参    数: 
返 回 值: 无
-----------------------------------------------------------------*/
void KeyScan(void)
{
 	uchar KeyNum = 0;	  	  //用来存放按键信息
 	DDRA  = 0xff;         //置端口A为输出
	PORTA = 0xff; 		  //全部输出为高电平
	DelayMs(1);   		  //延时一段时间
	DDRA  = 0x00;		  //置端口A为输入
	if( PINA != 0xff)	  //是否有按键按下
		DelayMs(1);		  //延时去抖动
		
	DDRA  = 0xff;         //置端口A为输出
	PORTA = 0xff; 		  //全部输出为高电平
	DelayMs(1);   		  //延时一段时间
	DDRA  = 0x00;		  //置端口A为输入
	if( PINA != 0xff)	  //是否有按键按下
	{		 			  //确实有按键按下
	 	switch (PINA & 0xff)//判断是哪个按键按下
		{
		 	 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));//显示对应的发光二极管
			DDRA  = 0xff;         //置端口A为输出
			PORTA = 0xff; 		  //全部输出为高电平
			DelayMs(1);   		  //延时一段时间
			DDRA  = 0x00;	
		}
		DDRB  = 0xff;			  //设为输出
		PORTB = 0xff;			  //灭所有的二极管 
	}
	
}
/*-----------------------------------------------------------------
函数名称: void main(void)
函数功能: 
参    数: 
返 回 值: 无
-----------------------------------------------------------------*/
void main(void)
{
 	DDRB  = 0xff;
	PORTB = 0xff;
 	while(1)
	{
	 	DelayMs(200);
		KeyScan();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -