/************************************************************//*
51单片机 双机 双工 及 CH451芯片显示
通信 C
程序 *//*************************************************************/
#include
sbit DIN=P1^0;
sbit DCLOK=P1^1;
sbit LOAD=P1^2;
sbit DOUT=P3^3;
unsigned char t,r,re,K;
void InitUart();
send (unsigned int s);
unsigned int receive();
/******** 主 函 数 ************/
void main()
{
InitUart(); //初始化串口
send(0x0403); //设定系统参数,关闭键盘扫描,开启显示扫描驱动
send(0x500); //设定显示参数
EX1=1;
EA=1;
while(1); //等待串口发来数据
}
/******* 键 盘 中 断 函 数 *********/
void intr_int2() interrupt 2
{
EA=0;
send(0x700); //发送读键码命令
EA=1;
t=receive(); //接收并判断键码,将键码结果放入SBUF中发送
TI=0; //发送数据
SBUF=t;
while(!TI);TI=0;
}
/******* 串 口 中 断 函 数 *********/
void intr_int4() interrupt 4
{ EA=0;
RI=0; //清除串口接收中断标志
re=SBUF; //收到的数据送数码管显示
if(re!=0)
{
send(0x300); //左移1位
send(0x800|re);
}
EA=1;
}
/****** 发 送 数 据 函 数 ******/
send (unsigned int s)
{
unsigned char i,t;
LOAD=0;
for(i=0;i<12;i++)
{
t=s&0x001;
DIN=t;
DCLOK=0;
DCLOK=1;
s=s>>1;
}
LOAD=1;
}
/******* 接 收 数 据 函 数 ******/
unsigned int receive()
{
unsigned char i;
unsigned char r=0;
for(i=0;i<7;i++) //接收键码
{
r=r<<1;
r=r|DOUT;
DCLOK=1;
DCLOK=0;
}
switch(r) //判断键码
{
case 0x53:K=0x3f;break;
case 0x52:K=0x06;break;
case 0x4A:K=0x5b;break;
case 0x42:K=0x4f;break;
case 0x51:K=0x66;break;
case 0x49:K=0x6d;break;
case 0x41:K=0x7d;break;
case 0x50:K=0x07;break;
case 0x48:K=0x7f;break;
case 0x40:K=0x6f;break;
default:K=0x00;break;
}
return (K);
}
/******* 串 口 初 始 化 函 数 ******/
void InitUart()
{
SCON=0X50; //串口工作在方式1,波特率9600bit/s,允许接收
TMOD=0x20; //定时器T1,工作在方式1
PCON=0x0;
TH1=0xfd;
TL1=0xfd;
TR1=1;
ES=1;
}
??
??
??
??