历史上的今天
今天是: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;//按下的不是上述按键,就当是没有按键
}
}//本程序虽然稍多几行,但是没有循环,还可以提前返回,所以执行的速度最快
;----------------------------------------------------------------------------------------
史海拾趣
|
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 ...… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 3D可真够热的,日本企业挑头,中韩企业也在迅速跟进,从今年初在美国展示,到现在已实现了对欧美、中韩等主要消费电子市场的产品销售,短短数月便在全球范围内掀起了一股热潮并演绎成一种社会 ...… 查看全部问答> |
|
采用的是PXA310的SPI控制MCP2515, 发送是正常的。通过命令字写到2515后,然后读芯片状态寄存器。 功过示波器观察MISO脚信号是正常的,可是读PXA_SSDR寄存器却总是0。代码如下所示: for (i = 0; i < len; i++) { SPI_CtrlBlk.pSPIReg->PXA_ ...… 查看全部问答> |
|
拿到一块ti的3503 evm板,粗略看了3503的datasheet。 问题:1、3503不包括dsp核?但是用在手机上一般是要音视频处理的,是不是把dsp和做在板子上当外设用了, 还是根本就不需要dsp? &nb ...… 查看全部问答> |
|
JLINK被称作是调试ARM的“神器”,其速度和可靠性那是无容置疑的MDK作为Keil的产品,其界面的易用性那是很多从Keil C51过来的工程师首选的。IAR的性能好是好,光一个启动速度超级慢,就够人受的了MDK+JLINK方法:1、安装Keil支持JLINK的 ...… 查看全部问答> |




