标题: 我想把一个寄存器的一个位,引出了,但是出错了 [打印本页]

作者: 祥ZD    时间: 2022-8-9 19:11
标题: 我想把一个寄存器的一个位,引出了,但是出错了
这个RI是头文件定义的,S3RI是我自己加的

51hei图片20220809191025.png (89.74 KB, 下载次数: 211)

51hei图片20220809191025.png

作者: 188610329    时间: 2022-8-9 19:28
不是所有的 寄存器 都能未寻址的,S3CON 恰好属于不能位寻址的寄存器。
你需要补一下基础知识啊。
作者: lkc8210    时间: 2022-8-9 19:49
哪里有S3RI?
作者: 风之痕于梦想    时间: 2022-8-9 20:10
这个地址无效
作者: wulin    时间: 2022-8-9 20:13
本帖最后由 wulin 于 2022-8-9 21:00 编辑

注意:寄存器地址能够被8整除的才可以进行位操作,不能够被8整除的不可以进行位操作

作者: Hephaestus    时间: 2022-8-9 21:18
错误出在229、230行,你把216~226行贴出来是什么意思?
作者: Y_G_G    时间: 2022-8-9 21:24
lkc8210 发表于 2022-8-9 19:49
哪里有S3RI?

截图就截了错误页面
作者: Y_G_G    时间: 2022-8-9 21:31
8051的寄存器只有1/8能位寻址
寄存器地址的低位为0和8的可以位寻址
除此之外,都不能位操作
作者: wufa1986    时间: 2022-8-10 08:33
在标准C中,位操作是通过或与等逻辑运算进行的,要习惯这种写法,因为大部分单片机都不支持位操作
作者: npn    时间: 2022-8-10 13:04
wulin 发表于 2022-8-9 20:13
注意:寄存器地址能够被8整除的才可以进行位操作,不能够被8整除的不可以进行位操作

STC32 除xfr寄存器外,其余sfr寄存器0x80~0xFF都可以位寻址操作。
  1. #include "STC32G.H"
  2. sbit a = P3M0 ^ 0;
  3. sbit b = P3M1 ^ 0;
  4. sbit c= DPL ^ 0;
  5. sbit d = DPH ^ 4;
  6. sbit e = SBUF ^ 3;
  7. sbit f = SP ^ 5;
  8. sbit g = AUXR2 ^ 6;
  9. sbit h = IAP_CONTR ^ 4;

  10. void main() {
  11.         while (1);
  12. }
复制代码

作者: 188610329    时间: 2022-8-10 14:27
npn 发表于 2022-8-10 13:04
STC32 除xfr寄存器外,其余sfr寄存器0x80~0xFF都可以位寻址操作。

楼主贴图显示,他用的stc8
作者: Y_G_G    时间: 2022-8-10 14:56
npn 发表于 2022-8-10 13:04
STC32 除xfr寄存器外,其余sfr寄存器0x80~0xFF都可以位寻址操作。

人家这是STC8单片机,不是STC32G32位单片机
作者: yzwzfyz    时间: 2022-8-10 17:05
51单片机中:
20-2FH可以直接位寻址。
高端特殊寄存器(80H - FFH)中,地址能被8整除的可以位寻址。
其它内存,需要位寻址,只能间接进行。如将它传送到A中,再位寻址A。
作者: npn    时间: 2022-8-10 17:46
头文件里的内容严禁乱改,不支持位寻址的寄存器用 &=、 |= 运算符字节操作即可。
作者: pcbboy    时间: 2022-8-11 10:05
#define S3RI  0x01              //S3CON.0
#define S3TI  0x02              //S3CON.1
#define S3RB8 0x04              //S3CON.2
#define S3TB8 0x08              //S3CON.3

UART3 中断服务程序
-----------------------------*/
void Uart3() interrupt 17 using 0
{
       
if( S3CON & S3RI)
    {
                       
    S3CON &= ~S3RI;
       
                }
               
         if ((S3CON & S3TI)!= 0) {S3CON &= ~S3TI;busy=0; }
  
}
作者: pcbboy    时间: 2022-8-11 10:08
多看看官方的头文件,里面其实都做了不少直接能用的,只是我们没去看沿用旧的方法而已。

#define                S3_MODE0()                        S3CON &= ~(1<<7)        /* 串口3模式0,8位UART,波特率 = 定时器的溢出率 / 4  */
#define                S3_MODE1()                        S3CON |=  (1<<7)        /* 串口3模式1,9位UART,波特率 = 定时器的溢出率 / 4  */
#define                S3_8bit()                        S3CON &= ~(1<<7)        /* 串口3模式0,8位UART,波特率 = 定时器的溢出率 / 4  */
#define                S3_9bit()                        S3CON |=  (1<<7)        /* 串口3模式1,9位UART,波特率 = 定时器的溢出率 / 4  */
#define                S3_RX_Enable()                S3CON |=  (1<<4)        /* 允许串3接收                                                                             */
#define                S3_RX_Disable()                S3CON &= ~(1<<4)        /* 禁止串3接收                                                                             */
#define                TI3                                        (S3CON & 2) != 0        /* 判断TI3是否发送完成                                                                 */
#define                RI3                                        (S3CON & 1) != 0        /* 判断RI3是否接收完成                                                                 */
#define                SET_TI3()                        S3CON |=  (1<<1)        /* 设置TI3(引起中断)                                                                 */
#define                CLR_TI3()                        S3CON &= ~(1<<1)        /* 清除TI3                                                                                         */
#define                CLR_RI3()                        S3CON &= ~1                        /* 清除RI3                                                                                         */
#define                S3TB8_SET()                        S3CON |=  (1<<3)        /* 设置TB8                                                                                         */
#define                S3TB8_CLR()                        S3CON &= ~(1<<3)        /* 清除TB8                                                                                         */
#define                S3_Int_Enable()                IE2   |=  (1<<3)        /* 串口3允许中断                                                                     */
#define                S3_Int_Disable()        IE2   &= ~(1<<3)        /* 串口3禁止中断                                                                     */
#define         S3_BRT_UseTimer3()        S3CON |=  (1<<6)        /* BRT select Timer3                                                                 */
#define         S3_BRT_UseTimer2()        S3CON &= ~(1<<6)        /* BRT select Timer2                                                                 */
#define                S3_USE_P00P01()                P_SW2 &= ~2                        /* UART3 使用P0口        默认                                                     */
#define                S3_USE_P50P51()                P_SW2 |=  2                        /* UART3 使用P5口                                                                     */

作者: Y_G_G    时间: 2022-8-12 07:04
pcbboy 发表于 2022-8-11 10:08
多看看官方的头文件,里面其实都做了不少直接能用的,只是我们没去看沿用旧的方法而已。

#define                S3_MO ...

STC早就把数据手册上的所有寄存器名称和位都用头文件定义了的
但并不是所有的都是以"位"来定义的,大多是unsigned char 变量定义的
楼主这是想要用bit的,这不是什么好习惯,并不是所有的单片机C语言都支持位的,到时候换一个单片机类型,移植起来不方便,用unsigned char要好很多
作者: armstrong    时间: 2022-8-12 15:05
pcbboy 发表于 2022-8-11 10:08
多看看官方的头文件,里面其实都做了不少直接能用的,只是我们没去看沿用旧的方法而已。

#define                S3_MO ...

  强




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1