编译出现missing return-expression,怎么解决

麻烦大家帮我看看,这程序编译总是出现missing return-expression,谢谢!

#include #include #define uchar unsigned char #define uint unsigned int

#include "CH452W4.C" unsigned char minute=30,hour=12; uchar keyp;

/*********************************************************** * 延时函数 ***********************************************************/ void delayms(uint t) { uchar i; while(t--) for(i=0;i<120;i++); }

/*********************************************************** * 数码管显示 ***********************************************************/ void display() { // CH452_Write(CH452_DIG7 | 0 |CH452_BCD_DOT_X ); //显示数码管的第8位,并加显小数点 // CH452_Write(CH452_DIG6 | 3); //显示数码管的第7位 // CH452_Write(CH452_DIG5 | 2); //显示数码管的第6位 CH452_Write(CH452_DIG4 |hour/10); //显示小时 CH452_Write(CH452_DIG3 |hour%10); CH452_Write(CH452_DIG2 |0x12); //显示"-" CH452_Write(CH452_DIG1 |minute/10); //显示分钟 CH452_Write(CH452_DIG0 |minute%10);

}

/********************************************************** * 处理按键值函数 *************************************************************/ uchar workkeycode(uchar x)

{ if(x==0x51) //键盘第一次按下 { delayms(10); if(x==0x51) { while(!x); //等待键盘释放 while(1) //个位闪烁 { CH452_Write(CH452_DIG0 |0x10); delayms(250); CH452_Write(CH452_DIG0 |minute/10); delayms(250); x=0x51; if(x==0) //键盘再次按下 { delayms(10); if(x==0x51) { while(!x); //等待键盘释放 while(1) //十位闪烁 { CH452_Write(CH452_DIG1 |0x10); delayms(250); CH452_Write(CH452_DIG1 |minute%10); delayms(250); if(x==0x51) //键盘第三次按下 { delayms(10); if(x==0x51) { while(!x); //等待键盘释放 while(1) //百位闪烁 { CH452_Write(CH452_DIG2 |0x10); delayms(250); CH452_Write(CH452_DIG2 |0x12); delayms(250); if(x==0x51) //键盘第四次按下 { delayms(10); if(x==0x51) { while(!x); //等待键盘释放 while(1) //千位闪烁 { CH452_Write(CH452_DIG3 |0x10); delayms(250); CH452_Write(CH452_DIG3 |hour/10); delayms(250); if(x==0x51) //键盘第五次按下 { delayms(10); if(x==0x51) { while(!x); //等待键盘释放 while(1) //千位闪烁 { CH452_Write(CH452_DIG4 |0x10); delayms(250); CH452_Write(CH452_DIG4 |hour%10); delayms(250); } } } } } } } } } } } } } } } }

/*********************************************************** * 显示左循环函数 *************************************************************/ void shife8() { uchar i; for(i=0;i<8;i++) { CH452_Write(CH452_LEFTCYC); //写左循环命令 delayms(300); //移动的速度控制 } } /*********************************************************** * 主函数 *************************************************************/ void main() { //CH452_DOUT=1; // 设置该引脚为输入方向 IE1=0; //设置CH452按键中断 EX1=1; EA=1; CH452_Write(CH452_RESET); CH452_Write(CH452_BCD); // 选择BCD译码方式,扫描极限为8个数码管 // CH452_Write(CH452_SELF_BCD ); // 选择自定义BCD译码方式,扫描极限为8个数码管 // CH452_Write(CH452_TWINKLE + 0x26);//设置闪烁控制,0x26表示[0010 0110]: //高四位的第2位数码管闪烁,低四位的第2和第3位闪烁 CH452_Write(CH452_SYSON2); // 开启显示、键盘 display(); // 显示 shife8(); //左循环8次 // CH452_Write(CH452_CLR_BIT |16); //段位清0,从第一位到第八位,从0段到第63段,刚好8个数码管,8X8=64。 // CH452_Write(CH452_LEVEL|0x2b); //加载光柱,编码小于光柱的会点亮,大于和等于光柱的都会熄灭 while(1) { // CH452_Write(CH452_DIG6 |CH452_BCD_DOT_X); } }

/*********************************************************** * // INT1中断服务程序 *************************************************************/ void int1() interrupt 2 //using 1 { keyp=CH452_Read(); //按键值 keyp=workkeycode(keyp); //处理按键值 if(keyp/10!=0) CH452_Write(CH452_DIG5 | (keyp/10)); //如果十位不为0,显示按键码的十位 else CH452_Write(CH452_DIG5 |CH452_BCD_SPACE); //如果十位为0,则不显示 CH452_Write(CH452_DIG4 | (keyp%10)); //显示按键码的个位

CH452_Write(CH452_SLEEP); }

uchar workkeycode(uchar x)这个函数你的返回值是uchar型变量,你的函数体里面没有一个return调用,肯定会出现missing return-expression,建议在函数体中加上return语句或者改为void workkeycode(uchar x)!


改成void workkeycode(uchar x),出现了更多的错误


加了return x;后,没有编译出错。可是为什么我要是效果没有呢?我需要按键按一下,第一个数码管闪烁,再按一下第二个数码管闪烁,依次类推。


那你看下你读取键值的函数在你按键按下去之后产生中断了吗?还有读取到的键值是多少呢?


具体怎么操作呢?


hcn,请问下,我现在DOUT在按下按键后是低电平,可是不会回复到高电平


那说明你没有将键值读取走,只要读取完键值之后DOUT脚就会拉高。


怎么样才会把键值读取走呢?


hcn,麻烦你告诉我哪里有问题好吗?急啊,找了半天也没找出问题来


CH452_Read这个函数你需要检查下,还有DOUT产生中断之后有没有进入中断函数?这些都需要你自己去判断的。


CH452_Read这个函数是你们官网提供的吧?要是这个没有问题的话,那还有哪里可能出现问题呢?


程序是官方的没问题,那么你的硬件连线包括中断引脚连线和官方提供的例子程序完全一样吗? 仔细检查下问题所在。


hcn,请问你一个问题,昨天我按按键,数码管没有反应。今天我改了个东西,按按键有反应,但是就乱来了。 /* 与单片机有关,与中断连接方式有关 */ #define USE_CH452_KEY 1 // 使用了CH452的按键中断 #ifdef USE_CH452_KEY #define DISABLE_KEY_INTERRUPT {EX1=0;} #define ENABLE_KEY_INTERRUPT {EX1=1;} #define CLEAR_KEY_INTER_FLAG {IE1=0;} #else 你们官网给的pin.h里面的中断设置是这样的, 因为我接的是INT0,所以我改成 /* 与单片机有关,与中断连接方式有关 */ #define USE_CH452_KEY 1 // 使用了CH452的按键中断 #ifdef USE_CH452_KEY #define DISABLE_KEY_INTERRUPT {EX0=0;} #define ENABLE_KEY_INTERRUPT {EX0=1;} #define CLEAR_KEY_INTER_FLAG {IE0=0;} #else 改了以后就有反应了,但是乱来的,帮我看看,我这样改的方向对吗?


只有登录才能回复,可以选择微信账号登录