基于at24c02的按键检测C51程序

  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 }

 

posted @ 2024-05-30 16:32  dianziyang2002  阅读(71)  评论(0)    收藏  举报