教程上的一段单片机程序,有bug,有时候总按出0来,不知道怎么回事,大神帮忙具体分析下~

#include<reg52.h> //头文件一般无需改动#include<intrins.h> //头文件一般无需改动#define uchar unsigned char //宏定义#define uint unsigned int#define KeyPort P1//定义数据端口 程序中遇到KeyPort 则用P1 替换sbit wei=P2^0;//位锁存器锁存端sbit duan=P2^1;//段锁存器锁存端uchar code EL_duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};//数组数码管要显示的8个字型码01234567uchar code EL_weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位码,分别对应相应的数码管点亮/*********************************************************/void delayms(unsigned int i)//延时函数{ unsigned int j; for(;i>0;i--) for(j=100;j>0;j--);}/***********************************************************//*------------------------------------------------ 按键扫描函数,返回扫描键值------------------------------------------------*/unsigned char KeyScan(void){ unsigned char keyvalue; if(KeyPort!=0xff) { delayms(10);//延时10ms后再检测一次 if(KeyPort!=0xff) { keyvalue=KeyPort;//此是本程序的BUG P1口的值 在松手前获得 但松手后又无法获得 朋友们可以考虑一下解决方法 while(KeyPort!=0xff); switch(keyvalue){ case 0xfe:return 1;break;//比较keyvalue是否=0xfe 如相等 返回 值1 case 0xfd:return 2;break; case 0xfb:return 3;break; case 0xf7:return 4;break; case 0xef:return 5;break; case 0xdf:return 6;break; case 0xbf:return 7;break; case 0x7f:return 8;break; default:return 0;break;} } } }void main(void) { uchar i; KeyPort=0xff;wei=1;//至高电平P0=0x00;//全开数码管wei=0;//锁存 while(1) { i=KeyScan(); duan=1;//至高电平P0=EL_duanma[i];//取字型码,即段码 }}
2026年09月23日 03:17
有1个网友回答
网友(1):

程序BUG是你子函数内部没有返回数值;
unsigned char KeyScan(void) //函数的正确使用方法
{
return (); //返回数据
}

你的程序写的效率不高我给你改一下。
程序我给你改了一下:

unsigned char KeyScan(void)
{
unsigned char keyvalue;
if(KeyPort!=0xff)
{
delayms(10);//延时10ms后再检测一次
if(KeyPort!=0xff)
{
keyvalue=KeyPort;//此是本程序的BUG P1口的值 在松手前获得 但松手后又无法获得 朋友们可以考虑一下解决方法
while(KeyPort!=0xff);
}
}

switch(keyvalue)
{
case 0xfe:return 1;break;//比较keyvalue是否=0xfe 如相等 返回 值1
case 0xfd:return 2;break;
case 0xfb:return 3;break;
case 0xf7:return 4;break;
case 0xef:return 5;break;
case 0xdf:return 6;break;
case 0xbf:return 7;break;
case 0x7f:return 8;break;
default:return 0;break;
}

return (keyvalue); //返回按键数值
}