at24c16如何划分出多个读写区_读写AT24C02,并用1602显示
#include
#include
/*********************************LCD定义部分********************************/
//输入方式设置
#define LCD_AC_AUTO_INCREMENT 0x06 //数据读、写操作后,AC自动增一
#define LCD_AC_AUTO_DECREASE 0x04 //数据读、写操作后,AC自动减一
#define LCD_MOVE_ENABLE 0x05 //数据读、写操作,画面平移
#define LCD_MOVE_DISENABLE 0x04 //数据读、写操作,画面不动
#define LCD_GO_HOME 0x02 //AC=0,光标、画面回HOME位
//设置显示、光标及闪烁开、关
#define LCD_DISPLAY_ON 0x0C //显示开
#define LCD_DISPLAY_OFF 0x08 //显示关
#define LCD_CURSOR_ON 0x0A //光标显示
#define LCD_CURSOR_OFF 0x08 //光标不显示
#define LCD_CURSOR_BLINK_ON 0x09 //光标闪烁
#define LCD_CURSOR_BLINK_OFF 0x08 //光标不闪烁
//光标、画面移动,不影响DDRAM
#define LCD_LEFT_MOVE 0x18 //LCD显示左移一位
#define LCD_RIGHT_MOVE 0x1C //LCD显示右移一位
#define LCD_CURSOR_LEFT_MOVE 0x10 //光标左移一位
#define LCD_CURSOR_RIGHT_MOVE 0x14 //光标右移一位
//工作方式设置
#define LCD_DISPLAY_DOUBLE_LINE 0x38 //两行显示
#define LCD_DISPLAY_SINGLE_LINE 0x30 //单行显示
#define LCD_CLEAR_SCREEN 0X01 //清屏
/***********************LCD1602地址相关******************************/
#define LINE1_HEAD 0x80 // 第一行DDRAM起始地址
#define LINE2_HEAD 0xc0 // 第二行DDRAM起始地址
#define LINE1 0 //第一行
#define LINE2 1 //第二行
#define LINE_LENGTH 16 //每行的最大字符长度
/***********************LCD1602接线引脚定义**************************
**********************可根据实际电路改变*******************************/
#define LCDIO P3 //定义P2口与LCD1602的数据口相接
sbit LCD_RS=P1^4;
sbit LCD_RW=P1^3;
sbit LCD_EN=P1^2;
sbit LCD_BUSY=LCDIO^7;
/**********************另外相关的定义*********************************/
#define HIGH 1
#define LOW 0
#define TURE 1
#define FALSE 0
#define uchar unsigned char
#define uint unsigned int
#define NUM 12
/*************************以下是函数的申明部分*************************/
void LCD_init(void); //LCD1602初始化
void LCD_send_command(uchar command); //
void LCD_send_data(uchar dat);
void LCD_write_char(uchar x,uchar y,uchar dat);
void LCD_write_string(uchar x,uchar y,char *Data);
void delay_ms(uint n);
void LCD_check_busy(void);
/*********************结束***********************************************/
//at24c02 part
#define WRITE24C02 0xA0
#define READ24C02 0xA1
//I2C part
#define Wait1us _nop_();
#define Wait2us {_nop_();_nop_();}
#define Wait4us {Wait2us;Wait2us;}
#define Wait8us {Wait4us;Wait4us;}
#define Wait10us {Wait8us;Wait2us;}
sbit SDA=P2^7; //AT24C02 serial data pin 5
sbit SCL=P2^6; //AT24C02 serial clock pin 6
/********************************************************************/
void I2C_start(void);//I2C start function
void I2C_stop(void);//I2C stop function
//void I2C_send_ack(void);//I2C send responsion function
void I2C_send_noack(void);
bit I2C_write_byte(unsigned char IIC_data);//I2C bus write byte function
unsigned char I2C_read_byte(void);//I2C bus read byte function
/********************************************************************/
void AT24C02_write(unsigned char address,unsigned char *buf,unsigned char n);//write 24c02 information function
void AT24C02_read(unsigned char address,unsigned char *buf,unsigned char n);//read 24c02 information function
/********************************************************************/
void Mcu_init(void);//system initize funcition
void I2C_init(void);
unsigned char count[2];
unsigned char sharebuf[NUM]={'A','B','C','D','1','2','3',')','\0','\0','\0','\0'};
//unsigned char sharebuf[NUM];
unsigned char readbuf[NUM];
/********************************************************************/
delay32()
{
unsigned int i=300;
while(i--);
}
void main()
{
unsigned char temp;
Mcu_init();
AT24C02_write(0x00,sharebuf,8);
AT24C02_read(0x00,readbuf,8);
//LCD_write_char(0x08,LINE2,(readbuf[3]/10)|0x30);
//LCD_write_char(0x09,LINE2,(readbuf[3]%10)|0x30);
//LCD_write_char(0x0a,LINE2,(readbuf[4]/10)|0x30);
//LCD_write_char(0x0b,LINE2,(readbuf[4]%10)|0x30);
//LCD_write_char(0x0c,LINE2,(readbuf[5]/10)|0x30);
//LCD_write_char(0x0d,LINE2,(readbuf[5]%10)|0x30);
//LCD_write_char(0x0e,LINE2,(readbuf[6]/10)|0x30);
//LCD_write_char(0x0f,LINE2,(readbuf[6]%10)|0x30);
LCD_write_string(0x00,LINE1,sharebuf);
LCD_write_string(0x00,LINE2,readbuf);
while(1){}
/*while(1)
{
sharebuf[0]=count[1];
sharebuf[1]=count[0];
AT24C02_write(0x00,sharebuf,2);
AT24C02_read(0x00,sharebuf,2);
temp=sharebuf[0];
LCD_write_string(0x00,LINE1,"AT24C02 TEST");
LCD_write_char(0x0e,LINE1,(temp/10)|0x30);
LCD_write_char(0x0f,LINE1,(temp%10)|0x30);
LCD_write_string(0x00,LINE2,"TIMER0 JISHU");
LCD_write_char(0x0e,1,(count[1]/10)|0x30);
LCD_write_char(0x0f,1,(count[1]%10)|0x30);
}*/
}
/***********************************************************************/
void timer0(void) interrupt 1 using 1
{
TH0=-(12000/256);
TL0=-(12000%256);
count[0]=count[0]+1;
if(count[0]==100)
{
count[0]=0;
count[1]=count[1]+1;
if(count[1]==99)
count[1]=0;
}
//12ms中断1次
}
/***********************************************************************/
void Mcu_init(void)
{
TMOD=0x01;
TH0=-(12000/256);
TL0=-(12000%256);
EA=HIGH; //启用所有中断功能
ET0=HIGH; //启用TF0中断功能;
//以上两句相当于 IE= 0x82;
TR0=HIGH; //启动定时器0;
LCD_init();
}
/***********************************************************************/
/******************************** I2C PART **************************/
void I2C_start(void)
{
SCL=1; Wait2us;
SDA=1; Wait2us;
SDA=0; Wait2us;
SCL=0; Wait2us;
}
/***********************************************************************/
void I2C_stop(void)
{
SDA=0;Wait2us;
SCL=1;Wait2us;
SDA=1;Wait2us;
SCL=0;Wait2us;
}
/***********************************************************************/
void I2C_send_ack(bit sig)
{
SDA=0;Wait2us
SCL=1;Wait2us
SCL=0;Wait2us
SDA=1;
}
/*************************************************************************/
void I2C_send_noack(void)
{
SDA=1;Wait2us
SCL=1;Wait2us
SCL=0;
}
/*****************************************************************************/
void I2C_send_ackold(bit sig)
{
SDA=sig;
SCL=0;Wait2us;
SCL=1;Wait2us;
SCL=0;Wait2us;
}
void I2C_TestACK(void){
Wait10us;
}
/***********************************************************************/
bit I2C_write_byte(unsigned char input)
{
bit ack;
unsigned char temp;
for(temp=0;temp<8;temp++)
{
SDA=0;
if ((input<
SCL=1;Wait2us;
SCL=0;
}
SDA=1;Wait2us;//释放数据线,准备接收应答信号
ack=SDA;
SCL=1;Wait2us;
SCL=0;
return ack;
}
/***********************************************************************/
unsigned char I2C_read_byte(void)
{
unsigned char temp,rbyte=0;
SDA=1;
for(temp=0;temp<8;temp++)
{
SCL=0;Wait2us
SCL=1;
rbyte<<=1;
if (SDA==1){rbyte+=1;}
}
SCL=0;
return(rbyte);
}
/************************************************************************/
void AT24C02_write(unsigned char address,unsigned char *buf,unsigned char Nbyte)
{
I2C_start();
I2C_write_byte(WRITE24C02);
I2C_TestACK();
I2C_write_byte(address);
I2C_TestACK();
for(;Nbyte!=0;Nbyte--)
{
I2C_write_byte(*buf);
I2C_TestACK();
buf++;
}
I2C_TestACK();
I2C_stop();
delay_ms(10);//这个很重要,调了几天问题就是出在h里的,最好在每个函数之间加延时
}
/************************************************************************/
void AT24C02_read(unsigned char address,unsigned char *buf,unsigned char Nbyte)
{
I2C_start();
I2C_write_byte(WRITE24C02);
I2C_TestACK();
I2C_write_byte(address);
I2C_TestACK();
I2C_start();
I2C_write_byte(READ24C02);
I2C_TestACK();
while(Nbyte!=1)
{
*buf=I2C_read_byte();
I2C_send_ack(0);
buf++;
Nbyte--;
}
*buf=I2C_read_byte();
I2C_send_noack();
I2C_stop();
}
/**************LCD1602的初始化***************************/
void LCD_init(void)
{
LCD_send_command(LCD_DISPLAY_DOUBLE_LINE);
LCD_send_command(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);
LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_OFF);
LCD_send_command(LCD_CLEAR_SCREEN);
}
/***********************检测LCD状态*********************************/
void LCD_check_busy(void)
{
do
{
LCD_EN=0;
LCD_RS=0;
LCD_RW=1;
LCDIO=0xff;
LCD_EN=1;
}
while(LCD_BUSY==1);
LCD_EN=0;
}
/************LCD1602写命令*******************************/
void LCD_send_command(uchar command)
{
LCD_check_busy();
LCD_RS=LOW;
LCD_RW=LOW;
LCD_EN=HIGH;
LCDIO=command;
LCD_EN=LOW;
}
/********************************************************/
/*****************LCD1602写数据**************************/
void LCD_send_data(uchar dat)
{
LCD_check_busy();
LCD_RS=HIGH;
LCD_RW=LOW;
LCD_EN=HIGH;
LCDIO=dat;
LCD_EN=LOW;
}
/***********************LCD1602显示字符*********************************/
void LCD_write_char(uchar x,uchar y,uchar dat)
{
unsigned char address;
if (y == LINE1)
address = LINE1_HEAD + x;
else
address = LINE2_HEAD + x;
LCD_send_command(address);
LCD_send_data(dat);
}
/******************LCD1602显示字符串*********************/
void LCD_write_string(uchar x,uchar y,uchar *Data)
{
if(y==LINE1)
{
if(x
{
LCD_send_command(LINE1_HEAD+x);
for(;x
{
LCD_send_data(*(Data++));
}
if(*Data!='\0')
{
x=0;
y=LINE2;
}
}
}
if(y==LINE2)
{
LCD_send_command(LINE2_HEAD+x);
for(;x
{
LCD_send_data(*(Data++));
}
}
}
/****************************************************************/
/********************延时函数***********************************/
/***************************************************************/
void delay_ms(uint n)
{
uint i,j;
for(i=n;i>0;i--)
for(j=0;j<1140;j++)
;
}
/*********************************************************************/
at24c16如何划分出多个读写区_读写AT24C02,并用1602显示相关推荐
- at24c16如何划分出多个读写区_漫话:如何给女朋友解释为什么Windows上面的软件都想把自己安装在C盘...
周末,我在家里面看电视,女朋友正在旁边鼓捣她的电脑,但是好像并不是很顺利,于是就有了以下对话. 计算机存储 我们使用的计算机中,保存信息的介质有两类: 一类是内部存储器,一断电就会把记住的东西丢失. ...
- mysql读写分离优点_mssql2008 读写分离_mysqlproxy读写分离_读写分离的好处
mssql2008 读写分离 在一些大型的网站或者应用中,单台的SQL Server 服务器可能难以支撑非常大的访问压力.mssql2008 读写分离很在这时候,第一个想到的就是一个解决性能问题的利器 ...
- at24c16如何划分出多个读写区_如何1分钟遍历100T数据?
如何快速遍历一个超大数据集 ? 文件是存储在磁盘上的,文件的读写访问速度受限于磁盘的物理限. 如果才能在1 分钟内完成 100T 大文件的遍历呢? 磁盘存储结构 磁盘是一种可持久保存,持续读写数据的存 ...
- at24c16如何划分出多个读写区_AVR学习笔记九、基于AT24C16的数据存储实验
Ema{@AVR 学习笔记九.基于 AT24C16 的数据存储实验 ------- 基于 LT_Mini_M16 9.1 用 I/O 口模拟 I2C 总线实现 AT24C16 的读写 9.1.1 .实 ...
- at24c16如何划分出多个读写区_51单片机向at24c16EPROM写入一个数据每问题,写入多个数据,读出的数据都一样...
#include#defineucharunsignedcharsbitsda=P2^0;sbitscl=P2^1;uchara;voiddelay(){;;}voidstart()//开始信号{sd ...
- raid读写速度对比_读写速度对比:两者伯仲之间_三星 840EVO mSATA_固态硬盘评测-中关村在线...
■ATTO Disk Benchmark最大读写测试 ATTO Disk Benchmark是一款优秀且免费的磁盘基准测试软件,支持对稳定性/突发性传输速率进行读写测试,适用于常规硬盘.RAID.US ...
- 什么是堆栈?内存中划分出按FIL0方式操作的特殊区域,叫做堆栈
内存中划分出按FIL0方式操作的特殊区域,叫做堆栈 有两个操作,分为压栈,出栈 每次压栈和出栈以字为单位. SS存放段基值,SP存放栈顶单元偏移量 SS:SP构成堆栈指针 物理地址SSx16+SP 常 ...
- 长安二中计算机学院,最新!第一波中考录取分数线出炉!长安区12所高中录取分数线正式公布!...
原标题:最新!第一波中考录取分数线出炉!长安区12所高中录取分数线正式公布! 8月1日,长安区正式公布本区12所高中录取分数线信息. 从分数线情况来看,长安区2017中考录取分数线最高的为长安一中60 ...
- 深耕技术的同时,别忘了走出自己的舒适区
01 最近认识一个大学生,一个让我觉得非常厉害的大学生--有三个工作室,还有一间店铺:月收入具体有多少,我红着脸不敢问,据他自己说这一周光投资区块链就亏损了一万八! 听他侃侃而谈的时候,总有一根神经在 ...
最新文章
- android应用去掉状态栏_Android 显示、隐藏状态栏和导航栏
- gvim在windows下中文乱码的终极解决方案
- 信息系统项目管理师-项目人力资源管理核心知识点思维脑图
- matlab中sign函数用法
- CSS3中的2D和3D转换知识介绍
- oc引导windows蓝屏_人人都会遇到系统蓝屏问题,教大家自已排除蓝屏,学会一辈子受用...
- mongodb 数字 _id_MongoDB学习笔记MongoDB简介及数据类型
- 多么痛的领悟--写在领英股票被腰斩之后
- c语言凸包算法,基于C语言的凸包算法实现
- 应用安全-提权/降权相关整理
- 套现4.88亿美元,百度从此告别外卖!
- 中国住户收入调查(CHIP)数据及问卷(1988-2008年)
- 设计模式七大原则——里氏替换原则
- 原生JS实现刮刮乐功能
- [NLP]高级词向量表达之Word2vec详解(知识点全覆盖)
- BUUCTF NewStarCTF一些新知识记录
- 量子擦除延迟选择实验时间猜想
- 企业宣传类PPT模板
- 【socket】socket编程总目录
- Vue2到Vue3实战必备技能(一)
热门文章
- 最近写SQL老出错!
- SAP Spartacus 单元测试开发规范
- TypeScript class 的静态成员变量
- SAP Spartacus list view里router-outlet的填充逻辑
- SAP Spartacus cost center list的数据源分析
- scss 里的 Mixins 用法介绍
- SAP CRM 产品主数据搜索alternative ID type下拉菜单的渲染逻辑
- SpringBoot的端口配置server.port没办法设置成Linux的环境变量
- 将阿里云上的nodejs应用配置成SAP云平台上destination的目的地之后
- Hybris commerce的promotion rule里的固定折扣功能