历史上的今天
返回首页

历史上的今天

今天是:2024年10月15日(星期二)

正在发生

2019年10月15日 | 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;                                              //没有按键的时候显示上次的键值

                                 }


                  }


}


推荐阅读

史海拾趣

博众电气(BZCN)公司的发展小趣事

随着市场的不断扩大,博众电气意识到质量是企业生存和发展的关键。因此,公司决定引入国际先进的质量管理体系,全面提升产品质量和服务水平。通过严格的质量控制和持续改进,博众电气的产品质量得到了显著提升,客户满意度也大幅提高。这一举措不仅增强了公司的市场竞争力,还为公司的长远发展奠定了坚实基础。

EPSON公司的发展小趣事

随着业务的不断发展,EPSON开始积极拓展国际市场。公司先后在全球五大洲设立了多个生产和研发机构,以及销售和服务网点,以便更好地服务全球客户。通过不断拓展海外市场,EPSON逐渐实现了全球化战略,其产品和服务已经覆盖全球多个国家和地区。

Delphi Connection Systems公司的发展小趣事

Delphi Connection Systems公司自创立之初,就致力于在电子行业中的连接器技术上进行创新。公司投入大量研发资源,开发出一种新型的高性能连接器,这种连接器具有更小的体积、更高的可靠性和更低的传输损耗。这一创新成果迅速获得了市场的认可,为公司带来了大量的订单和合作机会。

ECLIPSE公司的发展小趣事

Eclipse的成功离不开其强大的社区支持。Eclipse社区拥有众多的开发者、测试者和用户,他们共同为Eclipse的发展贡献力量。通过举办开发者大会、在线论坛和邮件列表等方式,Eclipse社区为开发者们提供了一个交流学习的平台。在这个平台上,开发者们可以分享经验、解决问题,共同推动Eclipse的发展。

东晶(ECEC)公司的发展小趣事

面对日益激烈的市场竞争和环境保护的压力,东晶电子坚持品质至上和绿色生产的理念。公司引进了先进的品质管理体系和环境管理体系,通过ISO9001、ISO14000等认证,确保产品质量的稳定性和可靠性。同时,公司还积极推广绿色生产理念,采用环保材料和工艺,降低生产过程中的能耗和排放,实现可持续发展。

Global Navigation Systems公司的发展小趣事
是的,许多现代远程无线防盗报警系统都支持多防区同时报警功能。这意味着系统可以同时监控多个区域或设备,并在任何一个区域或设备发生异常情况时触发报警。这种功能可以大大提高系统的安全性和可靠性,为用户提供更加全面的保护。

问答坊 | AI 解惑

谁有 MEMORY STICK规范?

我正在研究memory stick和magicgate, 谁有规范, 有酬谢! 请联系cenuserwen@gmail.com…

查看全部问答>

$$$咨询:WINCE下手写软件的价格

    我公司一产品上使用了windows ce 4.2 net 版本, 处理器为ARM4VR,分辨率为240*320,现在想寻一款手写软件, 现咨询一下购买这种软件要多少钱?     胡先生   13320807449   QQ:562850914  &n ...…

查看全部问答>

新手上路,求助

本人是个新手,想自学单片机,但是不知道该怎么入手,有高手介绍下经验么?上网搜了,可是还是没有系统的认识,另外,现在学什么类型的,更容易上手,有知道的帮忙回答下,万分感谢~…

查看全部问答>

WINCE编译不了,说找不到recorder.exe

Warning: Found duplicate entry \'binfs.dll      NK               C:\\WINCE420\\PUBLIC\\11\\RelDir\\SAMSUN~1\\binfs.dll 00000007\' ... skipping Error: Could not ...…

查看全部问答>

Wince 是否支持大页nand flash?文件格式是dosfs吗?

Wince是否支持大页nand flash?文件格式是dosfs吗? Wince支持的Nand的大页模式和小页模式是同一个文件系统吗?…

查看全部问答>

Zstack学习经验点滴:如何使用OSAL的事件?

如何使用OSAL的事件?OSAL通过一个16位宽度的数组来管理事件,意味着OSAL最多可以支持16个事件,其中最高位(0x08000,SYS_EVENT_MSG)系统保留,用户可以使用的事件有15个。事件的使用很简单:1)需要找个地方定义事件的ID,实际上是指定该事件占 ...…

查看全部问答>

CAN一次最多发多少字节数据?

TxMessage.DLC最多是8字节,我一次要发24个。分三次发,发送程序如下TestStatus CAN_Polling(void){  u32 i = 0;  u8  m=0;  //每次发送的字节数  u8  n=0; ...…

查看全部问答>

交流群创建喽

本人非常之喜欢这个论坛,所以私自创建了一个群, 群号:168221728 大家可以加这个号,方便交流 …

查看全部问答>

uc/os求助

如何建立两个任务,一个检测两次按键的时间间隔,并将此值存放在全局变量KTime中,另一个任务按此时间间隔定时向电脑屏幕发出字符“M\"及该时间间隔信息??????????????…

查看全部问答>