×
单片机 > 单片机程序设计 > 详情

PIC单片机CCS之C语言(#BIT的用法)

发布时间:2020-06-03 发布时间:
|
#BIT

语法: #bit  id=x.y

id是一个有效的C标识符;

x是一个常数或是一个C变量;

y是一个常数(为0~7)

目的:创建一个新的C变量(是一位),放置在存储区中,对应的是字节x中y位,有益于在C语言中只接存取CPU特殊功能寄存器中的一位.它也可用来存取标准C变量的一位.

例子:

#bit T0IF = 0xb.2       //定义T0IF的位地址为0xb.2

T0IF=0;               //清除Timer0的中断标志位

int result;

#bit result_odd = result.0  //定义result_odd的位地址为result.0

if(result_odd){;}        //若result_odd为1,则空操作

例子文件: ex_glint.c

#if defined(__PCM__)   //若使用了PCM编译器,则defined(__PCM__)返回值为1

#include <16F877.h>    //包含16F877.h头文件

#fuses HS,NOWDT,NOPROTECT,NOLVP  //HS:高速晶振/谐振器, NOWDT:不使用WDT

                                     // NOPROTECT:程序存储器代码不保护

#use delay(clock=20000000)    //使能内置函数的功能:delay_ms()和delay_us()

                           //#USE DELAY()必须在#use rs232()使用之前出现.

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  //使用波特率为9600,

//发送脚为PIN_C6

//接收脚为PIN_C7

//使能内置函数:GETC,PUTC和PRINTF;

#elif defined(__PCH__)

#include <18F452.h>

#fuses HS,NOWDT,NOPROTECT,NOLVP

#use delay(clock=20000000)

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#endif   //结束if

 

long counter;  //将counter定义为long型变量

 

#if defined(__PCM__)   //若使用了PCM编译器,则defined(__PCM__)返回值为1

   int save_w;         //将save_w定义为int型变量

   #locate save_w=0x7f  //将save_w定位在RAM中,0x7f的地址处, 用来暂存W的内容

   int save_status;      //将save_status定义为int型变量, 用来暂存status的内容

   #locate save_status=0x20  //将save_status定位在RAM中, 0x20的地址处,

   #byte status = 3     //定义status的地址为3,即状态寄存器的地址

   #bit zero_flag = status.2  //定义zero_flag的位地址为status.2,即status的Z位

   #bit t0if = 0xb.2     //定义t0if的位地址为0xb.2,即timer0的溢出标志位

#elif defined(__PCH__)

   int save_w;

   #locate save_w=0x80

   int save_status;

   #locate save_status=0xFF

  

   #byte status = 0xFD8

   #bit zero_flag = status.2   //status的全0位,即Z

   #bit t0if = 0xFF2.2

#endif    //结束if

#INT_GLOBAL  //指示下面的函数代替编译器产生中断

void isr()  {

   #asm     //插入汇编开始

   //store current state of processor

   MOVWF save_w    //将W的内容存到save_w中,目的是保存W,即将W入栈

   SWAPF status,W    //将status内容高半字节和低半字节进行交换,存入W中

   BCF   status,5     //将status的第5位清0,即将RP0=0

   BCF   status,6     //将status的第6位清0, 即将RP1=0,两句是用来选择bank0

   MOVWF save_status //将W的内容存到save_status中,目的是保存status,即将status入栈

   BCF   t0if        //将timer0的中断标志位t0if清0

   INCF  counter,F    // counter加1后存到counter

   BTFSC zero_flag    //若counter不等于0x00, 则zero_flag=0,跳过下一句;

//若counter=0x00,zero_flag=1,则执行下一句;

   INCF  (&counter+1),F   // counter的地址加1, (&counter+1)的内容加1

   SWAPF save_status,W  //将save_status内容高半字节和低半字节进行交换,存入W中

   MOVWF status     //将W的内容存到status中, status出栈

   SWAPF save_w,F   //将save_w内容高半字节和低半字节进行交换,其结果存入save_w中

   SWAPF save_w,W    //将save_w内容高半字节和低半字节进行交换,存入W 中, W出栈

   #endasm    //插入汇编结束

}

void main()   {

printf("\r\nStarting the counter.\r\n\n");

   counter = 0;

setup_counters(RTCC_INTERNAL,RTCC_DIV_32); //设置Timer0的时钟源为内部时钟源

                                            //每隔32个脉冲,TMR0计数1次

   enable_interrupts(INT_RTCC);      //允许Timer0(RTCC)溢出,建立中断标志位

   enable_interrupts(GLOBAL);        //使能总中断

 

   while(TRUE)

   {

      printf("The counter value is currently:  %5lu\r\n", counter);

      delay_ms(1000);   //延时1000ms

   }

}

//上面的例子只是说明用timer0对内部时钟源进行32分频后计数.



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR熔丝位操作时的要点和需要注意的相关事项