首先对你的设计提出几点意见和建议:作为病房的呼叫系统,呼叫按键肯定是非常多,非常分散,非常长的距离,因此一个芯片上搭的按键是完成不了远距离的控制的,想要不出问题,至少要用到多机通信。现在估且假设你的系统可以完成,程序可以作如下修改:#include<>#define uchar unsigned charsbit key4=P3^0; //按键的检测不需要这样一个个测试,请看清 key_detect()sbit key3=P3^1;sbit key2=P3^2;sbit key1=P3^3;sbit reset=P3^4;sbit BEEP=P1^7;uchar flag1,flag,i;void choice();//你这个按键的函数不太好,我直接去掉,请看清 key_detect()void clean(uchar);//这个改成有参函数void delay();//这个只做延时uchar key_detect();//专门增加一个按键检测void de();这个只做延时void ring();//这个函数只作蜂鸣,不要做别的事void display(uchar);//增加一个有参的显示函数,这个要根据实际的电路,我先假设这个函数已 经成立void main(){ uchar i; P3=0xff; BEEP=0; flag1=0; flag=0;//这个作为显示个数的计数器while(1) { i = key_detect; display(i); clean(i); delay(); }}uchar key_detect(){ uchar i; P3 |= 0x1f i = P3; i = i & 0x1f; switch(i) { case 0x1e: //第一个按键 return 1; break; case 0x1d: return 2; break; case 0x1b: return 3; break; case 0x17: return 4; break; case 0x0f: return 5; break; default: return 0; //没有按键按下就返回0 break; }}void clean(){ if(reset==1) { BEEP=0; P0=0x3f; } }void delay(){ uchar i, j; for(i = 0; i < 100; i++) { for(j = 0; j < 200; j++); }}void ring(){ for(i=0;reset==0;i++) { de(); BEEP=!BEEP; }}void de(){ for(i=300;i>0;i--);}有点难敲,有点事,你先点追问,我待会再继续作答