|  | 
 
| 用“串口调试助手”调试的时候,单片机发送数据,“串口调试助手”能接受数据; 但是“串口调试助手”发送数据时,单片机接收不到数据。。。???
 
 include <pic.h>
 //预定义
 #define uch unsigned char
 //显示用码表
 const uch shu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0xff};
 //变量
 int data,temp1,temp2,temp3,temp;
 uch flag,keylock;
 uch point,buffer[3];
 //初始化
 void init()
 {
 TRISB=0;
 PORTB=0;
 TRISC=0;
 PORTC=0;
 keylock=1;//初始化键盘按键标志位,用于锁定按键
 
 //USART部件初始化
 SPBRG=0x19;//设置波特率为9600bps
 TXSTA=0x04;//选择异步高速8位数据传输模式;
 RCSTA=0x90;//允许串行端口工作
 
 TRISC=0x80;//设置为高阻态,防止干扰
 TXEN=1;//发送允许
 CREN=1;//接收允许
 PEIE=1; //开放外设中断
 RCIE=1; //开放串行口中断
 
 ei();    //开放总中断
 GIE=1;
 
 }
 //显示需要的延时
 void delay()
 {
 int i;
 for(i=0;i<1000;i++);
 }
 
 //发送子程序
 void send_usart()
 {
 uch i;
 for(i=0;i<3;i++)//每次发3个数据
 {
 if(i==0)TXREG=(data/100)+0x30;//求得百位
 if(i==1)TXREG=data%100/10+0x30; //求得十位
 if(i==2)TXREG=data%10+0x30; //求得个位
 
 while(1)
 {
 if(TXIF==1)break;//等待发送完成
 }
 }
 }
 
 //中断接收子程序
 void interrupt receive(void)
 {
 if(point<3)//是否已经接收到3个数据
 buffer[point++]=RCREG-48;//没有,继续接收
 else point=0;//是,指针复位
 data=buffer[0]*100+buffer[1]*10+buffer[2];//组合成三位数
 
 }
 
 //数码管显示
 void display(int dis_data)
 {
 int dis_data_ge,dis_data_shi,dis_data_bai;
 dis_data_ge =dis_data%10;//个位
 dis_data_shi=dis_data%100/10;//十位
 dis_data_bai=dis_data/100;    //百位
 if(dis_data==0)//若数据为0,只显示1位
 {
 dis_data_ge=0;
 dis_data_shi=10;
 dis_data_bai=10;
 }
 if(dis_data<10)//若数据小于10,则十位与百位关闭显示
 {
 dis_data_shi=10;
 dis_data_bai=10;
 }
 if(dis_data<100)//若数据小于100,则只显示两位
 {
 dis_data_bai=10;
 }
 
 RC0=0;
 RC1=0;
 RC2=1;
 PORTB=shu[dis_data_ge];//个位送显
 delay();
 
 RC0=0;
 RC2=0;
 RC1=1;
 PORTB=shu[dis_data_shi];//十位送显
 delay();
 
 RC1=0;
 RC2=0;
 RC0=1;
 PORTB=shu[dis_data_bai];//百位送显
 delay();
 }
 
 //键盘(线反转法)
 void presskey()
 {
 uch line,column,key;
 TRISD=0x07;
 PORTD=0xf0;
 column=PORTD & 0x07;//取列码
 
 TRISD=0xf0;
 PORTD=0x0f;
 line=PORTD&0xf0;//取行码
 key=line|column;//合成键值
 
 if(key==0)keylock=0;//保证每次只按一次键
 if(keylock==0)
 {
 if(key!=0)keylock=1;
 switch(key)//查找键值
 {
 case 0x11:temp=3;flag++;break;
 case 0x12:temp=2;flag++;break;
 case 0x14:temp=1;flag++;break;
 case 0x21:temp=4;flag++;break;
 case 0x22:temp=5;flag++;break;
 case 0x24:temp=6;flag++;break;
 case 0x41:temp=9;flag++;break;
 case 0x42:temp=8;flag++;break;
 case 0x44:temp=7;flag++;break;
 case 0x82:temp=0;flag++;break;
 case 0x81:flag=4;send_usart();break;//发送
 case 0x84:flag=0;data=0;break;//清零键
 }
 }
 if(flag==1)//第一次按键
 {
 if(temp==0)flag=0;//若按0,则忽略
 temp1=temp;
 data=temp1;
 }
 if(flag==2)//第二次按键
 {
 temp2=temp;
 data=temp1*10+temp2;//原来的个位变成十位
 }
 if(flag==3)//第三次按键
 {
 temp3=temp;
 data=temp1*100+temp2*10+temp3;//原来的十位变成百位
 flag=4;//屏蔽按键
 }
 }
 
 //主程序
 main()
 {
 init();
 while(1)
 {
 
 presskey();
 display(data);
 }
 }
 
 
 单片机是PIC16F877
 
 | 
 |