语法: bit_clear(var, bit)

BIT_CLEAR()是PIC CCS专有的内部函数。

语法:   bit_clear(var, bit)

参数:   var可能是一个8,16位或32位的变量(任意的整型变量);bit0~31中的一个数,表示1位数.0是最小的一位,也是最重要的的一位.

返回值: 没有

功能:   只是将所给的变量指定的位(0~7, 0~15, 0~31)进行清0.该函数相当于var&=~(1<<bit).

有效性: 适合所有设备.

要求:   没有

例子:   int x;

        x=5;

        bit_clear(x, 2);    //x现在是1

        bit_clear(*11, 7);  //一个笨方法,不使能ints(中断);

例子文件:  ex_patg.c

文件: ex_patg.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()使用之前出现.

#elif defined(__PCH__)

#include <18F452.h>

#fuses HS, NOWDT, NOPROTECT, NOLVP

#use delay(clock=20000000)

#endif    //结束if定义

#define  NUM_OUTPUTS  7   //NUM_OUTPUTS代替7

//NOTE:  periods MUST be multiples of 400注意:周期必须是400的倍数

//Periods are in microseconds周期的单位是微秒(us)

#define  PERIOD_0  400        //PERIOD_0代替400

#define  PERIOD_1  800        //PERIOD_1代替800

#define  PERIOD_2  1600       //PERIOD_2代替1600

#define  PERIOD_3  2000       //PERIOD_3代替2000

#define  PERIOD_4  20000      //PERIOD_4代替20000

#define  PERIOD_5  64000      //PERIOD_5代替64000

#define  PERIOD_6  2000000    //PERIOD_6代替2000000

const long wave_period[NUM_OUTPUTS] = {

         PERIOD_0/400, PERIOD_1/400, PERIOD_2/400, PERIOD_3/400,

         PERIOD_4/400, PERIOD_5/400, PERIOD_6/400}; //声明常数数组wave_period[7]

long counter[NUM_OUTPUTS] = {0,0,0,0,0,0,0};  //声明长整型数组counter[7]

int port_b_image;  //声明port_b_image为整型变量

// This interrupt is used to output the waveforms.这个中断用来输出波形

// The interrupt is automatically called ever 200us.这个中断每200us自动被雕用一次

#INT_TIMER1   //指定下面的函数是timer1的中断服务函数

void wave_timer() {

   int i;                   //声明i为整型变量

   set_timer1(0xFC4F); // sets timer to interrupt in 200us(预置值为:65535-200/(4/20)=0xfc17 )

   output_b(port_b_image);   // b口输出波形

   for(i=0; i<NUM_OUTPUTS; i++)  // sets up next output for each pin

   {

      if((++counter[i]) == wave_period[i])   // counter[i]1后同wave_period[i]相等吗?

      {

         counter[i] = 0; //counter[i]1后存到counter[i],若同wave_period[i]相等,则清0

         if(bit_test(port_b_image,i))   //测试port_b_image的第i

            bit_clear(port_b_image,i); //port_b_image的第i位为1,则将该位清0

         else

            bit_set(port_b_image,i); //port_b_image的第i位为0,则将该位置1

      }

   }

}

void main()   {

   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);

//初始化定时器1,

                                    //时钟源为内部指令时钟

                                    //不用分频器,即每一指令时钟到来,T1计数一次

   enable_interrupts(INT_TIMER1);      // timer1中断允许位置1

   enable_interrupts(GLOBAL);         //开总中断允许位

   port_b_image=0;                   //初始化变量port_b_image给其赋初值0

   output_b(port_b_image);             //b口全部输出0

   while(TRUE);                      //循环等待

}

上面的例子告诉我们B0输出400us周期的方波, B1输出800us周期的方波, B2输出1600us周期的方波, B3输出2000us周期的方波, B4输出20000us周期的方波, B5输出64000us周期的方波, B6输出2000000us周期的方波.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值