930电子网

 找回密码
 立即注册
艾克姆科技推出最新产品STC32G12K128开发板
查看: 8928|回复: 3

STC15W4K32S4系列外设GPIO之程序设计

[复制链接]

101

主题

333

帖子

7428

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7428
发表于 2019-6-14 09:34:08 | 显示全部楼层 |阅读模式
本帖最后由 正是河豚 于 2019-6-14 09:38 编辑

    1、位寻址定义:对位地址中的内容进行位操作的寻址方式称为位寻址。由于单片机中只有内部RAM和特殊功能寄存器的部分单元有位地址,因此位寻址只能对有位地址的这两个空间进行寻址操作。
    注:一般如果SFR(特殊功能寄存器)的地址值能被8整除,则该SFR也可以进行位寻址。
    2、STC15W4K32S4系列外设GPIO的端口数据寄存器都是支持位寻址的。

    注:由上图P0,P1……P7寄存器地址值都是可以被8整除的(地址值是十六进制转成十进制除8)。
    3、支持位寻址的寄存器可以直接操作寄存器的位,比如:将操作寄存器P0的第7位配置为0,可有下面两种代码书写方式实现。
  • P06=0;             //将P0.6端口置低电平  
  • P0 &= 0xBF;        //将P0.6端口置低电平

    当需要将操作寄存器P0的第7位配置为1,代表的意思是P0.6端口置高电平,亦可有下面两种书写方式。
  • P06=1;             //将P0.6端口置高电平  
  • P0 |= 0x40;        //将P0.6端口置高电平  

    4、配置了GPIO端口的工作模式再去操作这个GPIO口才是规范有效的,上面代码是输出控制P0.6口的状态。那P0.6口工作模式可以是准双向口,也可以是强推挽模式。下面举例对P0.6和P0.7端口进行模式配置的操作。
  • P0M1 &= 0x3F;   P0M0 &= 0x3F;     //设置P0.6~P0.7为准双向口  
  • P0M1 &= 0x3F;   P0M0 |= 0xC0;     //设置P0.6~P0.7为推挽输出  
  • P0M1 |= 0xC0;   P0M0 &= 0x3F;     //设置P0.6~P0.7为高阻输入  
  • P0M1 |= 0xC0;   P0M0 |= 0xC0;     //设置P0.6~P0.7为开漏输出  

    5、关于sbit:sbit一般是用在寄存器中的,方便对寄存器的某位进行操作的。如果针对P06用户不想用,可以这样: sbit LED1 = P0^6;这样可通过下面语句实现对P0寄存器第7位的操作。
  • LED1=0;            //将P0.6端口置低电平  
  • LED1=1;            //将P0.6端口置高电平   

    6、如果P0.6端口作为输入功能的话,读取这个端口的状态也是很方便的。
    方法1:
  • if(P06== 0)          //检测P0.6端口是否是低电平  
  • {   
  •             ;        //添加P0.6端口为低电平时会执行的代码  
  • }

    方法2:
  • sbit KEY1=P0^6;            
  • if(KEY1== 0)       //检测P0.6端口是否是低电平  
  • {   
  •            ;       //添加P0.6端口为低电平时会执行的代码  
  • }




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

3

主题

14

帖子

55

积分

注册会员

Rank: 2

积分
55
发表于 2019-6-15 08:51:13 | 显示全部楼层
谢谢楼主分享,那是不是可以这样说:只有在头文件里支持位寻址的寄存器,才可以使用关键字sbit定义寄存器的位变量。谢谢
回复 支持 反对

使用道具 举报

101

主题

333

帖子

7428

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7428
 楼主| 发表于 2019-6-15 09:44:53 | 显示全部楼层
    嗯,可以这样理解。所以在头文件中可位寻址的寄存器,一般都会使用sbit来定义该寄存器的位变量。
    1、需要说明的一点,用户也可以使用sbit来重新自定义可位寻址的寄存器的位,举例:
    中断允许寄存器IE是支持位寻址的,在STC15的头文件中定义IE第7位是这样的: sbit  EA=IE^7;
    我们知道EA是总中断的意思。
    2、但其实我们可以这样自定义:sbit EEAA=IE^7;
    那么此时EEAA的作用和EA一样的,不过我们不会这样定义,大家比较习惯的就是EA代表总中断的意思。




回复 支持 反对

使用道具 举报

3

主题

14

帖子

55

积分

注册会员

Rank: 2

积分
55
发表于 2019-6-15 09:46:09 | 显示全部楼层
哦,明白了,谢谢大神解答
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|手机版|官方淘宝店|930电子网 ( 皖ICP备16000695号-2 )

Copyright © 合肥艾克姆电子科技有限公司
快速回复 返回顶部 返回列表