历史上的今天
返回首页

历史上的今天

今天是:2025年05月08日(星期四)

正在发生

2018年05月08日 | P1外接4x4键盘的反转法扫描

2018-05-08 来源:eefocus

;----------------------------------------------------------------------------------------
P1口外接4×4按键, 常用的读出键值的方法有“查表法”和“反转法”。
查表法的程序最为简短,但是稍多占用一点存储空间;反转法的程序执行速度最快,只是要求接口是双向的。
下面分别给出了使用查表法和反转法读取键值的程序。
;----------------------------------------------------------------------------------------
#include  
#include  
#define uint unsigned int 
#define uchar unsigned char
/************************************************************** 
* 名称:Key_Tab() 
* 功能:P1外接4×4按键, 按照查表法读出键值
* 返回:按键值0~15/如无键按下, 返回16
***************************************************************/ 
uchar Key_Tab(void) 
{
    uchar code K_Tab[4][4] = {
          0xee, 0xde, 0xbe, 0x7e, 0xed, 0xdd, 0xbd, 0x7d,
          0xeb, 0xdb, 0xbb, 0x7b, 0xe7, 0xd7, 0xb7, 0x77};
    uchar temp1 = 0xfe, temp2, i, j;
    for(i = 0; i < 4; i++) {    //扫描低四位
      P1 = temp1;               //输出一行0
      temp2 = P1;               //马上就读入
      if((temp2 & 0xf0) != 0xf0) { //如果有键按下
        for(j = 0; j < 4; j++) //就扫描高四位
          if(temp2 == K_Tab[i][j]) //查表
            return i * 4 + j;   //查到了就返回按键的数值
      }
      else temp1 = _crol_(temp1, 1);
    }
    return 16;                  //没有查到,返回按键松开的代码
}   //呵呵,实质性的语句不过9行,就是这么简练!
;----------------------------------------------------------------------------------------
/************************************************************** 
* 名称:KeyRvs() 
* 功能:P1外接4×4按键, 按照反转法读出键值
* 输出:按键值0~15/如无键按下, 返回16
***************************************************************/ 
uchar KeyRvs(void) 
{
    uchar temH, temL, key;
    P1 = 0xf0; temH = P1;//低四位先输出0;读入,高四位含有按键信息
    P1 = 0x0f; temL = P1;//然后反转输出0;读入,低四位含有按键信息
//-----------------------------------------------------
//两次读入的时间间隔,必须尽量的小,以尽量避免按键状态发生变化
//有些人给出的程序,就没有注重这些,有些程序甚至还有间隔几个毫秒的!
//要知道,按键是会抖动的,夜长梦多,真不知道读出些什么!
//呵呵,做而论道给出的这个程序,读键的准确性最高。
//-----------------------------------------------------
    switch(temH) {
      case 0xe0: key = 0; break;
      case 0xd0: key = 1; break;
      case 0xb0: key = 2; break;
      case 0x70: key = 3; break;
      default: return 16;//按下的不是上述按键,就当是没有按键
    }
    switch(temL) {
      case 0x0e: return key;
      case 0x0d: return key + 4;
      case 0x0b: return key + 8;
      case 0x07: return key + 12;
      default: return 16;//按下的不是上述按键,就当是没有按键
    } 
}//本程序虽然稍多几行,但是没有循环,还可以提前返回,所以执行的速度最快
;----------------------------------------------------------------------------------------

推荐阅读

史海拾趣

Extech公司的发展小趣事

随着市场竞争的加剧,Extech公司意识到单一的产品已经无法满足客户的需求。因此,在1998年,公司推出了自主研发的产品工艺规划系统XTCAPP和产品数据管理系统XTPDM。这两款软件在推出后迅速成为市场上的主流产品,其高度的集成性和易用性赢得了客户的广泛赞誉。通过这两款软件的推出,Extech公司在CAD/PDM领域进一步巩固了自己的领导地位。

宇阳科技(EYANG)公司的发展小趣事

在MLCC领域取得显著成就的同时,宇阳科技也在积极拓展其他业务领域。公司利用在MLCC领域积累的技术和经验,成功研发了多款新型电子元器件,并为移动通信、计算机及外设、数字视听产品等领域提供元器件方案设计、选型和配套综合服务。此外,宇阳科技还积极进军移动手机市场,通过参股、合作等方式,成功涉足移动手机软件及硬件设计、制造和销售等领域。

