首页 > 编程语言 >基于at24c02的按键检测C51程序

基于at24c02的按键检测C51程序

时间:2024-05-30 16:46:16浏览次数:27  
标签:SCL C51 void unsigned SDA 按键 sbit nop at24c02

  1 #include <reg51.h>
  2 #include <intrins.h>
  3 #include<lcd1602.h>
  4 #define uchar unsigned char
  5 #define uint unsigned int
  6 #define ulong unsigned long
  7 
  8 #define EEPROM_ADDR 0xA0   
  9 sbit SDA =P2^0;          
 10 sbit SCL =P2^1;         
 11 sbit K1 =P3^1;          
 12 sbit K2 =P3^0;
 13 sbit K3 =P3^2;
 14 sbit K4 =P3^3;
 15 
 16 
 17 
 18 void delay(unsigned int time)
 19 {
 20     unsigned int i, j;
 21     for (i = 0; i < time; i++)
 22         for (j = 0; j < 125; j++)
 23             ;
 24 }
 25 
 26 void i2c_start(void)
 27 {
 28     SDA = 1;
 29     SCL = 1;
 30     _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
 31     SDA = 0;
 32     _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
 33     SCL = 0;
 34 }
 35 
 36 void i2c_stop(void)
 37 {
 38     SDA = 0;
 39     SCL = 1;
 40     _nop_();_nop_(); _nop_(); _nop_(); _nop_(); 
 41     SDA = 1;
 42     _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
 43         SDA=0;
 44 }
 45 void i2c_ack(void)
 46 {
 47         uchar i;
 48     SDA = 0;
 49     SCL = 1;
 50     _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
 51         while((SDA==1)&&(i<255))i++;
 52     SCL = 0;
 53      _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
 54 }
 55 
 56 void i2c_noack(void)
 57 {
 58     SDA = 1;
 59     SCL = 1;
 60     _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
 61     SCL = 0;
 62         SDA = 0;
 63 }
 64 void i2c_write(uchar dat)
 65 {
 66     uchar i,temp;
 67         temp=dat;
 68     for (i = 0; i < 8; i++)
 69     {
 70     temp=temp<<1;
 71         SCL=0;
 72         _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
 73         SDA=CY;
 74         _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
 75         SCL=1;
 76          _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
 77     }
 78     SCL=0;
 79         _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
 80     SDA = 1;
 81     _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
 82 }
 83 
 84 
 85 uchar I2c_Read_Byte()
 86 {
 87     uchar i, temp ;
 88   SCL=0;
 89     _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
 90     SDA=1;
 91     for(i = 0; i < 8; i++)
 92     {
 93         SCL = 1;
 94         _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
 95         temp =(temp<< 1)|SDA;   
 96         SCL = 0;
 97         _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
 98     }
 99     _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
100     return temp;
101 }
102 void eeprom_write(uchar addr, uchar dat)
103 {
104     i2c_start();              
105     i2c_write(EEPROM_ADDR);  
106         i2c_ack();    
107     i2c_write(addr);
108         i2c_ack();    
109     i2c_write(dat);
110         i2c_ack();
111     i2c_stop();             
112 }
113 uchar eeprom_read(uchar addr)
114 {
115     uchar dat;
116     i2c_start();             
117     i2c_write(EEPROM_ADDR);
118         i2c_ack();
119     i2c_write(addr);
120         i2c_ack();
121     i2c_start();              
122     i2c_write(EEPROM_ADDR+1);
123         i2c_ack();
124     dat = I2c_Read_Byte();
125         i2c_noack();
126     i2c_stop();                
127 
128     return dat;
129 }
130 
131 void main()
132 {
133     uchar read;
134         unsigned char key_state = 0;
135         uchar i,num;
136         lcd_ini();
137 
138     while (1)
139     {
140         w_com(0xc7);
141         w_dat((num/100%10)+0x30);    
142         w_dat(num/10%10+0x30);
143         w_dat(num%10+0x30);
144     
145     
146              if (K1 == 0)
147         {
148             if (key_state == 0)
149             {
150                 key_state = 1;
151                 eeprom_write(0, num);
152             }
153         }
154         else
155         {
156             key_state = 0;
157         }
158         delay(100); 
159                  if (K2 == 0)
160         {
161             if (key_state == 0)
162             {
163                 key_state = 1;
164                 num = eeprom_read(0);
165                     
166             }
167         }
168         else
169         {
170             key_state = 0;
171         }
172         delay(100);  
173         if (K3 == 0)
174         {
175             if (key_state == 0)
176             {
177                 key_state = 1;
178                 num++;
179                 eeprom_write(0, num);
180             }
181         }
182         else
183         {
184             key_state = 0;
185         }
186         delay(100); 
187                 if (K4 == 0)
188         {
189             if (key_state == 0)
190             {
191                 key_state = 1;
192                 num=0;
193               
194             }
195         }
196         else
197         {
198             key_state = 0;
199         }
200 
201         delay(10);  
202                 
203     }
204 }

 

