单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 441|回复: 0
收起左侧

Atmega128a的4位独立键盘控制程序

[复制链接]
1804181935 发表于 2019-7-26 08:49 | 显示全部楼层 |阅读模式
//***********************************************************************
//                        包含文件
//***********************************************************************

#include <string.h>
#include <stdio.h>
#define         F_CPU        16000000                // 单片机主频为16MHz,用于延时子程序,熔丝位必须设置到外部高频晶振才行
#include <util/delay.h>
#include <avr/io.h>
#include <avr/iom128.h>
#include <avr/interrupt.h>           //中断信号头文件
#include "Config.h"

//***********************************************************************
//                        定义变量区
//***********************************************************************

uchar key;

//***********************************************************************
//                        IO端口初始化
//***********************************************************************

void system_init()
{

   KEYPort |= (1 << PD1) |(1 << PD5)|(1 << PD6)|(1 << PD7);        //四位独立按键连接在PD1/PD5/PD6/PD7上

   KEYDDR  = 0x00;                                                                                        //设置为输入,并且要打开上拉电阻               

   LED=0xFF;                                                                                                //LED灯IO口在PORTE

   LEDDDR=0xFF;                                                                                                //设置为输出

}

//**********************************************************************
//                键盘扫描子程序,采用逐键扫描的方式
//**********************************************************************

uchar keyboardscan(void)
{
  uchar key_check;
  uchar key_checkin;

  key_checkin=KEYRead;                          //读取IO口状态,判断是否有键按下

  key_checkin&= 0xE2;                                  //读取IO口状态,判断是否有键按下

  if(key_checkin!=0xE2)                            //IO口值发生变化则表示有键按下
          {
            delay_ms(20);                          //键盘消抖,延时20MS

            key_checkin=KEYRead;

            if(key_checkin!=0xE2)                        //再次读取状态,判断是否有按键按下
                    {     
                             key_check=KEYRead;

                             switch (key_check & 0xE2)
                                     {
                                             case 0xE0:key=1;break;        //S1按下

                                             case 0xC2:key=2;break;        //S2按下

                                                case 0xA2:key=3;break;        //S3按下

                                             case 0x62:key=4;break;        //S4按下

                                     }

                    }
  }


else
        {
                  return(key);
          }
}

//*************************************************************************
//                        主程序
//*************************************************************************

int main(void)
{         
        system_init();                                                //初始化端口,注意按键端口要打开上拉电阻,确保稳定

        while(1)
                  {
                        keyboardscan();             //键盘扫描,看是否有按键按下

                    if(key!=0xff)               //如果有按键按下,则显示该按键键值1~4
                              {
                                      {
                                                switch(key)
                                                           {

                                                        case 1: LED=0x7F;break;           //给不同的键赋键值,键值1,亮1个LED灯

                                                     case 2: LED=0x3F;break;                //给不同的键赋键值,键值2,亮2个LED灯

                                                         case 3: LED=0x1F;break;                //给不同的键赋键值,键值3,亮3个LED灯

                                                         case 4: LED=0x0F;break;                //给不同的键赋键值,键值4,亮4个LED灯

                                                  }

                                  }
       
                               }
                     else
                                 {
                                 //LED=key;                                              //没有按键的时候显示上次的键值
                                 }

                  }

}





KEY4.zip

45.14 KB, 下载次数: 1, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|单片机论坛 |51黑电子论坛技术交流 QQ 管理员QQ:125739409;技术交流QQ群636986012

Powered by 单片机教程网

快速回复 返回顶部 返回列表