//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=0 rest}
/*****************************************************
写入指令:将模式设置指令或显示地址写入LCD模块
写指令RS=0;RW=0;E=0>>>E=1>>>E=0(高脉冲,过程才能写入dictate)
***************************************************/
void WriteInstruction (unsigned char dictate)
{   while(BusyTest()==1);   //检查LCD是否忙碌是则空操作等待至位0RS=0;                  //选择指令寄存器RW=0;                  //选择进行写入操作E=0;                   //脉冲开始_nop_();_nop_();               //老年人多体谅给点反应时间P0=dictate;
//把dictate(指令或地址)送入P0口即写入指令或地址           _nop_();_nop_();_nop_();_nop_();               //4个机器周期用于硬件处理E=1;                   //高电平,产生跳变>>>进行读写操作_nop_();_nop_();_nop_();_nop_();               //就是如此无语的慢E=0;
//负跳变完成一个脉冲。LCD模块开始执行dictate。}
/*****************************************************
指定字符显示地址:跟据1602字符型LCD
确定位置的方法80H+地址码知道输出实际地址
***************************************************/void WriteAddress(unsigned char x){WriteInstruction(x|0x80); //通过WriteInstruction函数将指令写入}
/*****************************************************
写数据:将数据(想在LCD上输出的字符标准ASCII码/电脑会将A等自动转为ASCII码/)写入LCD模块
***************************************************/void WriteData(unsigned char y){while(BusyTest()==1);  RS=1;           //选择数据寄存器RW=0;           //写数据E=0;            //高脉冲P0=y;           //将数据送入P0口,将数据写入液晶模块_nop_();_nop_();_nop_();_nop_();       E=1;          _nop_();_nop_();_nop_();_nop_();       E=0;          }
/*****************************************************
LCD初始化
***************************************************/
void LcdInitiate(void)
{delaynms(15);               //首次写指令延时>>>充足反应时间WriteInstruction(0x38);     //显示模式:16*2显示,5*7点阵,8位数据接口delaynms(5);                WriteInstruction(0x38);delaynms(5);WriteInstruction(0x38);     //确保成功delaynms(5);WriteInstruction(0x0c);     //显示模式:显示开,有光标,光标闪烁delaynms(5);WriteInstruction(0x06);     //显示模式:光标移动,字符不动delaynms(5);WriteInstruction(0x01);     //清屏指令delaynms(5);}
/******************************************************************************************************/
void Display(unsigned char x)
{unsigned char i,j;i=x/10;                  j=x%10;                 WriteAddress(0x44);      WriteData(digit[i]);     WriteData(digit[j]);     }
/******************AT24C02的操作******************/
/***************************************************
AT24C02开始信号
***************************************************/
void start()
// 开始传输数据
{SDA = 1;    //串行数据/地址线高电平SCL = 1;    //串行时钟线高电平_nop_();    //机器周期>>>反应时间_nop_(); SDA = 0;    //开始传输数据标志SDA负跳变,SCL尚处于高电平_nop_();    _nop_();    _nop_();    _nop_();   SCL = 0;    //SCL为低电平时,SDA上的数据才允许变化即允许以后数据传输
}
/***************************************************
AT24C02停止信号
***************************************************/
void stop()
// 停止传输数据
{SDA = 0;     //结束出初期SDA为低电平_nop_();     _nop_();    SCL = 1;     //高电平,不允许数据传输_nop_();     _nop_();    _nop_();     _nop_();    SDA = 1;    //最终SDA变为高电平
}
/*以上两步的图解可以参考度娘上的便于理解*/
/***************************************************
从AT24C02读取数据
***************************************************/
unsigned char ReadData()
//将AT24C02数据给MCU
{unsigned char i;unsigned char x;   //存储从AT24C02中读出的数据for(i = 0; i < 8; i++){SCL = 1;                //SCL置为高电平x<<=1;                  //将x中二进制向左移动一位x|=(unsigned char)SDA; //将SDA中的数据通过按位或运算存入x中SCL = 0;                        //在SCL下降时读出数据}return(x);
}
/***************************************************
向AT24C02当前地址写入数据
***************************************************/
//因为要用到start函数,so SCL=0
bit WriteCurrent(unsigned char y)
{unsigned char i;bit ack_bit;               //存储应答位for(i = 0; i < 8; i++)     //循环移入8个位{SDA = (bit)(y&0x80);   //按位与运算将最高位数据送到S//传递时高位在前低位在后_nop_();           SCL = 1;            //上升时将数据写入AT24C02      _nop_();            _nop_();             SCL = 0;            //置零为为循环准备y <<= 1;           }SDA = 1;            // 主机在时钟脉冲的高电平期间释放SDA//ÒÔÈÃSDAÏßתÓɽÓÊÕÉ豸(AT24Cxx)¿ØÖÆ_nop_();        _nop_();        SCL = 1;      _nop_();      _nop_();       _nop_();      _nop_();       ack_bit = SDA; //表示AT24C02向SDA输送低电平表示已经接收到了第一个字节//若为高电平则异常SCL = 0;       //SCL位低电平SDA才允许数据变化即允许后续数据传输return  ack_bit;         //返回AT24C02的应答位
}
/***************************************************
向AT24C02中指定地址写入数据
add为存储指定地址,dat为存储待写入数据
***************************************************/
void WriteSet(unsigned char add, unsigned char dat)
// 在指定地址addr处写入数据WriteCurrent
{start();               //开始传递WriteCurrent(OP_WRITE); //选择要操作的芯片,并告知要对其写入数据WriteCurrent(add);       //写入指定地址WriteCurrent(dat);       //向上面指定地址写入数据stop();                //停止数据传递delaynms(4);
}
/***************************************************
从当前地址读取数据
***************************************************/
unsigned char ReadCurrent()
{unsigned char x;start();               WriteCurrent(OP_READ);  //选择要操作的芯片,并告知要对其写入数据x=ReadData();         stop();               return x;
}
/***************************************************
在指定地址读取数据
***************************************************/
unsigned char ReadSet(unsigned char set_add)
// 在指定地址读取
{start();                     WriteCurrent(OP_WRITE);       WriteCurrent(set_add);       return(ReadCurrent());        //从指定地址读出数据并返回
}void main(void){unsigned char sum;    unsigned char x;      //存储从AT24C02读出数值LcdInitiate();      sum=0;               while(1)            {if(S==0)        {delaynms(80);  if(S==0)        sum++;         if(sum==99)     sum=0;        }WriteSet(0x01,sum); x=ReadSet(0x01);   Display(x);      }
}

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

  1. java将多个文件写入到一个文件流中再有规律的取出_编写java程序,往一个txt文件里写入学生的基本信息,然后再读出这些信息并打印出来,最后把该文件拷贝到指...

    满意答案 azonyb 2014.02.18 采纳率:59%    等级:12 已帮助:13223人 import java.io.BufferedInputStream; import java.i ...

  2. php 真实访问次数,PHP将访问次数写入文件下

    用php实现简易的访问统计功能,计算网站的总访问量是多少,简单实用.php通过每次打开文本文件,获取文本中的数字,再进行加1后写入到文本中.因此,每次有访问就会进行累加访问数量来实现的简单访客次数的统 ...

  3. c语言 从文件读入数组,C++ 将一个文件读入数组再读出数组的方法

    如下所示: #include #include using namespace std; #define MAX_PACK_SIZE 10240 void main() { char filePath ...

  4. c语言按键亮灯再按不亮,按一次按键灯亮,再按一次灯灭

    /*此为自已写的, 功能:实现按一次按键灯亮,再按一次灯灭 欢迎仿问我的空间http://378621667.qzone.qq.com里头有好多单片机C语言代码 2011年10月24于厦门软件园二期 ...

  5. 怎样通过对员工电脑的按键次数来反映员工的工作效率?

    在日常工作中,企业员工有很长时间都需要花费在电脑上,并且无时无刻地敲击着键盘,点击着鼠标,因此员工键盘按键次数统计也可以在一定程度上反映了员工的工作状态和工作效率.所以不少企业管理者,想要知道在一天的 ...

  6. 突击蓝桥杯嵌入式(四)——滴答定时器、按键的三行代码消抖、LCD与ADC

    突击蓝桥杯嵌入式(四)--滴答定时器.按键的三行代码消抖.LCD与ADC 1.滴答定时器定时运行 我们利用滴答定时器,让LED每隔1s闪烁一次 //首先我们定义一个变量 __IO uint32_t u ...

  7. 让8只数码管初始显示零,每隔大约1s加一显示,到数码管显示9后,再从一开始显示

    让8只数码管初始显示零,每隔大约1s加一显示,到数码管显示9后,再从一开始显示 用延时函数实现加一显示 程序: #include <reg51.h> void delay(unsigned ...

  8. C语言:编写一个程序,建立一个abc.txt文本文件,向其中写入“this is a test”,然后显示该字符串

    /*编写一个程序,建立一个abc.txt文本文件,向其中写入"this is a test",然后显示该字符串*/ #include <stdio.h> #includ ...

  9. IReport 导出PDF中的 平方(m²) 与 立方(m³) 特殊字符再Adobe Acrobat DC显示不全问题

    问题: IReport 导出PDF 平方(m²)  与 立方(m³)  特殊字符再Adobe Acrobat DC显示不全,而再WPS.Office.浏览器.等工具打开正常. 相关截图: 在浏览器打开 ...

  10. C51_按键按下,流水灯亮起,数码管显示按下的次数

    代码 #include<reg51.h> unsigned char code table[]={//共阴数码管段码"0~f-."0x3f,0x06,0x5b,0x4f ...

最新文章

  1. 系统架构性能问题诊断及优化思路,纯干货!
  2. SAP MM 如何通过SAP User ID拿到User的基本信息?
  3. 小米电脑做开发java_JAVA学习系列之一-搭建开发环境
  4. linux 系统调用 hook 总结
  5. 接收蓝牙广播onReceive中getStringExtra()出现错误
  6. 利用.bat(批处理)来删除KEIL编译生成的无用文件
  7. redis(15)--复制
  8. Silverlight 里如何实现隐式样式,ImplicitStyleManager 的实现思想
  9. cmd查看所有数据库 db2_db2 cmd命令操作
  10. RequestUtils : Struts1.3.8 Code Review [2]
  11. Django图书管理系统
  12. 小确幸BBS论坛-2-首页
  13. 性能优化-测试If-Else和if哪个性能更好
  14. 家用计算机设置网络,手把手教您设置安装家庭无线网络
  15. 【老罗笔记】关于成就的那些事
  16. 投资公募基金有哪些费用
  17. 计算机高级筛选在哪找,excel表格数据高级筛选在哪里-EXCEL高级筛选
  18. 22_ue4进阶末日生存游戏开发[EQS]
  19. Debian - 搭建NextCloud私人云盘
  20. RxJava入门指南

热门文章

  1. 基于GitHub的敏捷学习方法之道与术
  2. 【Android ROM定制】CyanogenMod源码下载和编译
  3. android 闪屏图片,Android的闪屏图像尺寸,以适应所有设备Android的闪屏图像尺寸,以适应所有设备(Andro...
  4. 局域网即时通讯软件应该怎么选择
  5. SYZOJ - sxy的书包(背包)
  6. Python Numpy dtype=complex 及查看数据类型
  7. 信息安全等级测评内容
  8. Vue打包出现Browserslist: caniuse-lite is outdated
  9. javalang 生成抽象语法树AST ----python源码分析
  10. ERROR 2005 (HY000): Unknown MySQL server host 'locahost' (2)解决