写了一个红外遥控接收程序,显示乱码,失败了,求帮助。
2026-4-1 21:44 来自 xbq202 发布 @ 综合讨论
打卡第三天,试着修改了实验箱的一个红外接收程序,用LCD1602来显示,I2C接口方式,首页显示正常,接收到红外信号,就会显示乱码,不能正常显示用户码和红外地址码。大神帮忙分析一下。
#include "STC32G.h"
#include "stdio.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
#define MAIN_Fosc 24000000UL
/****************************** 用户定义宏 ***********************************/
#define SysTick 10000 // 次/秒, 系统滴答频率, 在4000~16000之间
#define Timer0_Reload (65536UL - ((MAIN_Fosc + SysTick/2) / SysTick)) //Timer 0 中断频率
#define DIS_DOT 0x20
#define DIS_BLACK 0x10
#define DIS_ 0x11
#define LCD_ADDR 0x27
sbit P2_1 = P2^1;
sbit P2_0 = P2^0;
// I2C引脚定义
#define SDA_PIN P2_1
#define SCL_PIN P2_0
// LCD命令定义
#define LCD_CLEAR_DISPLAY 0x01
#define LCD_RETURN_HOME 0x02
#define LCD_ENTRY_MODE_SET 0x04
#define LCD_DISPLAY_CONTROL 0x08
#define LCD_CURSOR_SHIFT 0x10
#define LCD_FUNCTION_SET 0x20
#define LCD_SET_CGRAM_ADDR 0x40
#define LCD_SET_DDRAM_ADDR 0x80
bit B_1ms; //1ms标志
u8 cnt_1ms; //1ms基本计时
/************* 红外接收程序变量声明 **************/
sbit P_IR_RX = P3^5; //定义红外接收输入IO口
u8 IR_SampleCnt; //采样计数
u8 IR_BitCnt; //编码位数
u8 IR_UserH; //用户码(地址)高字节
u8 IR_UserL; //用户码(地址)低字节
u8 IR_data; //数据原码
u8 IR_DataShit; //数据移位
bit P_IR_RX_temp; //Last sample
bit B_IR_Sync; //已收到同步标志
bit B_IR_Press; //红外接收标志
u8 IR_code; //红外键码
u16 UserCode; //用户码
/************* 本地函数声明 **************/
// 延时函数
void delay_us(unsigned int us) {
while(us--) {
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void delay_ms(unsigned int ms) {
unsigned int i, j;
for(i = 0; i < ms; i++) {
for(j = 0; j < 1000; j++) {
_nop_();
}
}
}
// I2C起始信号
void I2C_Start() {
SDA_PIN = 1;
SCL_PIN = 1;
delay_us(5);
SDA_PIN = 0;
delay_us(5);
SCL_PIN = 0;
}
// I2C停止信号
void I2C_Stop() {
SDA_PIN = 0;
SCL_PIN = 1;
delay_us(5);
SDA_PIN = 1;
delay_us(5);
}
// I2C发送应答信号
void I2C_Ack() {
SDA_PIN = 0;
SCL_PIN = 1;
delay_us(5);
SCL_PIN = 0;
SDA_PIN = 1;
}
// I2C发送非应答信号
void I2C_NAck() {
SDA_PIN = 1;
SCL_PIN = 1;
delay_us(5);
SCL_PIN = 0;
SDA_PIN = 1;
}
// I2C检测应答信号
bit I2C_CheckAck() {
bit ack;
SDA_PIN = 1;
SCL_PIN = 1;
delay_us(5);
ack = SDA_PIN;
SCL_PIN = 0;
delay_us(5);
return ack;
}
// I2C发送一个字节
void I2C_SendByte(unsigned char dat) {
unsigned char i;
for(i = 0; i < 8; i++) {
SDA_PIN = (dat & 0x80) ? 1 : 0;
dat <<= 1;
SCL_PIN = 1;
d
#include "STC32G.h"
#include "stdio.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
#define MAIN_Fosc 24000000UL
/****************************** 用户定义宏 ***********************************/
#define SysTick 10000 // 次/秒, 系统滴答频率, 在4000~16000之间
#define Timer0_Reload (65536UL - ((MAIN_Fosc + SysTick/2) / SysTick)) //Timer 0 中断频率
#define DIS_DOT 0x20
#define DIS_BLACK 0x10
#define DIS_ 0x11
#define LCD_ADDR 0x27
sbit P2_1 = P2^1;
sbit P2_0 = P2^0;
// I2C引脚定义
#define SDA_PIN P2_1
#define SCL_PIN P2_0
// LCD命令定义
#define LCD_CLEAR_DISPLAY 0x01
#define LCD_RETURN_HOME 0x02
#define LCD_ENTRY_MODE_SET 0x04
#define LCD_DISPLAY_CONTROL 0x08
#define LCD_CURSOR_SHIFT 0x10
#define LCD_FUNCTION_SET 0x20
#define LCD_SET_CGRAM_ADDR 0x40
#define LCD_SET_DDRAM_ADDR 0x80
bit B_1ms; //1ms标志
u8 cnt_1ms; //1ms基本计时
/************* 红外接收程序变量声明 **************/
sbit P_IR_RX = P3^5; //定义红外接收输入IO口
u8 IR_SampleCnt; //采样计数
u8 IR_BitCnt; //编码位数
u8 IR_UserH; //用户码(地址)高字节
u8 IR_UserL; //用户码(地址)低字节
u8 IR_data; //数据原码
u8 IR_DataShit; //数据移位
bit P_IR_RX_temp; //Last sample
bit B_IR_Sync; //已收到同步标志
bit B_IR_Press; //红外接收标志
u8 IR_code; //红外键码
u16 UserCode; //用户码
/************* 本地函数声明 **************/
// 延时函数
void delay_us(unsigned int us) {
while(us--) {
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void delay_ms(unsigned int ms) {
unsigned int i, j;
for(i = 0; i < ms; i++) {
for(j = 0; j < 1000; j++) {
_nop_();
}
}
}
// I2C起始信号
void I2C_Start() {
SDA_PIN = 1;
SCL_PIN = 1;
delay_us(5);
SDA_PIN = 0;
delay_us(5);
SCL_PIN = 0;
}
// I2C停止信号
void I2C_Stop() {
SDA_PIN = 0;
SCL_PIN = 1;
delay_us(5);
SDA_PIN = 1;
delay_us(5);
}
// I2C发送应答信号
void I2C_Ack() {
SDA_PIN = 0;
SCL_PIN = 1;
delay_us(5);
SCL_PIN = 0;
SDA_PIN = 1;
}
// I2C发送非应答信号
void I2C_NAck() {
SDA_PIN = 1;
SCL_PIN = 1;
delay_us(5);
SCL_PIN = 0;
SDA_PIN = 1;
}
// I2C检测应答信号
bit I2C_CheckAck() {
bit ack;
SDA_PIN = 1;
SCL_PIN = 1;
delay_us(5);
ack = SDA_PIN;
SCL_PIN = 0;
delay_us(5);
return ack;
}
// I2C发送一个字节
void I2C_SendByte(unsigned char dat) {
unsigned char i;
for(i = 0; i < 8; i++) {
SDA_PIN = (dat & 0x80) ? 1 : 0;
dat <<= 1;
SCL_PIN = 1;
d
- 最近查阅:
免责声明:
本平台旨在开源共享精神,请勿发布敏感信息,任何违法信息我们将移交公安机关;


