矩阵按键扫描程序的一些疑惑(已解决)
时间:10-02
整理:3721RD
点击:
看了郭天祥矩阵键盘的教程,看着程序很冗长,所以就用for语句来实现扫描键盘,程序简洁了不少,但是下载到51后没用! 无论按哪个键都数码管都没有显示(键盘是4x3的),仿真了下,发现所有I0都是高电平,跟没下程序一样。(经LZ检查板子没问题),检查了很多遍程序也没发现问题,麻烦各位看下
先附程序
误区:在第30行中代码有误,因为优先级的关系,所以程序不正确(C语言基本功要扎实啊!)
改为:for(j=0;t=hang&lie[j],j<4;j++) //此处不可以直接将hang&lie[j]
if(temp==t) //与temp比较,因为==优先级高于&
- #include <reg52.h>
- #include <Myspace.h>
- uchar lie[4]={0xef,0xdf,0xbf,0x7f};
- uchar hang[3]={0xfd,0xfb,0xf7};
- uchar temp,key,i,j;
- void disp(uchar x) //显示程序
- {
- P0=duan2[x];
- delay(10);
- }
- void scanf()
- {
- for(i=0;i<3;i++)
- {
- P1=hang[i]; //先将某一行置零
- temp=P1;
- temp&=0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- temp=P1;
- temp&=0xf0; //确认有按键按下时,确定哪一列
- if(temp!=0xf0)
- {
- temp=P1;
- for(j=0;j<4;j++)
- if(temp==hang[i]&lie[j]){key=4*i+j+1;break;}
- while(temp!=0xf0) //等待松开按键
- {
- disp(key);
- temp=P1;
- temp&=0xf0;
- }
- }
- }
- }
- }
- main()
- {
- P2=0x00; //选中所有数码管
- while(1)
- {
- void sacnf();
- }
- }
那个hang数组程序里是有的,hang[i],但是在这里被吞了,显示不出来
好久没玩单片机了,粗看下,好象少了按键去抖的程序了吧?
- /********************************************************************
- * 文件名 : 矩阵键盘.c
- * 描述 : 该文件实现了 4 * 4 键盘的试验。通过数码管的最后一位来显示
- 当前的按键值。
- * 创建人 : 东流,2009年4月10日
- * 版本号 : 2.0
- *********************************************************************/
- #include<reg51.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- /********************************************************************
- * 名称 : Delay_1ms()
- * 功能 : 延时子程序,延时时间为 1ms * x
- * 输入 : x (延时一毫秒的个数)
- * 输出 : 无
- ***********************************************************************/
- void Delay_1ms(uint i)//1ms延时
- {
- uchar x,j;
- for(j=0;j<i;j++)
- for(x=0;x<=148;x++);
- }
-
- /********************************************************************
- * 名称 : Keyscan()
- * 功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。
- * 输入 : 无
- * 输出 : 按键值
- ***********************************************************************/
- uchar Keyscan(void)
- {
- uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7}; //让矩阵键盘的每行分别为低电平
- for(j=0; j<4; j++)
- {
- P1 = Buffer[j];
- temp = 0x10;
- for(i=0; i<4; i++)
- {
- if(!(P1 & temp)) //判断P1口高4位某一行为低电平
- {
- return (i+j*4); //返回键码
- }
- temp <<= 1;
- }
- }
- }
- /********************************************************************
- * 名称 : Main()
- * 功能 : 主函数
- * 输入 : 无
- * 输出 : 无
- ***********************************************************************/
- void Main(void)
- {
- uchar Key_Value; //读出的键值
- while(1)
- {
- P1 = 0xf0;
- if(P1 != 0xf0) //判断有无按键按下
- {
- Delay_1ms(20); //按键消抖
- if(P1 != 0xf0) //第二次判断有无按键按下
- {
- Delay_1ms(20); //按键消抖
- if(P1 != 0xf0) //第三次判断有无按键按下
- {
- Key_Value = Keyscan();
- }
- }
- }
- P0 = table[Key_Value];
- P2 = 0x07;
- }
- }
里面有个delay去抖,不过你记性不错哦,还记得这些
学习了,里面用0x10和左移来检查高四位的低电平,这值得我学习,等会再写一个这样思路的~
但是还是不懂我的代码哪里出错
粗略看了下,好像你的for()循环里的hang没有[i ]。
我也是刚学没多久,希望能帮上忙
用反转扫描会方便很多,不用一行行地扫描
源程序里有,发帖的时候被吞了,现在改用代码上传
也在学着,你是用哪本书或者是哪个教程?互勉
这几天我看完郭老师的矩阵键盘,也在研究矩阵的更好的少秒方式,用反转法的确不错,正在研究
你的主函数里根本没有调用显示函数嘛,
怎么可能有反映呢?
哦,是我没看清楚
我用的是杨欣的《51单片机应用从零开始》和郭天翔的《新概念51单片机C语言教程》,杨欣那本是用汇编讲的
目前是看郭天祥视频和那本新概念,互勉
他那本新概念的例子有些错误的,要结合其他教材看才好
来看看
用线反转法,扫描矩阵键盘,2步可以获得键值,小编可以看看。
我没有发现。看来不能全信,不过只是开始学,没有教材,看来得参考下杨怡的那本
谢谢告知~
现在正在研究,不过不想通过查键值表来输出数码管显示,觉得有点浪费内存,所以自己做了些处理
