串口,I2C总线,EEPROM及液晶驱动的时间冲突问题

或许是我的构思一开始就是错误的,串口的接受速度远大于数据的存取和液晶的驱动的时间总和。从电脑传过去的字符总是会漏掉好多,如今只能写入一个字节的数据。真是猪脑子,浪费了半天时间。

这是我自己写的单片机实现电话本,可以从电脑录入姓名与电话,并可以手动查询。但是存储和液显的时间太长,没法及时从电脑录入数据。但是串口,I2C总线,EEPROM,液晶的驱动程序是对的。串口的传输能否像I2C一样能被我自己控制呢。

#include
#define unchar unsigned char
unchar ac;
sbit E=P2^7 ;
sbit RS=P2^6 ;
sbit RW=P2^5 ;
sbit SDA=P2^1;
sbit SCL=P2^0;
/****数据延时****/
void NOP(void)
{;;}


/******操作延时*****/
void delay(unsigned int i)
{
i=124*i;
while(--i);
}

/****液晶指令写入****/
void LCD_cmd(unchar cmd)
{
E=0;
RW=0;
RS=0;
P0=cmd;
delay(2);
E=1;
delay(2);
E=0;
}


/****液晶数据的写入*****/
void LCD_date(unchar date)
{
RW=0;
RS=1;
P0=date;
delay(1);
E=1;
delay(1);
E=0;
}

void init(void)
{
/********* 串口初始化 ******/
TMOD=0X20;
SCON=0X50;
PCON=0X80;
ET1=1;
TR1=1;
TH1=0XF3;
TL1=0XF3;
RI=0;
TI=0;
/********* 液晶初始化 *******/

LCD_cmd(0x6);//设置读写方式,指针自动增一(第二位 1),画面不移动(第一位 0)
LCD_cmd(0xc);//显示开(第三位 1)光标开(第二位 1)光标闪烁开(第一位 1);
LCD_cmd(0x38);//设置显示模式
LCD_cmd(0x1);//清屏,清除指针和RAM数据

/*****按键中断初始化*******/
EA=1;
EX0=1;
EX1=1;
}

/*****数据起始端*********/
void start(void)
{
SDA=1;
NOP();
SCL=1;
NOP();
SDA=0;
NOP();
}

/***** 数据结束端 ********/
void stop(void)
{
SDA=0;
NOP();
SCL=1;
NOP();
SDA=1;
NOP();
}

/******发送数据*********/
void send_message(unchar date)
{
unchar temp,i;
temp=date;
SCL=0;
NOP();
for (i=0;i<8;++i)
{
temp=temp<<1;
SDA=CY;
NOP();
SCL=1;
NOP();
SCL=0;
NOP();
}
SDA=1;
NOP();
}

/***** 接收数据 *****/
unchar rece_message(void)
{
unchar date,temp,i;
SCL=0;
CY=0;
NOP();
for(i=0;i<8;++i)
{
SCL=1;
NOP();
temp=SDA;
date=date<<1;
date=date|temp;
SCL=0;
NOP();
}
SDA=1;
NOP();
return date;
}

/***** 应答接收 ********/
unchar ack_back(void)
{
unchar ack;
SCL=0;
NOP();
SCL=1;
NOP();
ack=SDA;
NOP();
SCL=0;
return ack;
}

/****完整接收数据*******/
unchar get(unchar add)
{
unchar date;
delay(50);
start();
send_message(0xa0);
ack_back();
send_message(add);
ack_back();
start();
send_message(0xa1);
ack_back();
date=rece_message();
stop();
delay(50);
return date ;
}

/******完整写入数据*******/
void write(unchar date,unchar add)

{
init();
start();
send_message(0xa0); //发送地址码
ack_back();
send_message(add); //存储的内容首地址
ack_back();
send_message(date);
ack_back();
stop();
}

/*****写入数据串 并分配指针地址*******/
void write_s (unchar date)
{
if(date!='#')
write(date,ac);
if (date=='#')
{ac=ac+0x10;write(ac,0xff);}
}

void main()
{

init();
//ac=get(0xff);
while(1)
{
while(!RI);
RI=0;
// write_s(SBUF);
LCD_date(SBUF);

}
}

不以程序长短论英雄,成败完全取决于细节的把握。一步登天难,十天学会单片机更难。扎实的基础,刻苦的精神是成功的必备。谨以此句,哀悼我三个失败的项目。EPROM莫名的错误已让我发疯。高强度的脑力,低质量的四小时睡眠,我已经精疲力竭了。我真以为我能一步登天,我太急躁了。

永不止步步 发表于11-16 09:40 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67417个|学分:363741个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号