|
本帖最后由 tomli561 于 2019-11-21 16:53 編輯
在進(jìn)行通信時,第一次主機(jī)向叢機(jī)發(fā)送數(shù)據(jù)的時候地址只判斷一次,但是之后再判斷就要進(jìn)行兩次地址判斷(有時候是連續(xù)兩次進(jìn)行判斷,有時候又是判斷一次卡主再按一下地址按鍵就判斷完進(jìn)入待發(fā)送數(shù)據(jù))
代碼如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define KEY P0
sbit LED1 = P3^3;
sbit LED2 = P3^4;
sbit MCU1 = P2^0;
sbit MCU2 = P2^1;
sbit rs485dir = P3^2;
uchar x,b;
uchar dz[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
uchar code tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
uchar keyscan();
void delay(uint t);
void init();
uchar keyscan() //鍵盤處理函數(shù)
{
uchar a,c;
KEY=0x0f; //鍵盤口置00001111
if(KEY!=0x0f) //查詢鍵口值是否變化
{
delay(20); //去抖
if(KEY!=0x0f) // 有鍵按下
{
a=KEY; //鍵值放在寄存器a中
}
KEY=0xf0; //將鍵盤口置11110000
c=KEY; //將第二次取得值放入寄存器c中
a=a|c; //將兩個數(shù)據(jù)融合
switch(a) //對比數(shù)據(jù)值
{
case 0xee : b=0;break;
case 0xde : b=1;break;
case 0xbe : b=2;break;
case 0x7e : b=3;break;
case 0xed : b=4;break;
case 0xdd : b=5;break;
case 0xbd : b=6;break;
case 0x7d : b=7;break;
case 0xeb : b=8;break;
case 0xdb : b=9;break;
case 0xbb : b=10;break;
case 0x7b : b=11;break;
case 0xe7 : b=12;break;
case 0xd7 : b=13;break;
case 0xb7 : b=14;break;
case 0x77 : b=15;break;
default:break; //鍵值錯誤處理
}
}
return(b); //將b作為返回值
}
void delay(uint t)
{
uchar i,j;
for(i=0;i<120;i++)
for(j=0;j<t;j++);
}
void init()
{
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
SCON = 0xd0;
PCON = 0x00;
TR1 = 1;
rs485dir = 1;
EA = 1;
// ES = 1;
MCU1 = 1;
MCU2 = 1;
KEY = 0x0f;
}
void main()
{
uchar ADDR;
uchar temp;
init();
while(1)
{
P1 = 0XBF;
temp++;
while(temp!=ADDR)
{
LED1 = 1;
LED2 = 1;
TI = 0;
TB8 = 1;
rs485dir = 1;
delay(20);
while(!(MCU1^MCU2));
if(MCU1==0)
{
delay(50);
if(MCU1==1)
ADDR = dz[0];
}
if(MCU2==0)
{
delay(50);
if(MCU1==1)
ADDR = dz[1];
}
SBUF = ADDR;
while(!TI);
TI = 0;
rs485dir = 0;
delay(20);
LED1 = 0;
LED2 = 1;
P1 = tab[ADDR];
delay(20);
while(!RI);
temp = SBUF;
RI = 0;
delay(20);
}
P1 = 0x40;
rs485dir = 1;
TB8 = 0;
delay(10);
while(KEY==0x0f);
keyscan();
SBUF = tab;
while(!TI);
TI = 0;
P1 = 0xa4;
LED1 = 0;
LED2 = 1;
}
}
|
|