单片机
返回首页

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

2019-10-15 来源:eefocus

//***********************************************************************

//                        包含文件

//***********************************************************************


#include

#include

#define         F_CPU        16000000                // 单片机主频为16MHz,用于延时子程序,熔丝位必须设置到外部高频晶振才行

#include

#include

#include

#include            //中断信号头文件

#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;                                              //没有按键的时候显示上次的键值

                                 }


                  }


}


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 短波AM发射器电路设计图

  • 带有短路保护系统的5V直流稳压电源电路图

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章