|
发表于 2019-6-12 01:36:00
|
显示全部楼层
哥们,你这样做太麻烦了,建议你把位运算封装为宏函数,前期准备阶段可能比较麻烦,但是之后能极大的提高你的编程效率,而且非常方便阅读,
以下代码是仿照STM32库函数写的。
我给你个示范:
定义一下三个宏进行位运算操作
#define SET_BIT(REG, BIT) ((REG) |= (BIT))
#define CLEAR_BIT(REG, BIT) ((REG) &= ~(BIT))
#define READ_BIT(REG, BIT) ((REG) & (BIT))
//51单片机的总中断控制位EA在IE寄存器的第七位,定义以下宏
#define EA_BIT (1 << 7) //IE.7
//之后定义这两个宏进行开关总中断的操作
#define EA_ENABLE() SET_BIT(IE, EA_BIT)
#define EA_DISABLE() CLEAR_BIT(IE, EA_BIT)
之后你在需要开启总中断的地方就可以像使用函数一样直接使用EA_ENABLE();
当然,因为EA可以位寻址,所以开关总中断的操作与直接给EA赋值相同,这只是举个例子,同理你还可以写出以下代码:
以STC15系列单片机的串口1为例
// ==== 串口1 SCON寄存器的所有位定义 ====
#define RI_BIT (1 << 0) //SCON.0
#define TI_BIT (1 << 1) //SCON.1
#define RB8_BIT (1 << 2) //SCON.2
#define TB8_BIT (1 << 3) //SCON.3
#define REN_BIT (1 << 4) //SCON.4
#define SM2_BIT (1 << 5) //SCON.5
#define SM1_BIT (1 << 6) //SCON.6
#define SM0_FE_BIT (1 << 7) //SCON.7
//特殊寄存器定义
#define S1ST2_BIT (1 << 0) //AUXR.0
#define ES_BIT (1 << 4) //IE.4
#define PS_BIT (1 << 4) //IP.4
//串口1相关功能
#define UART1_USE_TIMER1() CLEAR_BIT(AUXR, S1ST2_BIT)
#define UART1_USE_TIMER2() SET_BIT(AUXR, S1ST2_BIT)
#define UART1_RX_ENABLE() SET_BIT(SCON, REN_BIT)
#define UART1_RX_DISABLE() CLEAR_BIT(SCON, REN_BIT)
#define UART1_INT_PRIORITY_HIGH() SET_BIT(IP, PS_BIT)
#define UART1_INT_PRIORITY_LOW() CLEAR_BIT(IP, PS_BIT)
#define UART1_INT_ENABLE() SET_BIT(IE, ES_BIT)
#define UART1_INT_DISABLE() CLEAR_BIT(IE, ES_BIT)
串口1的初始化代码你可以这样写,这个代码比你直接操作寄存器直观很多
uart1_init()
{
//这里还有其他的设置波特率之类的代码,略去不写,我只是简单举例,你可以在此基础上完善
UART1_RX_ENABLE();
UART1_INT_ENABLE();
UART1_INT_PRIORITY_HIGH();
EA_ENABLE();
} |
|