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 }