PC 端通过串口(STC-ISP 的串口助手)向开发板发送字符串(长度小于等于 16 个字符,字符串以’$’结尾,波特率 19200)并存储到 AT24c02 中(如果串口发 来新字符串,则覆盖原字符串),如果:K3 键按下,则把存储好的字符串显示到 LCD1602 上; K4 键按下,取消显示(显示清空)。
时间: 2023-12-06 11:02:58 浏览: 68
普中51-A2开发板资料.7z
下面是一个基本的实现思路:
1. 初始化串口和AT24c02,确保能够正常通信。
2. 设置K3和K4按键对应的中断函数,当对应按键被按下时触发中断。
3. 在串口接收中断函数中,判断接收到的字符是否以’$’结尾,如果是则将字符串存储到AT24c02中。
4. 在K3中断函数中,从AT24c02中读取存储的字符串并显示到LCD1602上。
5. 在K4中断函数中,清空LCD1602上显示的内容。
下面是一个简单的伪代码,仅供参考:
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define AT24C02_ADDR 0xA0
sbit K3 = P0^1; // 定义K3按键
sbit K4 = P0^0; // 定义K4按键
sbit RS = P2^0; // LCD1602接口
sbit RW = P2^1; // LCD1602接口
sbit EN = P2^2; // LCD1602接口
void LCD_Init(); // LCD1602初始化函数
void LCD_WriteCommand(uchar command); // LCD1602写命令函数
void LCD_WriteData(uchar dat); // LCD1602写数据函数
void UART_Init(); // 串口初始化函数
void UART_Interrupt() interrupt 4; // 串口中断函数
void AT24C02_Init(); // AT24C02初始化函数
void AT24C02_Write(uchar addr, uchar dat); // AT24C02写函数
uchar AT24C02_Read(uchar addr); // AT24C02读函数
void main()
{
uchar str[17] = ""; // 存储接收到的字符串
uchar i = 0; // 字符串下标
uchar c; // 接收到的字符
UART_Init(); // 初始化串口
AT24C02_Init(); // 初始化AT24C02
LCD_Init(); // 初始化LCD1602
K3 = 1; // K3按键上拉
K4 = 1; // K4按键上拉
EA = 1; // 打开总中断开关
while(1)
{
if (K4 == 0) // K4被按下
{
LCD_WriteCommand(0x01); // 清屏
i = 0; // 清空字符串下标
}
}
}
void UART_Init()
{
TMOD = 0x20; // 设置定时器1为8位定时器,工作模式2(自动重载)
TH1 = 0xfd; // 波特率为19200
TL1 = 0xfd;
TR1 = 1; // 启动定时器1
SM0 = 0; // 设置串口工作模式
SM1 = 1;
REN = 1; // 启动串口接收
ES = 1; // 打开串口中断
}
void UART_Interrupt() interrupt 4
{
if (RI == 1) // 接收中断
{
c = SBUF; // 读取接收到的字符
if (c == '$') // 字符串结束标志
{
str[i] = '\0'; // 字符串末尾加上'\0'
AT24C02_Write(0x00, i); // 存储字符串长度
for (i = 0; i < strlen(str); i++)
{
AT24C02_Write(i + 1, str[i]); // 存储字符串
}
i = 0; // 清空字符串下标
}
else if (i < 16) // 字符串长度小于等于16
{
str[i] = c; // 存储字符
i++; // 字符串下标++
}
RI = 0; // 清除接收中断标志位
}
}
void K3_Interrupt() interrupt 0
{
uchar len = AT24C02_Read(0x00); // 读取存储的字符串长度
uchar j;
if (len > 0)
{
for (j = 0; j < len; j++)
{
str[j] = AT24C02_Read(j + 1); // 读取存储的字符串
}
LCD_WriteCommand(0x01); // 清屏
for (j = 0; j < len; j++)
{
LCD_WriteData(str[j]); // 显示字符串
}
}
}
void AT24C02_Init()
{
// 初始化AT24C02
}
void AT24C02_Write(uchar addr, uchar dat)
{
// AT24C02写函数
}
uchar AT24C02_Read(uchar addr)
{
// AT24C02读函数
}
void LCD_Init()
{
// LCD1602初始化函数
}
void LCD_WriteCommand(uchar command)
{
// LCD1602写命令函数
}
void LCD_WriteData(uchar dat)
{
// LCD1602写数据函数
}
```
阅读全文