矩阵按键延时函数和switch(key)语句冲突
按书示例编程出现以下错误:compiling aj_2.c...
AJ_2.C(85): warning C290: missing return value
linking...
Program Size: data=13.0 xdata=0 code=294
"aj_2" - 0 Error(s), 1 Warning(s).
示例编程:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar disnum,temp,key,num;
uchar code table_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0};
delay(uchar); //函数声明
uchar keyscan();
void main()
{
disnum=16;
wela=1;
P0=0XFE;//第一个数码管位选
wela=0;
while(1)
{
num=keyscan(); //用num读取矩阵键盘扫描函数的返回值
P0=table_du;//送段选num
dula=1;
dula=0;
}
}
uchar keyscan() //矩阵键盘扫描函数
{
P3=0xf0;//让P3.0、P3.1、P3.2、P3.3等于0,P3.4、P3.5、P3.6、P3.7等于1
temp=P3;//用temp读取P3口当前的值
temp=temp&0xf0;//把temp的值和0xf0作与运算,即保持高4位变,低4位为0
if(temp!=0xf0) //如果此时的temp不等于0xf0,说明有按键被按下了
{
delay(10); //延时约10ms
if(temp!=0xf0)//再次判断是否真的有按键按下(即消除前沿抖动)
{
temp=P3; //如果有按键按下,temp重新读取P3口的值
temp=temp|0X0f;//作按位或,即保持高4位不变,低4位为1
P3=temp; //把temp的值赋给P3口
key=P3; //然后用key读取P3口的值,作为按键的键值
switch(key) //让每一个键值和数码管显示的数对应起来
{
case 0xee:disnum=0;//当key的值为0xee时,disnum的值为0
break;
case 0xde:disnum=1;//当key的值为0xde时,disnum的值为1
break;
case 0xbe:disnum=2;
break;
case 0x7e:disnum=3;
break;
case 0xed:disnum=4;
break;
case 0xdd:disnum=5;
break;
case 0xbd:disnum=6;
break;
case 0x7d:disnum=7;
break;
case 0xeb:disnum=8;
break;
case 0xdb:disnum=9;
break;
case 0xbb:disnum=10;
break;
case 0x7b:disnum=11;
break;
case 0xe7:disnum=12;
break;
case 0xd7:disnum=13;
break;
case 0xb7:disnum=14;
break;
case 0x77:disnum=15;
break;
}
}
}
return disnum;//返回disnum作为函数值
}
delay(uchar x)//延时函数
{
uchar a,b;
for(a=x;a>0;a--)
for(b=200;b>0;b--);
}
把延时语句删除,没有消除前沿抖动部分,运行正常按顺序显示0-F。
软件Keil uVision4,硬件51单片机最小系统板 STC89C52 开发板扩展按键,数码管等其它编程示例运行正常。
请教各位老师什么情况出现开始的错误谢谢!!! 把delay(uchar); //函数声明
改为void delay(uchar); //函数声明
把 delay(uchar x)//延时函数
{
....
}
改为
void delay(uchar x)//延时函数
{
....
} 在编辑生成过程出现问题,应该和硬件没有关系:L 我喜欢硬件去抖动,读进去来什么就是什么,不需要延时读2次;P iffi123 发表于 2020-11-6 12:16
我喜欢硬件去抖动,读进去来什么就是什么,不需要延时读2次
谢谢,TB买的按键扩展后还行,没有加软件去抖前按键动作基本没有抖动,刻意在按键按下或抬起减缓按键动作,才发生抖动误操作。:handshake pdshyh 发表于 2020-11-6 12:52
谢谢,TB买的按键扩展后还行,没有加软件去抖前按键动作基本没有抖动,刻意在按键按下或抬起减缓按键动作 ...
单片机反应慢;P 延时放那个地方没啥用。temp=P3;delay(10); key = P3; if (key == temp){ 键值判断 } 这样才有延时消抖的效果 iffi123 发表于 2020-11-6 13:09
单片机反应慢
单片机应该是一个周期微妙,按键抖动看介绍10毫秒以内?刚刚接触:L world_all 发表于 2020-11-6 13:19
延时放那个地方没啥用。temp=P3;delay(10); key = P3; if (key == temp){ 键值判断 } 这样才有延时消 ...
谢谢,指教:handshake chhds 发表于 2020-11-6 15:15
把delay(uchar); //函数声明
改为void delay(uchar); //函数声明
谢谢chhds 老师, 延时函数加 void问题解决,DA转换MCP4822能否给一个简单应用c51编程示例,只会比葫芦画瓢。:L 不是错误,是警告而已。
你那个延时函数么有用void修饰,可能你那个编译器默认没有修饰的情况下是要返回值的(比如 int),所以呢,就报警了,缺少返回值。
声明和定义的地方加个void修饰一下应该就好了。 夏国特 发表于 2020-11-6 16:28
不是错误,是警告而已。
你那个延时函数么有用void修饰,可能你那个编译器默认没有修饰的情况下是要返回值 ...
谢谢指教,刚刚接触,前面的示例有的有有的没有void都没问题还是不熟悉,这个警告不处理掉生成不了hex文件。 那不就是个警告么,一般不理会,愿意加Void或者加个返回值也行 , 按说一样可以生成HEX,用的什么版本编译器? Keil U3,u4应该都可以。 IRF540 发表于 2020-11-6 16:41
那不就是个警告么,一般不理会,愿意加Void或者加个返回值也行 , 按说一样可以生成HEX,用的什么版本编译 ...
谢谢,用的是Keil uVision4,翻译是:AJ_2.C(85):警告C290:缺少返回值,也知道是延时函数部分,我把Void加在矩阵键盘扫描函数中的延时函数前了还加错为aoid:L pdshyh 发表于 2020-11-6 16:02
谢谢chhds 老师, 延时函数加 void问题解决,DA转换MCP4822能否给一个简单应用c51编程示例,只会比葫芦画 ...
MCP4822以前是用Arduino控制的,今天有空改了一个,手上只有STC15W408AS,测试通过,但写得简陋,只作参考
页:
[1]
2