打印
[51单片机]

矩阵键盘检测求助

[复制链接]
3944|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
why812182493|  楼主 | 2013-12-23 13:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 why812182493 于 2013-12-23 20:15 编辑

实验板用的是TX-1C
单片机:STC89C52RC

代码如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit dula=P2^6;
sbit wela=P2^7;
uchar code num[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

void key(){
        uint i,j;
        uchar temp;
        for(i=0;i<4;i++){      //矩阵键盘的四行,循环四次
                temp=0xfe;
                temp=_crol_(temp,i);      //计算出P3口初值
                P3=temp;      //给P3口赋值
                temp=P3;      //读回P3口的值
                if(temp&0xf0!=0xf0){      //判断是否有键被按下
                        temp=_crol_(temp,-4);      //将高四位移动到低四位
                        for(j=0;temp%2!=0;temp/=2,j++);      //判断低四位中哪一位是零
                        dula=1;
                        P0=num[j+i*4];      //设置段选
                        dula=0;
                }
        }
}
void main(){
        wela=1;
        P0=0;      //初始化位选
        wela=0;
        while(1){
                key();
        }
}

编译提示:
Build target 'Target 1'
compiling temp.c...
temp.c(22): warning C294: unreachable code
linking...
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?CO?TEMP
Program Size: data=11.0 xdata=0 code=77
creating hex file from "temp"...
"temp" - 0 Error(s), 2 Warning(s).

请问两个警告具体是什么原因?
还有,我的代码有什么其他错误吗?
多谢了

相关帖子

沙发
airwill| | 2013-12-23 14:51 | 只看该作者
虽然程序比较简单, 不过拿出来交流, 竟然一条注释都没有, 考人家哪!

请问两个警告具体是什么原因?
                if(temp&0xf0!=0xf0){

怀疑是这个条件判断问题, 把括号写全它吧

使用特权

评论回复
评论
28182900 2013-12-24 09:00 回复TA
非常同意,非常讨厌不注释的程序。 
板凳
why812182493|  楼主 | 2013-12-23 15:00 | 只看该作者
本帖最后由 why812182493 于 2013-12-23 18:54 编辑
airwill 发表于 2013-12-23 14:51
虽然程序比较简单, 不过拿出来交流, 竟然一条注释都没有, 考人家哪!

请问两个警告具体是什么原因?


不好意思,我马上补上注释。
把括号补全?什么意思?我这里括号有什么问题吗?

使用特权

评论回复
评论
hdp7891000 2013-12-23 20:28 回复TA
if((temp&0xf0)!=0xf0) 
地板
dirtwillfly| | 2013-12-23 16:44 | 只看该作者
刚看到你给我的留言,问题解决了吗?

使用特权

评论回复
5
Dick00| | 2013-12-23 17:11 | 只看该作者
程序是拷过来的吧,自己重新写一遍就好了,注意书写规范。。。

使用特权

评论回复
6
booker211| | 2013-12-23 17:24 | 只看该作者
顶一个

使用特权

评论回复
7
as564335sa| | 2013-12-23 18:19 | 只看该作者
没把temp.c添加到工程里边吧

使用特权

评论回复
8
why812182493|  楼主 | 2013-12-23 18:21 | 只看该作者
本帖最后由 why812182493 于 2013-12-23 18:27 编辑
Dick00 发表于 2013-12-23 17:11
程序是拷过来的吧,自己重新写一遍就好了,注意书写规范。。。


程序是我自己写的,看不出错误在哪。
我这个代码哪里写得不规范吗?

使用特权

评论回复
9
why812182493|  楼主 | 2013-12-23 18:22 | 只看该作者
as564335sa 发表于 2013-12-23 18:19
没把temp.c添加到工程里边吧

添加了啊

使用特权

评论回复
10
why812182493|  楼主 | 2013-12-23 18:23 | 只看该作者
dirtwillfly 发表于 2013-12-23 16:44
刚看到你给我的留言,问题解决了吗?

还没解决呢,大神如果有时间的话帮忙看一下,多谢了

使用特权

评论回复
11
as564335sa| | 2013-12-23 20:02 | 只看该作者
把temp换个别的名字试试

使用特权

评论回复
12
dirtwillfly| | 2013-12-23 20:04 | 只看该作者
temp=_crol_(temp,-4);      //讲高四位移动到低四位
这一句有问题,_crol_函数的原型是unsigned char _crol_(unsigned char val,unsigned char n);
使用的参数是无符号数

使用特权

评论回复
13
why812182493|  楼主 | 2013-12-23 20:11 | 只看该作者
dirtwillfly 发表于 2013-12-23 20:04
temp=_crol_(temp,-4);      //讲高四位移动到低四位
这一句有问题,_crol_函数的原型是unsigned char _cro ...


改成4也不行啊。
虽然 _crol_函数 定义的时候说第二个参数要是无符号字符型的,但在实际应用中我发现即便是提供有符号的整形变量作为参数,也可以正常工作。
例如以下这段代码,编译正确,功能正常。
void led(){
        static int i=0,flag=1;
        static uchar light1=0xfe,light2=0x7f;
        P1=light1&light2;
        light1=_crol_(light1,flag);
        light2=_crol_(light2,-flag);
        i++;
        flag=(i%3==0)?-flag:flag;
}

使用特权

评论回复
14
why812182493|  楼主 | 2013-12-23 20:14 | 只看该作者
as564335sa 发表于 2013-12-23 20:02
把temp换个别的名字试试

还是不行。变量名称应该没有关系的吧

使用特权

评论回复
15
dirtwillfly| | 2013-12-23 20:31 | 只看该作者
本帖最后由 dirtwillfly 于 2013-12-23 20:35 编辑
why812182493 发表于 2013-12-23 20:11
改成4也不行啊。
虽然 _crol_函数 定义的时候说第二个参数要是无符号字符型的,但在实际应用中我发现即便 ...

右移建议用_cror_

使用特权

评论回复
16
why812182493|  楼主 | 2013-12-23 21:49 | 只看该作者
airwill 发表于 2013-12-23 14:51
虽然程序比较简单, 不过拿出来交流, 竟然一条注释都没有, 考人家哪!

请问两个警告具体是什么原因?

多谢了,我将括号加上后矩阵键盘就正常了。
不过还有一个问题想不通,就是为什么我按下矩阵键盘的最后一列的时候,实验板上的led灯居然会亮!
这是为什么?没道理啊,led是通过P1口控制的,矩阵键盘用的是P3口,怎么会出现这种现象呢?
另外,郭天祥的TX-1C是不是没办法同时使用独立键盘和矩阵键盘的?二者接的都是P3口。有没有办法通过代码变相解决,达到同时使用的目的?

使用特权

评论回复
17
why812182493|  楼主 | 2013-12-23 21:51 | 只看该作者
dirtwillfly 发表于 2013-12-23 20:31
右移建议用_cror_

多谢了,我将这一句 if((temp&0xf0)!=0xf0) 的括号补全后,矩阵键盘就正常了。
不过还有一个问题想不通,就是为什么我按下矩阵键盘的最后一列的时候,实验板上的led灯居然会亮!
这是为什么?没道理啊,led是通过P1口控制的,矩阵键盘用的是P3口,怎么会出现这种现象呢?
另外,郭天祥的TX-1C是不是没办法同时使用独立键盘和矩阵键盘的?二者接的都是P3口。有没有办法通过代码变相解决,达到同时使用的目的?

使用特权

评论回复
18
dirtwillfly| | 2013-12-23 21:52 | 只看该作者
why812182493 发表于 2013-12-23 21:51
多谢了,我将这一句 if((temp&0xf0)!=0xf0) 的括号补全后,矩阵键盘就正常了。
不过还有一个问题想不通, ...

这个和它的硬件电路有关

使用特权

评论回复
19
why812182493|  楼主 | 2013-12-23 22:12 | 只看该作者
dirtwillfly 发表于 2013-12-23 21:52
这个和它的硬件电路有关

你是说按下最后一列的时候led亮与它的硬件电路有关?
还是说能否同时使用独立键盘和矩阵键盘与它的硬件电路有关?

使用特权

评论回复
20
亿万斯年| | 2013-12-24 14:31 | 只看该作者
学习下华为编程规范吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

16

帖子

0

粉丝