下面是一个简单的51单片机程序示例,演示如何使用4个按键设置两个4位数并将其存储到24C01 EEPROM中。程序包括按键扫描、数值设置、存储到EEPROM和读取的功能。
### 硬件连接
1. **按键**:假设使用4个按键(K1, K2, K3, K4)分别用于增加、减少、选择设置1或设置2。
2. **24C01**:通过I2C接口连接到51单片机。
### 程序示例
```c
#include <reg51.h>
#include <intrins.h>
#define SCL P1_0 // I2C SCL
#define SDA P1_1 // I2C SDA
unsigned int setting1 = 0; // 设置1
unsigned int setting2 = 0; // 设置2
bit selectSetting = 0; // 选择设置,0:设置1, 1:设置2
// I2C延时函数
void I2C_Delay(void) {
unsigned char i;
for (i = 0; i < 100; i++);
}
// I2C启动
void I2C_Start(void) {
SDA = 1;
SCL = 1;
I2C_Delay();
SDA = 0;
I2C_Delay();
SCL = 0;
}
// I2C停止
void I2C_Stop(void) {
SCL = 0;
SDA = 0;
I2C_Delay();
SCL = 1;
I2C_Delay();
SDA = 1;
}
// I2C发送字节
void I2C_Send_Byte(unsigned char byte) {
unsigned char i;
for (i = 0; i < 8; i++) {
SDA = (byte & 0x80) ? 1 : 0; // 发送高位
I2C_Delay();
SCL = 1; // 时钟上升
I2C_Delay();
SCL = 0; // 时钟下降
byte <<= 1; // 左移
}
// 发送ACK
SDA = 1; // 释放SDA
I2C_Delay();
SCL = 1; // 时钟上升
I2C_Delay();
SCL = 0; // 时钟下降
}
// 写入24C01
void EEPROM_Write(unsigned char addr, unsigned char data) {
I2C_Start();
I2C_Send_Byte(0xA0); // 设备地址
I2C_Send_Byte(addr); // 地址
I2C_Send_Byte(data); // 数据
I2C_Stop();
}
// 读取24C01
unsigned char EEPROM_Read(unsigned char addr) {
unsigned char data;
I2C_Start();
I2C_Send_Byte(0xA0); // 设备地址
I2C_Send_Byte(addr); // 地址
I2C_Start(); // 重启
I2C_Send_Byte(0xA1); // 读命令
// 读取数据
SDA = 1; // 设置SDA为高
I2C_Delay();
SCL = 1; // 时钟上升
I2C_Delay();
data = SDA; // 读取数据
SCL = 0; // 时钟下降
I2C_Stop();
return data;
}
// 按键扫描
unsigned char Key_Scan(void) {
if (P3_0 == 0) return 1; // K1
if (P3_1 == 0) return 2; // K2
if (P3_2 == 0) return 3; // K3
if (P3_3 == 0) return 4; // K4
return 0; // 无按键按下
}
// 主程序
void main(void) {
unsigned char key;
while (1) {
key = Key_Scan();
if (key == 1) { // K1: 增加当前设置
if (selectSetting == 0) {
if (setting1 < 9999) setting1++;
} else {
if (setting2 < 9999) setting2++;
}
}
if (key == 2) { // K2: 减少当前设置
if (selectSetting == 0) {
if (setting1 > 0) setting1--;
} else {
if (setting2 > 0) setting2--;
}
}
if (key == 3) { // K3: 切换设置
selectSetting = !selectSetting; // 切换设置
}
if (key == 4) { // K4: 存储设置到EEPROM
EEPROM_Write(0x00, setting1 >> 8); // 存储高位
EEPROM_Write(0x01, setting1 & 0xFF); // 存储低位
EEPROM_Write(0x02, setting2 >> 8); // 存储高位
EEPROM_Write(0x03, setting2 & 0xFF); // 存储低位
}
// 读取设置值
setting1 = (EEPROM_Read(0x00) << 8) | EEPROM_Read(0x01);
setting2 = (EEPROM_Read(0x02) << 8) | EEPROM_Read(0x03);
}
}
```
### 代码说明
1. **I2C 接口**:定义了 I2C 通信的相关函数,包括启动、停止、发送字节、写入和读取 EEPROM。
2. **按键扫描**:通过 `Key_Scan` 函数检测按键状态。
3. **设置数值**:根据按键的不同,增加、减少或切换当前设置,设置值范围为 0 到 9999。
4. **存储到 EEPROM**:按下 K4 按键时,将当前设置保存到 24C01 中。
5. **读取 EEPROM**:读取存储的设置值,并更新到 `setting1` 和 `setting2` 变量中。
### 使用说明
- 确保连接了适当的按键和 EEPROM。
- 根据需要调整 I2C 接口引脚和按键连接。
- 此代码为基础示例,实际使用时可能需要根据具体硬件进行调整。 |