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