PIC單片機CCS之C語言(#BIT的用法)

2020-12-13 電子產品世界
#BIT

語法: #bit id=x.y

本文引用地址:http://www.eepw.com.cn/article/201611/315392.htm

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分頻後計數.

相關焦點

  • PIC單片機C語言程序設計(5)
    在《電子製作》2009年第10期,《PIC單片機C語言程序(1)》的延時函數中,我們已用過後綴運算符i++,大家可以從中體會其用法。  (2)邏輯運算符。  邏輯運算符是基本運算符中的一種。邏輯運算符有:與「&&」、或「||" 、非「!」等3三種。  邏輯運算符&&、||為雙目(兩個量)運算符,!為單目運算符。
  • PIC單片機C語言程序實例
    C語言的運算符有34種,範圍很寬,靈活使用各種運算符可以實現難度極大的運算。      C語言能直接訪問硬體的物理地址,能進行位(bit)操作。兼有高級語言和低級語言的許多優點。      它既可用來編寫系統軟體,又可用來開發應用軟體,已成為一種通用程序設計語言。
  • PIC單片機CCS之C語言(#IF,#ENDIF的用法)
    例子:#if MAX_VALUE>255long value; //若MAX_VALUE>255,則將value定義為長整型變量#elseint value; //若MAX_VALUE不大於255, 則將value定義為整型變量#endif例子文件:ex_extee.c文件: ex_extee.c
  • 單片機教程:PIC單片機C語言程序設計(五)
    接前文:單片機教程:PIC單片機C語言程序設計(四)   九、C語言的運算符   C語言提供了30多個運算符,範圍很大,應用廣。  在《PIC單片機C語言程序(一)》的延時函數中,我們已用過後綴運算符i++,大家可以從中體會其用法。  (2)邏輯運算符。  邏輯運算符是基本運算符中的一種。邏輯運算符有:與「&&」、或「||「 、非「!」等3三種。  邏輯運算符&&、||為雙目(兩個量)運算符,!為單目運算符。
  • PIC單片機asm與C混合編程
    一、如何從彙編轉向PICC首先要求你要有C 語言的基礎。C代碼的頭文件一定要有#include,它是很多頭文件的集合,C 編譯器在pic.h 中根據你的晶片自動載入相應的其它頭文件。這點比彙編好用。載入的頭文件中其實是聲明晶片的寄存器和一些函數。
  • PIC單片機C語言程序設計(4)
    2.if語句  if 語句也稱為條件語句,是C 語言中轉移語句之一。在設計C 語言程序時,常常要根據某些條件以決定程序運行的流向,這時就需要if 語句來實現。
  • PIC單片機CCS之C語言(#USE FAST_IO的用法)
    例子:#use fast_io(A)例子文件:ex_cust.c;該文件在前面已經敘述過了
  • PIC單片機 C編程技巧
    (以MPLAB5.7版本為例子)啟動MPLAB.在Project-->Install Language Tool:Language Suite>hi-tech piccTool Name ---->PICC CompilerExecutable ---->c:hi-picinpicc.exe (假如你的PICC是默認安裝的)選Command-line
  • PIC單片機之I2C總線
    大家好,通過前一期的學習,我們已經對ICD2 仿真燒寫器和增強型PIC 實驗板的使用方法及學習方式有所了解與熟悉,學會了如何用單片機來控制發光管、繼電器、蜂鳴器、按鍵、數碼管、RS232 串口、步進電機、溫度傳感器等資源,體會到了學習板的易用性與易學性,看了前幾期實例,當你實驗成功後一定很興奮,很有成就感吧!
  • 如何寫出高效優美的單片機C語言代碼?
    (2)、平方運算a=pow(a,2.0);可以改為:a=a*a;說明:在有內置硬體乘法器的單片機中(如51系列),乘法運算比求平方運算快得多,因為浮點數的求平方是通過調用子程序來實現的,在自帶硬體乘法器 的AVR單片機中,如ATMega163中,乘法運算只需2個時鐘周期就可以完成
  • 單片機的C語言中數組的用法
    數組在C51語言的地位舉足輕重,因此深入地了解數組是很有必要的。下面就對數組進行詳細的介紹。(1)一維數組本文引用地址:http://www.eepw.com.cn/article/201611/320327.htm一維數組是最簡單的數組,用來存放類型相同的數據。數據的存放是線性連續的。
  • 【愛找茬】都是C語言,單片機C語言和普通的C語言究竟有什麼差異呢?
    許多小夥伴在學完C語言後想入門單片機,但學著學著發現明明都是C語言,為什麼單片機C語言和我當初學的C語言有差異呢?今天小編就來梳理我們平時所學的C語言與單片機C語言的有什麼樣的不同。
  • 結合單片機學習板學習c語言之流水燈製作--intrins.h頭文件
    本文引用地址:http://www.eepw.com.cn/article/201608/294948.htm  源程序:  /*本程序結合STC89C51使用,晶振12M,中間用到串口中斷子程序是利用STC單片機的自定義ISP下載功能,自定義下載命令是FEH,關於自定義下載請參考《用51單片機就用STC51,手把手教你STC51的ISP
  • PIC單片機C語言程序設計(2)
    一個完整的PIC單片機C語言程序,通常由包含文件(即頭文件1,變量定義、變量說明、函數定義、函數體和注釋等六部分等組成。  1.C語言的標識符  所謂標識符,實際上是一些由程序編寫者自定義的名稱,類似於PIC單片機彙編語言中給寄存器(RAM)的命名。
  • PIC單片機CCS之C語言(#USE FIXED_IO的用法)
  • 通俗易懂講PIC單片機:從一竅不通到入門進步
    單片機入門不難-談PIC系列(轉自礦石收音機論壇---嶗山)十年前的老帖子,講得通俗易懂,分享之。本文引用地址:http://www.eepw.com.cn/article/201803/376687.htm  請看圖1
  • PIC單片機之步進電機
    PIC 單片機的RD0~RD3 為電機脈衝輸出引腳,通過ULN2003 集成晶片來驅動小型步進電機,我們只要將步進電機的插頭,直接插在板子J3 插座處即可。對於單片機軟體的編程,我們使用MPLab IDE軟體來進行C 語言編程,它是我們的編程環境,同時我們可以通過使用ICD2 仿真燒寫器和增強型PIC實驗板連接進行程序的仿真調試和燒寫步驟,具體的操作步驟,我們已經在前幾期做了詳細的說明和介紹
  • 51,AVR,PIC,MSP430,STM32單片機比較
    PIC:我就是學這款單片機入門的,pic的好處就是各個型號的兼容性強,學好了PIC16f877a,16系列的就OK了,別的型號要用的時候拿出2分鐘看看數據手冊就行了。12系列 16系列 18系列也是充分的向下兼容。
  • avr單片機和stm32區別與優缺點分析
    C語言與51的C語言在寫法上存在很大的差異,這讓從開始學習51單片機的朋友很不習慣   3. 通用寄存器一共32個(R0~R31),前16個寄存器(R0~R15)都不能直接與立即數打交道,因而通用性有所下降。而在51系列中,它所有的通用寄存器(地址00~7FH)均可以直接與立即數打交道,顯然要優於前者。
  • 基於C語言51單片機電子密碼鎖的設計與仿真
    電子密碼鎖通常使用ARM和單片機控制,單片機相對ARM實現較為簡單,功能較為完善,因此使用單片機控制較多。用單片機控制的窖碼鎖常使用彙編語言編寫程序,顯示器多數用。而本文所介紹的電子密獁鎖使用移植性及可讀性強的高級語言C語言編寫,便於修改和增減功能蚤同時採用顯示清楚數碼管,功率消耗小而且壽命長的 液晶顯示器,顯示更加直觀,使用更加方便。