找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 722|回复: 4
打印 上一主题 下一主题
收起左侧

求指导 利用4个按键设置两个4位数到24C01的程序

[复制链接]
跳转到指定楼层
楼主
ID:123917 发表于 2024-10-27 14:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求一个51单片机利用4个按键设置两个4位数到24C01的程序,设置1:0-9999,设置2:0-9999
设置1和2都存于24C01,然后单片机读取这两个设置值到单片机内。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1109793 发表于 2024-10-27 16:35 | 只看该作者
三个键就够了吧,四个能方便点?
回复

使用道具 举报

板凳
ID:161164 发表于 2024-10-27 18:41 | 只看该作者
下面是一个简单的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 接口引脚和按键连接。
- 此代码为基础示例,实际使用时可能需要根据具体硬件进行调整。
回复

使用道具 举报

地板
ID:1109793 发表于 2024-10-27 19:06 | 只看该作者
我觉得这样更好用,按一下K1,设置1,K2移位,K3+K4-,再按K1设置2,再按K1保存。
从0+到9999时间还是挺长的。要是999还行。
回复

使用道具 举报

5#
ID:123917 发表于 2024-10-28 00:21 | 只看该作者
lkc8210 发表于 2024-10-27 18:41
下面是一个简单的51单片机程序示例,演示如何使用4个按键设置两个4位数并将其存储到24C01 EEPROM中。程序包 ...

非常感谢,得空我试试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表