C51_将按键次数写入AT24C02,再读出送LCD显示

//C51_将按键次数写入AT24C02,再读出送LCD显示
//这篇文章较为详细介绍了AT24C02,感谢!
//开发版在连接AT24C02千万别连错,视力不好的近视的连好了仔细检查
//思路:1.利用以前编写的LCD显示函数(直接copy)
2.消抖程序确认按键按下(电平改变,直接copy)
3.计数程序
4.AT24C02的相关程序
#code

#include<reg51.h>       
#include<intrins.h>     //包含_nop_()函数的头文件
/*LCD模块与单片机引脚连接确定*/
sbit RS=P1^0;//RS为寄存选择位,引脚根据自己的电路图定义
sbit RW=P1^1;//读写选择位
sbit E=P1^2;//LCD模块使能端
sbit BF=P0^7;//1602字符型LCD设置的忙碌标志位BF连接在8位双向数据线的D7位上根据单片机原理图我对应于P0^7引脚
sbit S=P1^4;            //开关
#define	OP_READ	0xa1	// 宏 全局定义
#define	OP_WRITE 0xa0	
sbit SDA=P3^4;          //SDA根据原理图设置引脚
sbit SCL=P3^3;         
unsigned char code digit[ ]={
   "0123456789"}; //
/*LCD设置*/
/***************************************************
延时基函数:设置目的为根据所需时间随意改变谁让这是1ms
***************************************************/
void delay1ms()
{
   
   unsigned char i,j;	
	 for(i=0;i<10;i++)
	  for(j=0;j<33;j++)//time~=3*(i*j)
	   ;		 
 }
/*****************************************************
延时自定义函数:根据基变量1ms来自定义定延迟时间函数
***************************************************/
 void delaynms(unsigned char n)
 {
   
   unsigned char i;
	for(i=0;i<n;i++)
	   delay1ms();
 }
/*****************************************************
LCD模块状态检测>>>LCD模块是慢显示器>>>在写每一条指令前需要检测
忙碌状态,忙等,不忙在执行。
***************************************************/
 unsigned char BusyTest(void)
  {
   
    bit result;
	RS=0;       
//RS是寄存器选择,RS=0为选择了指令寄存器>>>检查是否忙碌跟指令相关
    RW=1;
//RW为读写选择,RW=1为读LCD的忙碌状况>>>检查是要去读状态
    E=1;        
//E是模块使能端,负跳变时E=1,LCD模块开始执行命令
    _nop_();   //一个空的机器周期(记住就OK啦!)
    _nop_();
    _nop_(); 
    _nop_();   //4个机器周期,让硬件有充足反应时间>>>LCD是一个慢显示器
    result=BF;  //把BF的状态给result返回传达忙碌状态
   E=0;         //不得进行读/写操作
   return result;//result=1 busy;result
  • 11
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,我可以为您提供一些思路来实现这个任务。 首先,您需要连接AT24C02芯片和LCD1602显示屏到您的控制器(如Arduino)上。您可以使用Wire库来与AT24C02通信,并使用LiquidCrystal库来控制LCD1602显示屏。 其次,您需要编写代码来实现写入和读取操作。以下是一个示例代码,可以帮助您开始: ```c #include <Wire.h> #include <LiquidCrystal.h> #define I2C_ADDR 0x50 // AT24C02芯片的I2C地址 #define LCD_RS 12 // LCD1602的RS引脚 #define LCD_EN 11 // LCD1602的EN引脚 #define LCD_D4 5 // LCD1602的D4引脚 #define LCD_D5 4 // LCD1602的D5引脚 #define LCD_D6 3 // LCD1602的D6引脚 #define LCD_D7 2 // LCD1602的D7引脚 LiquidCrystal lcd(LCD_RS, LCD_EN, LCD_D4, LCD_D5, LCD_D6, LCD_D7); void setup() { Wire.begin(); // 初始化I2C总线 lcd.begin(16, 2); // 初始化LCD1602显示lcd.print("Writing 300..."); // 在LCD显示正在写入数据 writeData(0x00, 300); // 将300写入到AT24C02芯片的地址0x00 lcd.clear(); // 清空LCD显示内容 lcd.print("Reading data..."); // 在LCD显示正在读取数据 int data = readData(0x00); // 从AT24C02芯片的地址0x00读取数据 lcd.clear(); // 清空LCD显示内容 lcd.print("Data: "); // 在LCD显示数据 lcd.print(data); // 在LCD显示读取到的数据 } void loop() { // 程序运行完毕后将停留在这里 } void writeData(byte address, int data) { Wire.beginTransmission(I2C_ADDR); // 向AT24C02芯片发写入请求 Wire.write(address); // 发写入的地址 Wire.write((byte)(data >> 8)); // 发写入的数据高8位 Wire.write((byte)(data & 0xFF)); // 发写入的数据低8位 Wire.endTransmission(); // 结束I2C通信 delay(10); // 等待写入完成 } int readData(byte address) { int data = 0; Wire.beginTransmission(I2C_ADDR); // 向AT24C02芯片发读取请求 Wire.write(address); // 发要读取的地址 Wire.endTransmission(); // 结束I2C通信 Wire.requestFrom(I2C_ADDR, 2); // 从AT24C02芯片读取2个字节的数据 if (Wire.available() == 2) { byte highByte = Wire.read(); // 读取数据的高8位 byte lowByte = Wire.read(); // 读取数据的低8位 data = (highByte << 8) | lowByte; // 组合数据 } return data; } ``` 在上面的代码中,我们使用writeData函数将数据300写入到AT24C02芯片的地址0x00,然后使用readData函数从同样的地址读取数据,并将其显示LCD1602上。 请注意,此示例代码仅供参考,并且可能需要根据您的具体硬件和软件环境进行修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值