串口,I2C总线,EEPROM及液晶驱动的时间冲突问题
时间:11-29
来源:互联网
点击:
或许是我的构思一开始就是错误的,串口的接受速度远大于数据的存取和液晶的驱动的时间总和。从电脑传过去的字符总是会漏掉好多,如今只能写入一个字节的数据。真是猪脑子,浪费了半天时间。
这是我自己写的单片机实现电话本,可以从电脑录入姓名与电话,并可以手动查询。但是存储和液显的时间太长,没法及时从电脑录入数据。但是串口,I2C总线,EEPROM,液晶的驱动程序是对的。串口的传输能否像I2C一样能被我自己控制呢。
#include#define unchar unsigned charunchar 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莫名的错误已让我发疯。高强度的脑力,低质量的四小时睡眠,我已经精疲力竭了。我真以为我能一步登天,我太急躁了。
串口I2C总线EEPROM液晶驱 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)