想根据接收到的不同信息进行相应的动作,就写了以下中断
void UART_Routine() interrupt 4
{
if(RI==1) //如果接收标志位为1,接收到了数据
{
switch(SBUF) //根据接收到的数据执行相应操作
{
case 'a':
LCD_Init();
LCD_ShowString(1,1,"OPEN");
Delay(2000);
LCD_Init();
break;
case 'b':
LCD_Init();
LCD_ShowString(1,1,"SUCCESS");
Delay(2000);
LCD_Init();
break;
default:
LCD_Init();
LCD_ShowString(1,1,"error");
Delay(2000);
LCD_Init(); //如果接收到其他字符,则
break;
}
RI=0;
}
}
但是通过发送信息后都始终是进入到default,用if语句判定也不对,想请问一下SBUF的值该如何判断
由于所给的lcd例程无法显示SBUF的数据格式,就不知道该如何获取SBUF的值,请问该如何来判断SBUF,我看了传送的时候传的是ascii值,但是把a改为0x61依旧无法判定成功,所以该如何解决呢
1,不建议在中断里做太耗时的操作
2,建议先读出SBUF到一个变量,然后对这个变量做分支判断。
3,试试用串口跟踪工具确定你到底发送的是什么。有可能你发送的不止一个,有些串口调试工具会自动带上换行
如果您无法获取SBUF的具体值,就无法正确地判断SBUF的值。因此,您需要寻找一种方式来获取SBUF的数据。
下面是一种可能的方法:
使用proteus仿真工具,将单片机与LCD模块连接起来,然后运行仿真。
在LCD模块的实时显示区域中,可以看到单片机发送的所有数据。
在单片机程序中添加一个中断服务程序,在此中断程序中读取SBUF,并将其发送到LCD模块上。
在主程序中使用if语句来比较SBUF的值,并根据SBUF的值来执行相应的操作。
下面是一个示例代码:
#include <stdio.h>
#include <reg51.h>
// LCD模块端口定义
sbit RS=P3^0;
sbit RW=P3^1;
sbit EN=P3^2;
sbit BUSY=P3^3;
// 定义中断服务程序
void serial_ISR() interrupt 4 {
char c = SBUF; // 读取SBUF
// 将字符c发送到LCD模块上
fprintf(stdout, "%c", c);
}
void main() {
// 初始化串口
TMOD |= 0x20;
TH1 = 0xFD;
TR1 = 1;
// 初始化LCD模块
lcd_init();
while(1) {
// 判断SBUF的值并执行相应的操作
if(SBUF == 0x61) {
// SBUF的值为字符a,执行操作1
operation1();
}
else if(SBUF == 0x62) {
// SBUF的值为字符b,执行操作2
operation2();
}
else {
// SBUF的值为其他字符,执行默认操作
default_operation();
}
}
}
// 初始化LCD模块函数
void lcd_init() {
// 初始化部分略
}
// 操作1函数
void operation1() {
// 操作1的代码
}
// 操作2函数
void operation2() {
// 操作2的代码
}
// 默认操作函数
void default_operation() {
// 默认操作的代码
}
注:以上代码仅为示例,具体实现可能需要根据您的具体情况进行调整。如果您的程序仍然无法正确判断SBUF的值,请尝试使用其他方法来获取SBUF的数据。