历史上的今天
返回首页

历史上的今天

今天是:2025年01月25日(星期六)

2018年01月25日 | 4×4矩阵键盘C语言程序参考

2018-01-25 来源:eefocus

#define int8 unsigned int
#define int16 unsigned char  
#define int32 unsigned long 

#define KEY_PORT PORTD

#define KEY_PIN  PIND


#define ROW1  (1<<0)
#define ROW2  (1<<1)
#define ROW3  (1<<2)   
#define ROW4  (1<<3)

statIC int8 sCAN_X(void);
static delay(void); 
int8 scan_key(void);
/*
 函数原型:int8 scan_key(void)
 功能:     返回按下的按键的行列值,
      如返回第二行第三列,即按键“6”,
      返回值0x23,高位为行,低位为列
 键盘:
           7      8      9      /
           4      5      6      *
           1      2      3      +
           C      0      =      -
 返回值:
           0x11   0x12   0x13  0x14
           0x21   0x22   0x23  0x24 
           0x31   0x32   0x33  0x34
           0x41   0x42   0x43  0x44            
 作者:     Benny  
 Email:    89S53@163.com  

2005               
*/
int8 scan_key(void){
//第四行----------------
KEY_PORT|=0xff;
KEY_PORT&=~ROW4; 
if ((KEY_PIN&0xf0)!=0xf0)

   delay();//去抖动
   if ((KEY_PIN&0xf0)!=0xf0)
   {   
       return (0x40|scan_X());             
   }
}

//第三行----------------
KEY_PORT|=0xff;
KEY_PORT&=~ROW3; 
if ((KEY_PIN&0xf0)!=0xf0)

   delay();//去抖动
   if ((KEY_PIN&0xf0)!=0xf0)
   { 
       return (0x30|scan_X());             
   }

}

//第二行---------------- 
KEY_PORT|=0xff;
KEY_PORT&=~ROW2; 
if ((KEY_PIN&0xf0)!=0xf0)

   delay();//去抖动
   if ((KEY_PIN&0xf0)!=0xf0)
   { 
       return (0x20|scan_X());             
   }

}  
 
//第一行: 7  8  9  /
KEY_PORT|=0xff;
KEY_PORT&=~ROW1; 
if ((KEY_PIN&0xf0)!=0xf0)
{
   delay();//去抖动
   if ((KEY_PIN&0xf0)!=0xf0)
   {   
       return (0x10|scan_X());             
   }

  
}
//列扫描函数
static int8 scan_X(void){
       if ((KEY_PIN&0xf0)==0xe0)
       { //"7" 
         while((KEY_PIN&0xf0)==0xe0); 
         return 0x01; //第一列
       }
       else if((KEY_PIN&0xf0)==0xd0) 
       { 
         while((KEY_PIN&0xf0)==0xd0);       
         return 0x02;//第二列
       }
       else if((KEY_PIN&0xf0)==0xb0) 
       {
         while((KEY_PIN&0xf0)==0xb0); 
         return 0x03;//第三列
       }       
       else if((KEY_PIN&0xf0)==0x70) 
       {
         while((KEY_PIN&0xf0)==0x70);         
         return 0x04; //第四列
       }

        
}
static delay(void){
//去抖动
int16 i,j;
for (i=0;i<10;i++)
  { 
  for (j=0;j<100;j++)
     {}
  }
}


推荐阅读

史海拾趣

Advanced Energy公司的发展小趣事

随着公司的不断发展壮大,AE公司于某一时期成功在纳斯达克上市。这一里程碑事件标志着AE公司在电子行业的地位得到了进一步的巩固和提升。上市为公司带来了更多的资金支持,使得AE公司能够加大在研发、生产、销售等方面的投入,进一步提升了公司的竞争力。同时,上市也增强了公司的品牌影响力,吸引了更多的合作伙伴和客户。

GSR Technology Ltd公司的发展小趣事

随着数字化时代的到来,GSR Technology Ltd积极响应国家关于数字经济发展的号召,开始推进企业的数字化转型。公司引入先进的智能制造技术,对生产线进行智能化改造,提高了生产效率和产品质量。同时,公司加强数据管理和分析,利用大数据和人工智能技术优化产品设计和生产流程。这一系列的数字化转型措施为公司带来了显著的经济效益和市场竞争力提升。

长江连接器(CJT)公司的发展小趣事

长江连接器一直将研发实力和技术创新作为公司的核心竞争力。公司拥有一支高素质的研发团队,不断投入资源进行新技术和新产品的研发。通过引进先进的研发设备和技术手段,长江连接器成功研发出了一系列高品质、高性能的连接器产品,满足了市场的多样化需求。同时,公司还积极申请各类专利和知识产权,保护自己的技术成果。

