如何用MFRC522 RFID模块做一个简易的充值和消费系统:按键盘上的字母键“R”,进入充值功能,可输入充值金额,充值功能后显示卡上余额;按键盘上的字母键“C”,进入消费功能,可输入消费金额,扣除消费金额后显示卡上余额。可以简要回答
时间: 2023-12-07 13:03:28 浏览: 187
使用MFRC522 RFID模块做一个简易的充值和消费系统,可以按照以下步骤进行:
1. 初始化MFRC522 RFID模块和LCD1602屏幕,设置好读卡参数和显示参数。
2. 实现一个循环结构,不断读取RFID卡片,判断卡片类型并获取卡片信息,例如卡号、余额等。
3. 当按下键盘上的字母键“R”时,进入充值功能,提示用户输入充值金额,并将余额加上充值金额后更新到卡片中,并显示卡上余额。
4. 当按下键盘上的字母键“C”时,进入消费功能,提示用户输入消费金额,并将余额减去消费金额后更新到卡片中,并显示卡上余额。
以下是一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include <drv_gpio.h>
#include <drv_spi.h>
#include <drv_lcd1602.h>
#include <drv_mfrc522.h>
#define SPI_BUS_NAME "spi1" // SPI总线名称
#define RC522_DEV_NAME "rc522" // MFRC522 RFID模块设备名称
#define LCD_DEV_NAME "lcd" // LCD1602屏幕设备名称
#define LCD_ROW 2 // LCD1602屏幕行数
#define LCD_COLUMN 16 // LCD1602屏幕列数
#define MAX_BALANCE 10000 // 最大余额
#define RC522_KEY_R 0x52 // “R”键的键值
#define RC522_KEY_C 0x43 // “C”键的键值
static rt_device_t rc522_dev; // MFRC522 RFID模块设备对象
static rt_device_t lcd_dev; // LCD1602屏幕设备对象
static char lcd_buffer[LCD_ROW][LCD_COLUMN + 1]; // LCD1602屏幕缓冲区
static rt_uint8_t card_uid[MFRC522_MAX_UID_LENGTH]; // 卡片UID
static rt_uint8_t card_uid_len; // 卡片UID长度
static rt_uint32_t card_balance = 0; // 卡片余额
static void rc522_thread_entry(void *parameter)
{
rt_uint8_t key_value;
rt_uint8_t sector_key[MFRC522_KEY_LENGTH] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
rt_uint8_t block_data[MFRC522_BLOCK_LENGTH];
rt_uint8_t trailer_data[MFRC522_BLOCK_LENGTH];
rt_uint8_t trailer_addr;
rt_uint8_t block_addr;
rt_err_t ret;
while (1)
{
// 等待卡片进入感应区
if (rt_device_control(rc522_dev, MFRC522_CMD_REQA, RT_NULL) == RT_EOK)
{
// 获取卡片UID
card_uid_len = sizeof(card_uid);
if (rt_device_control(rc522_dev, MFRC522_CMD_ANTICOLL, card_uid) == RT_EOK)
{
// 选择卡片
ret = rt_device_control(rc522_dev, MFRC522_CMD_SELECT, card_uid);
if (ret == RT_EOK)
{
// 验证卡片密码
rt_memcpy(trailer_data, sector_key, sizeof(sector_key));
trailer_addr = 3 * 4 + 3;
ret = rt_device_control(rc522_dev, MFRC522_CMD_AUTH, &trailer_addr, trailer_data);
if (ret == RT_EOK)
{
// 读取卡片余额
block_addr = 3 * 4 + 1;
ret = rt_device_read(rc522_dev, block_addr, block_data, sizeof(block_data));
if (ret == sizeof(block_data))
{
card_balance = (block_data[0] << 24) | (block_data[1] << 16) | (block_data[2] << 8) | block_data[3];
}
}
}
}
}
// 检测按键
key_value = rt_device_read(rc522_dev, MFRC522_REG_FIFO_DATA, RT_NULL, 0);
if (key_value == RC522_KEY_R)
{
// 进入充值功能
rt_kprintf("Enter recharge function.\n");
// 提示用户输入充值金额
rt_device_control(lcd_dev, LCD1602_CMD_CLEAR_SCREEN, RT_NULL);
snprintf(lcd_buffer[0], LCD_COLUMN + 1, "Recharge: ");
rt_device_write(lcd_dev, 0, lcd_buffer[0], strlen(lcd_buffer[0]));
snprintf(lcd_buffer[1], LCD_COLUMN + 1, "Balance: %4d ", card_balance);
rt_device_write(lcd_dev, 0, lcd_buffer[1], strlen(lcd_buffer[1]));
rt_device_control(lcd_dev, LCD1602_CMD_SET_CURSOR, (void *)0x40);
// 等待用户输入充值金额
rt_uint32_t recharge_amount = 0;
while (1)
{
key_value = rt_device_read(rc522_dev, MFRC522_REG_FIFO_DATA, RT_NULL, 0);
if (key_value >= '0' && key_value <= '9')
{
rt_kprintf("Input recharge amount: %c\n", key_value);
recharge_amount = recharge_amount * 10 + (key_value - '0');
snprintf(lcd_buffer[0], LCD_COLUMN + 1, "Recharge: %4d ", recharge_amount);
rt_device_write(lcd_dev, 0, lcd_buffer[0], strlen(lcd_buffer[0]));
rt_device_control(lcd_dev, LCD1602_CMD_SET_CURSOR, (void *)0x40);
}
else if (key_value == RC522_KEY_C)
{
break;
}
}
// 更新卡片余额
if (recharge_amount > 0)
{
card_balance += recharge_amount;
if (card_balance > MAX_BALANCE)
{
card_balance = MAX_BALANCE;
}
// 写入卡片余额
block_addr = 3 * 4 + 1;
block_data[0] = (card_balance >> 24) & 0xFF;
block_data[1] = (card_balance >> 16) & 0xFF;
block_data[2] = (card_balance >> 8) & 0xFF;
block_data[3] = card_balance & 0xFF;
ret = rt_device_write(rc522_dev, block_addr, block_data, sizeof(block_data));
if (ret == sizeof(block_data))
{
rt_kprintf("Recharge success, balance: %d.\n", card_balance);
}
else
{
rt_kprintf("Failed to write balance.\n");
}
}
// 显示卡片余额
rt_device_control(lcd_dev, LCD1602_CMD_CLEAR_SCREEN, RT_NULL);
snprintf(lcd_buffer[0], LCD_COLUMN + 1, "Recharge: %4d ", recharge_amount);
rt_device_write(lcd_dev, 0, lcd_buffer[0], strlen(lcd_buffer[0]));
snprintf(lcd_buffer[1], LCD_COLUMN + 1, "Balance: %4d ", card_balance);
rt_device_write(lcd_dev, 0, lcd_buffer[1], strlen(lcd_buffer[1]));
}
else if (key_value == RC522_KEY_C)
{
// 进入消费功能
rt_kprintf("Enter consumption function.\n");
// 提示用户输入消费金额
rt_device_control(lcd_dev, LCD1602_CMD_CLEAR_SCREEN, RT_NULL);
snprintf(lcd_buffer[0], LCD_COLUMN + 1, "Consumption: ");
rt_device_write(lcd_dev, 0, lcd_buffer[0], strlen(lcd_buffer[0]));
snprintf(lcd_buffer[1], LCD_COLUMN + 1, "Balance: %4d ", card_balance);
rt_device_write(lcd_dev, 0, lcd_buffer[1], strlen(lcd_buffer[1]));
rt_device_control(lcd_dev, LCD1602_CMD_SET_CURSOR, (void *)0x40);
// 等待用户输入消费金额
rt_uint32_t consumption_amount = 0;
while (1)
{
key_value = rt_device_read(rc522_dev, MFRC522_REG_FIFO_DATA, RT_NULL, 0);
if (key_value >= '0' && key_value <= '9')
{
rt_kprintf("Input consumption amount: %c\n", key_value);
consumption_amount = consumption_amount * 10 + (key_value - '0');
snprintf(lcd_buffer[0], LCD_COLUMN + 1, "Consumption: %4d ", consumption_amount);
rt_device_write(lcd_dev, 0, lcd_buffer[0], strlen(lcd_buffer[0]));
rt_device_control(lcd_dev, LCD1602_CMD_SET_CURSOR, (void *)0x40);
}
else if (key_value == RC522_KEY_C)
{
break;
}
}
// 更新卡片余额
if (consumption_amount > 0 && consumption_amount <= card_balance)
{
card_balance -= consumption_amount;
// 写入
阅读全文
相关推荐
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231044736.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![h](https://img-home.csdnimg.cn/images/20250102104920.png)