单片机普通IO口双机通信
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
12864液晶串口显示
发送机P1口与接收机P0口间接一块74H573 发送机:
#include<reg52.h>
#define uchar unsigned char
sbit s1=P3^0;//按键
uchar num=0x00;
void delay(uchar z)
{
uchar i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void key()
{
if(s1==0)
{
delay(5);
if(s1==0)
{
num++;
if(num==0x0a)
{
num=0x00;
}
}
while(!s1);
}
}
void main()
{
while(1)
{
key();
P1=num;
delay(2);
}
}
接收机:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uint i,j,k;
sbit SID = P2^5; //串行数据
sbit SCLK = P2^6; //串行同步时钟uchar code table[]="0123456789";
/*****延时子程序*****/
void delay(uint z)
{
for(i=z;i>0;i--);
for(j=110;j>0;j--);
}
void delay50us(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=19;j>0;j--);
}
/*****串行发送一个字节*****/
void send_byte(uchar byte)
{
uchar i;
for(i=0;i<8;i++)
{
SCLK = 0;
byte=byte<<1; //左移一位先发送高位的数据
SID = CY; //移出的位给SID
SCLK = 1; //上升沿触发发送
SCLK = 0;
}
}
/*****写指令*****/
void write_com(uchar com )
{
delay(5);//检测忙的子程序我们就不写了,因为串行的不支持读操作,我们就用个延时吧
send_byte(0xf8); //11111,RW(0),RS(0),0
send_byte(0xf0&com); //高四位数据分两次发送,而且把数据放在高四位上发送
send_byte(0xf0&com<<4); //低四位(先执行<<)
}
/*****写数据*****/
void write_dat(uchar dat)
{
delay(5);
send_byte(0xfa); //11111,RW(0),RS(1),0
send_byte(0xf0&dat); //高四位
send_byte(0xf0&dat<<4); //低四位(先执行<<)
}
/*****初始化LCD*****/
void init()
{
delay(100);
write_com(0x30);
delay50us(4);
write_com(0x30);
delay50us(4);
write_com(0x0c); //打开显示
delay50us(4);
write_com(0x01); //清屏
delay(50);
write_com(0x06);
delay(10);
}
void display()
{
uchar num;
uint shu;
num=P0;
shu=num/10;
write_com(0x80); write_dat(table[num]); delay(5);
}
/*****主函数*****/ void main(void)
{
P0=0x00;
init();
while(1)
{
display();
}
}。