DuPont公司的发展小趣事

随着全球环保意识的提高,对于环保型电子材料的需求也日益增长。DuPont公司积极响应这一趋势,致力于环保型电子材料的研发和生产。公司采用先进的环保技术和生产工艺,开发出了一系列低污染、低能耗的电子材料。这些材料不仅具有良好的性能,而且对环境友好,符合可持续发展的要求。DuPont公司的这一举措,不仅提升了公司的竞争力,也为电子行业的可持续发展做出了积极贡献。

Electronic Sensor + Resistor GmbH公司的发展小趣事

品质是ESR公司的生命线。公司始终坚持“质量第一、用户至上”的原则,建立了完善的质量管理体系和严格的质量控制流程。从原材料采购、生产加工到成品检验等各个环节都实行严格的质量控制措施,确保每一件产品都符合高品质标准。

此外,ESR公司还建立了完善的售后服务体系,为用户提供及时、专业的技术支持和解决方案。这种对品质的执着追求和对用户的真诚服务赢得了客户的广泛赞誉和信赖。

艾为(AWINIC)公司的发展小趣事

艾为电子注重与产业链上下游企业的合作,通过协同创新和资源共享,实现共赢发展。例如,艾为与歌尔股份建立了长期合作伙伴关系,双方在声光电射手等领域展开了深度合作,共同推出了多款优秀产品。此外,艾为还与多家ODM厂商和智能硬件企业建立了紧密的合作关系,共同推动产业链的协同发展。

问答坊 | AI 解惑

现代制动系统保养方式

子式工具组,工作简单快捷,舒适安全,且一人便可独立完成。工具组主要功用是:①测试制动液的湿沸点,确定是否应该更换。②使用独有的工具进行旧制动液的排放和新制动液的加注。③换液时,工具中采用先进的电子传感显示技术的部件,能准确有效地判 ...…

查看全部问答>

请问tcl语言中如何将内容打印到文件啊,如内文例子。

请问tcl语言中如何将内容打印到文件啊,比如下面这句:puts [ format \"%40s%13s%13s%13s\"\"name\" \"num\" \"code\" \"com\"]在modelsim中执行后会在modelsim命令窗口打印相应字符,如果想把这些打印到文件中,该用什么命令呢。刚开始学习tcl,还 ...…

查看全部问答>

找ise foundation 10.1 的开发软件

我现在找了很久ise foundation 10.1或webpack的开发软件,有谁有的可以给我提供以下吗,我在学校,去xilinx网站下要花很大的流量,下不起,图书馆借了个光盘也不能用,哪位好心人能帮我一下,感激涕零啊!邮箱:ffxsppan@163.com…

查看全部问答>

modbus协议地址问题

PC对PLC通过MODBUS协议通讯时 给出的映射表是这样的 H0000      P区域 H1000      M区域 H2000      L区域 H3000      K区域 现在我要对一个M1900(已经 ...…

查看全部问答>

老板红了眼,再没结果我就要牺牲了!PDA上UDP通信问题,请各路高手帮忙看,小弟感激涕零

目前的模块,PDA跟单片机的通信。 1,在EVC4下编的代码,通过PC2003模拟通信没有问题,收发数正常 但是release到PDA上,只能广播或者针对某几个IP能发数,也就是用抓包工具能查到数据 但是,仅仅是能发出数据,对方没有响应,而在模拟器上,没有 ...…

查看全部问答>

evc4.0下怎么做才能读和写 csv文件,在线等

evc4.0下怎么做才能读和写 csv文件,我想把它考到pc机上去。…

查看全部问答>

开关电源 负载调整率

本帖最后由 paulhyde 于 2014-9-15 09:15 编辑 …

查看全部问答>

LaunchPad能烧写二进制文件么?怎么操作?用CCS

LaunchPad能烧写二进制文件么?怎么操作?用CCS…

查看全部问答>

基于瑞萨RL78G14的便携心率仪创意进度帖-3、扩展板原理图,附原文件

最近断断续续的看资料,找脚位,主要是各种模块接口的,既要和官方板子兼容,又要保证以后好布线,那个踌躇啊 扩展板主要用到定时器IO,按键触发,Buzzer输出,SPI接口,计划引出一路串口和一路IIC接口,AD口看情况在考虑下 不得不说,瑞萨的IC端 ...…

查看全部问答>

TVS管的钳位电压应该如何选择?

板子供电电压是钮扣电池供电,为3V。TVS用来防静电击穿,选用的是在1A测试的条件下,钳位电压为7V,有人建议用个钳位电压为3.6V或3.9V的TVS,什么原因?为什么?怎样应该去选择TVS的钳位电压,网上很多资料,说的都不清楚。。。…

查看全部问答>