sbit smgk=P2^7; uchar Pre_KeyNo=16,KeyNo=16; uchar code LEDData[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07, 0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79, 0X71} /*****延时子程序*****/ void Delay(uint x) { uchar i; while(x--) for(i=0;i<120;i++); } /**************LED显示子程序***************/ void Display_Result(int d) { smgk=1; P0=0X7C; smgd=1; P0=LEDData[d/100]; //显示百位 Delay(5); smgd=0; smgk=0; smgk=1; P0=0X7D; smgd=1; P0=LEDData[d/10]; //显示十位 Delay(5); smgd=0; smgk=0; P0=0x7E; smgd=1; P0=LEDData[d]; //显示个位 Delay(5); smgk=0; smgd=0; smgk=1; P0=0X7C; smgd=1; P0=0x80; //显示小数点 Delay(5); smgd=0; smgk=0; } /************键盘扫描子程序**************/ 37 void Keys_Scan() { uchar Tmp,An; P3=0XF0; //低四位置1,放入4行 Delay(1); An=P3^0XF0; //按键后11110000将变成XXXX0000,X中有一个为0,3个仍为1,而异或操作会把3个1变成0,唯一的0变成1 Tmp=An>>4; //该表达式将高4位移到低四位 swith(Tmp) //判断按键发生在哪列 { case 1:KeyNo=0;break; case 2:KeyNo=1;break; case 4:KeyNo=2;break; case 8:KeyNo=3;break; default: KeyNo=16; //无键按下 } P3=0X0F; //高4位置0,放入4列 Delay(1); Tmp=P3^0xF0; // 按键后00001111将变成0000XXXX,X中有一个为0,3个仍为1,而异或操作会把3个1变成0,唯一的0变成1 switch(Tmp) //0—3行分别附加起始值0,4,8,12 { case 1:KeyNo+=0;break; case 2:KeyNo+=4;break; case 4:KeyNo+=8;break; case 8:KeyNo+=12;break; } } /********向串口发送数据子程序*********/ void putc_to_serialport(uchar C) { SBUF=C; while(T1==0); TI=0; } 38 Display() { smgK=1; P1=0X01; Smgd=1; P0=OXOF; } /*******主程序*******/ void main() { P0=0x00; SCON=0x50; //串口工作于方式1 TMOD=0x20; //T1工作于模式2 PCON=0x00; //波特率不加倍 TH1=0xFD; //波特率为9600 TL1=0xFD; TI=RI=0; TR1=1; //启动定时器1 IE=0x90; //允许串口中断 while(1) { Delay(100); if(P3!=0X0F) Keys_Scan(); swith(KeyNo) { case 0:putc_to_serialport(0X00); break; case 1:putc_to_serialport(0XF8); break; case 2:putc_to_serialport(0XF9); break; case 3:putc_to_serialport(0XFA); break; case 4:putc_to_serialport(0XFB); break; case 5:putc_to_serialport(0XFC); break; case 6:putc_to_serialport(0XFD); break; case 7:putc_to_serialport(0XFE); break; case 8:putc_to_serialport(0XFF); break; case 16:Display() 39 } } } /*******主机串口接受中断函数*********/ void Serial_INT() interrupt 4 { if(RI) { int i,j,m; long int n; uchar c; c=SBUF; i=c*0x05; j=i*0x10; n=j*0x10; m=n/0xFF; Display_Result(m); } 从机部分程序 # include