找回密码
 立即注册
×

00:00:00

您有一张0.1元限时体验卡,马上领取获得VIP尊享特权。

写了一个红外遥控接收程序,显示乱码,失败了,求帮助。

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
  • 最近查阅:

免责声明:

本平台旨在开源共享精神,请勿发布敏感信息,任何违法信息我们将移交公安机关;

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-5-1 07:46 , Processed in 0.073857 second(s), 29 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

返回顶部