DSMI Electronics SA公司的发展小趣事

DSMI Electronics SA公司非常重视企业文化的建设和团队建设。公司倡导开放、协作、创新、务实的企业文化,鼓励员工积极参与技术创新和市场竞争。同时,DSMI还注重人才培养和引进,通过内部培训、外部招聘等方式,不断提升员工的素质和能力。这些努力为公司的持续发展提供了有力的人才保障。

General Instrument Corp公司的发展小趣事
验证输入信号是否在变换器的允许范围内,避免超出其最大或最小输入电压。
Antelec公司的发展小趣事

Antelec公司创立于XXXX年,由一群富有远见和热情的电子工程师组成。创立初期,公司专注于研发先进的电子测量与分析技术,成功开发出一种具有高精度和稳定性的测量仪器,填补了市场上的空白。这一技术突破不仅赢得了客户的青睐,也为公司的后续发展奠定了坚实的基础。

Electronic公司的发展小趣事

AMD,曾经一度陷入困境的半导体公司,近年来实现了逆袭。AMD通过持续的技术创新和市场竞争策略的调整,成功在处理器和显卡市场取得了重要份额。AMD的产品性能不断提升,价格也更加亲民,赢得了消费者的广泛认可。同时,AMD还积极与游戏厂商和硬件厂商合作,推出了多款定制化的产品和解决方案。这些努力使得AMD在激烈的市场竞争中逐渐崭露头角。

问答坊 | AI 解惑

搞手帮个忙

我手上有个电路板,上面有个编码按钮,就是按钮能在1-9这间选择10个数字中的某一个,每按一下数字就加一(或减一),这个按钮有五个管脚。 请问这是个什么按钮,叫什么名字?还有就是他的原理。谢谢了。…

查看全部问答>

关于mini2440摄像头的问题

谁做过友善之臂的摄像头的应用程序?在Linux下怎么查看摄像头的设备名?…

查看全部问答>

prom加载问题求教

fpga为xcs200-pq208,prom为xc18v02-vq44.9 w3 x7 j  F2 v1 M# S+ W\' }( G7 A目前情况为,已经生产prom文件,通过jtag扫描只能看到fpga,看不到prom。在手动添加prom和fpga后,可以对fpga加载。却不能对prom加载,提示idcode不符。如果i ...…

查看全部问答>

日企力推3D电视疑为设局 中韩企业警惕产业前端遭暗算

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 3D可真够热的,日本企业挑头,中韩企业也在迅速跟进,从今年初在美国展示,到现在已实现了对欧美、中韩等主要消费电子市场的产品销售,短短数月便在全球范围内掀起了一股热潮并演绎成一种社会 ...…

查看全部问答>

PXA310的SPI控制MCP2515不能读取?

采用的是PXA310的SPI控制MCP2515, 发送是正常的。通过命令字写到2515后,然后读芯片状态寄存器。 功过示波器观察MISO脚信号是正常的,可是读PXA_SSDR寄存器却总是0。代码如下所示: for (i = 0; i < len; i++) { SPI_CtrlBlk.pSPIReg->PXA_ ...…

查看全部问答>

omap3503简单问题,初学,大家指教。

拿到一块ti的3503 evm板,粗略看了3503的datasheet。 问题:1、3503不包括dsp核?但是用在手机上一般是要音视频处理的,是不是把dsp和做在板子上当外设用了,          还是根本就不需要dsp?    &nb ...…

查看全部问答>

终于搞定MDK+JLINK了

JLINK被称作是调试ARM的“神器”,其速度和可靠性那是无容置疑的MDK作为Keil的产品,其界面的易用性那是很多从Keil C51过来的工程师首选的。IAR的性能好是好,光一个启动速度超级慢,就够人受的了MDK+JLINK方法:1、安装Keil支持JLINK的 ...…

查看全部问答>

STM32系列的低功耗是否能够媲美MSP430?

                                 最近公司想开发无线传感网采集终端设备(每分钟采集一次),要求通过ZIGBEE无线传输,只能通过1节锂电池供电,并且 ...…

查看全部问答>

跪求好心人指导基于avr的煤气泄漏检测系统的程序代码···

跪求好心人指导基于avr的煤气泄漏检测系统的程序代码···…

查看全部问答>