专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

基于AVR的4*4矩阵键盘扫描与LED显示程序

作者:佚名   来源:本站原创   点击数:  更新时间:2012年04月03日   【字体:

/**************
此程序在别人的基础上进行了一些修改,能应用到我的开发板中,
并与我自制的外接按键和LED灯配合使用,在此感谢原创者!!!
硬件:M16
作用:当按下按键时显示相对应的按键控制的LED灯
频率:8.000000MHZ
开发板:EasyAVR M16 v12
编译软件:ICCAVR6.31A
下载软件:AVRstudio4.14
编写人:伍建忠
编写日期:2011.10.14
修改日期:
************/
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
uint key_num=20;
//以下为左右移动参数宏定义
#define crol(a,n)a=(a<>(8-n))
#define cror(a,n)a=(a>>n)|(a<<(8-n))
void delay(void)
 {
  uint i;
  for(i=1;i<100;i++);
 }
void delay_1ms(void)
 {
  uint i;
  for(i=1;i<(uint)(8*143-2);i++);
 }
void delay_ms(uint time)
 {
  uint i=0;
  while(i)
   {
    delay_1ms();
 i++;
   }
 }
void port_init(void)
 {
  DDRA=0xff;
  PORTA=0xff;
  DDRB=0x00;
  PORTB=0x00;
  DDRC=0xff;//
  PORTC=0xff;//
  DDRD=0xf0;//D口低四位为输入,置高电平。
  PORTD=0x00;//高四位为输出,置低电平。
 }
uchar key_scan(void)
 {
  uchar i,j;
  DDRD=0xf0;
  PORTD=0x00;//初始运行时输出全为0
  if((PIND&0x0f)==0x0f)//判断有无按键按下
  return 20;
  else
  {
   delay_ms(10);
   if((PIND&0x0f)==0x0f)//第二次判断,必不可少
   return 20;
   else
    {
  for(i=4;i<8;i++)//扫描行线
  {
   PORTD=~(1<<i)|0x0f;//行线上是否有拉低
   for(j=0;j<4;j++)//扫描列线
    {
     if((PIND&(1<<j))==0)//列线上有无按键按下
   key_num=((i-4)*4+j);//确定按键值
    }
  }
  return key_num;//无键按下则返回初始状态
 }
  }
 }
void led_display(void)//按键按下时在LED上显示相应的状态
 {
  switch(key_num)
   {
    case 0: PORTA=0xfe; PORTD=0xee; break;
 case 1: PORTA=0xfc; PORTD=0xde; break;
 case 2: PORTA=0xf8; PORTD=0xbe; break;
 case 3: PORTA=0xf0; PORTD=0x7e; break;
 case 4: PORTA=0xe0; PORTD=0xed; break;
 case 5: PORTA=0xc0; PORTD=0xdd; break;
 case 6: PORTA=0x07; PORTD=0xbd; break;
 case 7: PORTA=0x55; PORTD=0x7d; break;
 case 8: PORTA=0xaa; PORTD=0xeb; break;
 case 9: PORTA=0xcc; PORTD=0xdb; break;
 case 10: PORTA=0xbb; PORTD=0xbb; break;
 case 11: PORTA=0x77; PORTD=0x7b; break;
 case 12: PORTA=0xf0; PORTD=0xe7; break;
 case 13: PORTA=0x66; PORTD=0xd7; break;
 case 14: PORTA=0xee; PORTD=0xd7; break;
 case 15: PORTA=0xdd; PORTD=0x77; break;
 default: break;
 key_num=16;
   }
 }
void main(void)
 {
  #ifdef debag1
   key_code=2;
   #endif
   port_init();//调用端口初始化函数
   while(1)
    {
  key_scan();//调用按键扫描函数
  led_display();//调用显示函数
 }
 }    

关闭窗口

相关文章