找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2064|回复: 17
收起左侧

我想把一个寄存器的一个位,引出了,但是出错了

  [复制链接]
ID:1004248 发表于 2022-8-9 19:11 | 显示全部楼层 |阅读模式
这个RI是头文件定义的,S3RI是我自己加的
51hei图片20220809191025.png
回复

使用道具 举报

ID:624769 发表于 2022-8-9 19:28 | 显示全部楼层
不是所有的 寄存器 都能未寻址的,S3CON 恰好属于不能位寻址的寄存器。
你需要补一下基础知识啊。
回复

使用道具 举报

ID:161164 发表于 2022-8-9 19:49 | 显示全部楼层
哪里有S3RI?
回复

使用道具 举报

ID:893997 发表于 2022-8-9 20:10 | 显示全部楼层
这个地址无效
回复

使用道具 举报

ID:213173 发表于 2022-8-9 20:13 | 显示全部楼层
本帖最后由 wulin 于 2022-8-9 21:00 编辑

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

使用道具 举报

ID:883242 发表于 2022-8-9 21:18 | 显示全部楼层
错误出在229、230行,你把216~226行贴出来是什么意思?
回复

使用道具 举报

ID:401564 发表于 2022-8-9 21:24 | 显示全部楼层

截图就截了错误页面
回复

使用道具 举报

ID:401564 发表于 2022-8-9 21:31 | 显示全部楼层
8051的寄存器只有1/8能位寻址
寄存器地址的低位为0和8的可以位寻址
除此之外,都不能位操作
回复

使用道具 举报

ID:879348 发表于 2022-8-10 08:33 | 显示全部楼层
在标准C中,位操作是通过或与等逻辑运算进行的,要习惯这种写法,因为大部分单片机都不支持位操作
回复

使用道具 举报

ID:57657 发表于 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. }
复制代码
回复

使用道具 举报

ID:624769 发表于 2022-8-10 14:27 来自手机 | 显示全部楼层
npn 发表于 2022-8-10 13:04
STC32 除xfr寄存器外,其余sfr寄存器0x80~0xFF都可以位寻址操作。

楼主贴图显示,他用的stc8
回复

使用道具 举报

ID:401564 发表于 2022-8-10 14:56 | 显示全部楼层
npn 发表于 2022-8-10 13:04
STC32 除xfr寄存器外,其余sfr寄存器0x80~0xFF都可以位寻址操作。

人家这是STC8单片机,不是STC32G32位单片机
回复

使用道具 举报

ID:123289 发表于 2022-8-10 17:05 | 显示全部楼层
51单片机中:
20-2FH可以直接位寻址。
高端特殊寄存器(80H - FFH)中,地址能被8整除的可以位寻址。
其它内存,需要位寻址,只能间接进行。如将它传送到A中,再位寻址A。
回复

使用道具 举报

ID:57657 发表于 2022-8-10 17:46 | 显示全部楼层
头文件里的内容严禁乱改,不支持位寻址的寄存器用 &=、 |= 运算符字节操作即可。
回复

使用道具 举报

ID:25310 发表于 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; }
  
}
回复

使用道具 举报

ID:25310 发表于 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口                                                                     */
回复

使用道具 举报

ID:401564 发表于 2022-8-12 07:04 | 显示全部楼层
pcbboy 发表于 2022-8-11 10:08
多看看官方的头文件,里面其实都做了不少直接能用的,只是我们没去看沿用旧的方法而已。

#define                S3_MO ...

STC早就把数据手册上的所有寄存器名称和位都用头文件定义了的
但并不是所有的都是以"位"来定义的,大多是unsigned char 变量定义的
楼主这是想要用bit的,这不是什么好习惯,并不是所有的单片机C语言都支持位的,到时候换一个单片机类型,移植起来不方便,用unsigned char要好很多
回复

使用道具 举报

ID:286223 发表于 2022-8-12 15:05 | 显示全部楼层
pcbboy 发表于 2022-8-11 10:08
多看看官方的头文件,里面其实都做了不少直接能用的,只是我们没去看沿用旧的方法而已。

#define                S3_MO ...

  强
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表