今天对昨天的程序进行了修改,基本正常显示了,偶尔还会乱码
2026-4-2 21:59 来自 xbq202 发布 @ 综合讨论
感谢昨天坛友的建议,我修改了一下程序,(增加的代码加红字体),红外遥控接收程序基本能正常显示了,偶尔还会乱码,不过很奇怪只能显示10以内的编码怎么回事?希望大神给帮忙修改一下。
#include "STC32G.h"
#include "string.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
// I2C LCD1602地址(通常为0x27或0x3F)
#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;
delay_us(5);
SCL_PIN = 0;
delay_us(5);
}
I2C_CheckAck();
}
// I2C接收一个字节
unsign
#include "STC32G.h"
#include "string.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
// I2C LCD1602地址(通常为0x27或0x3F)
#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;
delay_us(5);
SCL_PIN = 0;
delay_us(5);
}
I2C_CheckAck();
}
// I2C接收一个字节
unsign
- 最近查阅:
免责声明:
本平台旨在开源共享精神,请勿发布敏感信息,任何违法信息我们将移交公安机关;