标签:SCL,C51,void,unsigned,SDA,按键,sbit,nop,at24c02
From: https://www.cnblogs.com/yang2002/p/18222656

相关文章

  • 蓝牙|软件 QCC51xx系列开发之LE AUDIO Auracast使用指导
    本文适用范围:   ADK23.3~file=app1##############USERKEYS###############Thesekeysareusedtoconfigurethesoftwareortosavesettings.#Seethecorrespondingadk\src\domains\common\ps_key_map.h#USR1-Thiskeyisreserved.Itisusedto......
  • 通过 adc 实现一个IO对多个按键读取
    如何实现一个IO对多个按键读取(1)当我们需要实现一个IO对多个按键读取的时候,可以采用如下电路,使用IO口的ADC功能,读取电压值,即可知道哪个按键被按下。(2)旁边加上一个10nf的电容,用于按键消抖......
  • 高抗干扰触摸芯片VK36N系列1/2/3/4/5/6/7/8/9/10按键/通道适用于家电/玩具【FAE技术支
     概述.VK36N1D具有1个触摸按键,可用来检测外部触摸按键上人手的触摸动作。该芯片具有较高的集成度,仅需极少的外部组件便可实现触摸按键的检测。提供了1个1对1输出脚,可通过IO脚选择上电输出电平,有直接输出和锁存输出2个型号可选。芯片内部采用特殊的集成电路,具有高电源电压......
  • 基于FPGA的电子琴设计(按键和蜂鸣器)----第一版
    欢迎各位朋友关注“郝旭帅电子设计团队”,本篇为各位朋友介绍基于FPGA的电子琴设计(按键和蜂鸣器)----第一版。功能说明:  外部输入七个按键,分别对应音符的“1、2、3、4、5、6、7”,唱作do、re、mi、fa、sol、la、si。当某个按键按下时,蜂鸣器发出对应的声音----1.默认发出0.2秒(可以调整)。......
  • FlexibleButton - 一个小巧灵活的C语言按键处理库+SerialChart - 能将串口数据实时绘
    1、FlexibleButton-一个小巧灵活的C语言按键处理库FlexibleButton是一个基于标准C语言的小巧灵活的按键处理库,支持单击、连击、短按、长按、自动消抖,可以自由设置组合按键,可用于中断和低功耗场景。项目主页:https://github.com/murphyzhao/FlexibleButton该按键库解耦了......
  • 基于pinctrl和GPIO子系统的按键驱动程序
    嵌入式驱动开发中pinctrl和GPIO子系统使用频率非常高,其中pinctrl子系统主要用于复用和配置引脚,GPIO子系统用于设置GPIO的输入/输出,向引脚写入数据或者从引脚读取数据。一个引脚可以复用为多种不同的功能,因此要使用GPIO子系统首先要先把引脚配置为GPIO功能。下面将分为两部分记录如......
  • 基于总线设备驱动模型的按键读取驱动程序
    本次实验基于总线设备驱动模型实现按键驱动程序的编写,给上层应用程序提供检测按键是否按下的操作接口,上层应用根据按键是否按下控制led的亮灭。所以上层应用程序会同时使用led和按键的驱动接口,但是对于下层驱动而言,这二者是分离的,因此只需要专注于编写按键驱动程序就可以了。在正......
  • 一种车载蓝牙显示终端(QCC3040 QCC5125 OLED RX 显示蓝牙歌曲名)
    作为车载多媒体一种延伸,车载蓝牙终端通常作为手机与车机中转站,可以作为点烟器扩展产品。 通过播放暂停音乐、接打挂断电话、媒体音量加减、上下一曲功能来进行人机交互。 产品通常还有3.5mm输入接口。  通过车载IDB-CIDB-MIDB-Wireless等多媒体协议解析出车载媒体控......
  • 如何把keil C51 和 keil MDK(ARM)安装在一起
    KeilC51与KeilMDK区别1:KeilC51,专门用于经典和扩展的8051mcu的开发工具,编译器是ANSICcompiler,包括C51Compiler,A51Assembler,LX51Linker2:KeilMDKMDK:MicrocontrollerDevelopmentKitKeilMDK-ARM专门用于开发基于ARM和Cortex-M的MCU,编译器是ARMCompiler,包括ARM......
  • 51单片机程序框架之矩阵按键
    /******************************************************************************此程序是依据吴坚鸿程序框架,在普中51A2单片机开发板上的程序练习程序目标:4*4矩阵按键*******************************************************************************/#include<REG51.H......