×
嵌入式 > 技术百科 > 详情

单片机最高效的按键程序(C语言

发布时间:2020-06-06 发布时间:
|
声明:

         本文由南通富士特电力自动化有限公司内部帮助完成。

        单片机如何实现一个高效的按键程序很是重要,在单片机中每一步都是需要去斟酌,尽量做到高效,提高整个系统的高效是需要每一步都要高效,先上源代码:

#include

#include

 

unsigned char key = 0;
unsigned char key0 = 0;
unsigned char key1 = 0;
unsigned char key2 = 0;


void key_saomiao(void)
{
 key0 = P2;
 key0 = key0 & 0xB0;
 //key0 = key0 >> 4;//移位要看键值是哪个,将其移动到低位来
 key2 = key2 | (key0 ^ key1);
 key1 = key0;
 key  = key | (key2 & key0);
 key2 = key ^ key2;
}

void time0_init(void)
{
 unsigned char a;

 a = TMOD;
 a = a | 0x01;
 TMOD = a;
 //IE   = 0x82;
 TH0  = 0x10;
 TL0  = 0x00;
 ET0  = 1;
 TR0  = 1;
 EA  = 1;  
}


void time0_inte(void) interrupt 1
{
 TH0 = 0x10;
 TL0 = 0x00;
 TR0=1;
 key_saomiao();

//其他程序
}


void key_num(void)
{
 unsigned char temp;

 temp = 0;
 //key3
 temp = key & 0x80;
 if(temp > 0)
 {
  disp_stop = 1;
  key = key & 0x7F;
  temp = 0;
 }
 else
 {
  disp_stop = 0;  
 }
 //key2 
 temp = key & 0x20;
 if(temp > 0)
 {
  disp_orderly = 1;
  key = key & 0xDF;
  temp = 0;
 }
 //key1 
 temp = key & 0x10;
 if(temp > 0)
 {
  disp_orderly = 0;
  key = key & 0xEF;
  temp = 0;
 }
}//本段程序中只实现了3个按键,由于只有按键3只,改变一些全局变量(开关量)值


int  main(void)
{
 unsigned char temp;

 all_data_int();

 while(1)
 {
  key_num();

//其他程序

}

return 0;

}

说明:本程序仅仅只能作为点动按键的使用,不适用于例如拨动按键类型的按键信号固定在某一固定值。

本程序中仅仅是实现的最多为8个按键的程序,并且按键信号必须直接由MCU的IO口直接采集,如果想要实现其他种类的方式,就需要升级程序了,本程序的核心地方是每个一个固定的时间调用一次key_saomiao();本文中使用的是定时器0,时长50MS。关于按键的对应问题,本文中实这样的P2的各个IO口正对应着key变量的各个位,总共8个位,刚好8个IO口,所以是最多实现8个按键,看是否有按键仅仅需要查看key变量对应为是否为“1”,为“1”则表示这个对应的按键产生了一个按键作用。这段程序的精华在于将去抖,等待按键松开的步骤用了3个变量来记住,分别是key0,key1,key2.可以说整个过程仅仅使用了5步,当然使用汇编的话不止5步,需要9步来实现,。这样看来就算加上其他的一些调用,整个程序执行的效率试试非常高的

 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Keil5(MDK5)在调试(debug)过程中遇到的问题