<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > PIC單片機(jī)CCS之C語(yǔ)言(#IF,#ENDIF的用法)

          PIC單片機(jī)CCS之C語(yǔ)言(#IF,#ENDIF的用法)

          作者: 時(shí)間:2016-11-17 來(lái)源:網(wǎng)絡(luò) 收藏
          #IF expr

          #ELSE

          本文引用地址:http://www.ex-cimer.com/article/201611/315395.htm

          #ELIF

          #ENDIF

          語(yǔ)法: #if expr

          code

          #elif expr

          code

          #else

          code

          #endif

          expr是一個(gè)常數(shù)表達(dá)式,標(biāo)準(zhǔn)算子或預(yù)處理器標(biāo)識(shí)符;

          Code是任意的標(biāo)準(zhǔn)C源程序.

          目的: 預(yù)處理器求出常數(shù)表達(dá)式的值,如果這個(gè)值是非0值,就處理可選項(xiàng)#ELSE或#ENDIF的上面的所有行.

          注意:你不可在#IF里使用C變量,只有預(yù)處理器通過(guò)#define創(chuàng)造的才可使用.

          若id被定義了,則預(yù)處理器表達(dá)式DEFINED(id)可用來(lái)返回1,若沒(méi)有定義id,則DEFINED(id)返回的值為0.

          例子:#if MAX_VALUE>255

          long value; //若MAX_VALUE>255,則將value定義為長(zhǎng)整型變量

          #else

          int value; //若MAX_VALUE不大于255, 則將value定義為整型變量

          #endif

          例子文件:ex_extee.c

          文件: ex_extee.c如下:

          #if defined(__PCB__) //若使用了PCB編譯器,則defined( __PCB__)返回值為1

          #include <16c56.h> //包含16c56.h頭文件

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

          // NOPROTECT:程序存儲(chǔ)器代碼不保護(hù)

          #use delay(clock=20000000) //使能內(nèi)置函數(shù)的功能:delay_ms()和delay_us()

          //#USE DELAY()必須在#use rs232()使用之前出現(xiàn).

          #use rs232(baud=9600, xmit=PIN_A3, rcv=PIN_A2)

          //使用波特率為9600,

          //發(fā)送腳為PIN_A3

          //接收腳為PIN_A2

          //使能內(nèi)置函數(shù):GETC,PUTC和PRINTF, kbhit();

          #elif defined(__PCM__)

          #include <16F877.h>

          #fuses HS,NOWDT,NOPROTECT,NOLVP

          #use delay(clock=20000000)

          #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12

          #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) // Jumpers: 8 to 11, 7 to 12

          #endif //結(jié)束if定義

          #include //包含input.c頭文件

          #include <2416.c> //包含2416.c頭文件

          void main() {

          BYTE value, cmd; //聲明字節(jié)型變量value, cmd

          EEPROM_ADDRESS address; //用EEPROM_ADDRESS代替long int,為16位

          init_ext_eeprom(); //初始化連接到eeprom的I/O腳

          do {

          do {

          printf("rnRead or Write: ");

          cmd=getc(); //從RS232口讀一個(gè)字節(jié)

          cmd=toupper(cmd); //將cmd中的小寫字母轉(zhuǎn)換成大寫字母送給cmd

          putc(cmd);

          } while ( (cmd!=R) && (cmd!=W) ); //直到輸入R或W為止

          printf("nrLocation: ");

          #if sizeof(EEPROM_ADDRESS)==1

          //若定義EEPROM_ADDRESS是1個(gè)字節(jié),則sizeof(EEPROM_ADDRESS)==1返回1

          address = gethex();

          #else //若定義EEPROM_ADDRESS是大于1個(gè)字節(jié)

          #if EEPROM_SIZE>0xfff

          address = gethex();

          #else // EEPROM_SIZE小于0xfff

          address = gethex1(); //從RS232口讀一個(gè)字節(jié),為eeprom存儲(chǔ)高字節(jié)地址

          #endif //結(jié)束if定義

          address = (address<<8)+gethex(); //從RS232口讀2個(gè)字節(jié),為eeprom存儲(chǔ)低字節(jié)地址

          #endif //結(jié)束if定義

          if(cmd==R) //若輸入R,則執(zhí)行下面

          printf("rnValue: %Xrn",READ_EXT_EEPROM( address ) );

          if(cmd==W) {

          printf("rnNew value: ");

          value = gethex(); //從RS232輸入,為寫入eeprom的值做準(zhǔn)備

          printf("nr");

          WRITE_EXT_EEPROM( address, value );

          }

          } while (TRUE);

          }

          文件: input.c如下:

          #include //包含CTYPE.H頭文件

          BYTE gethex1() {

          char digit; //聲明字節(jié)型變量digit

          digit = getc(); //從RS232口讀一個(gè)字節(jié)

          putc(digit); //向RS232口寫一個(gè)字節(jié)

          if(digit<=9) //將讀到的字節(jié)以16進(jìn)制返回

          return(digit-0); //若讀到的ascii碼小于或等于39,則將其減30,以16進(jìn)制返回

          else

          return((toupper(digit)-A)+10); //若讀到的ascii碼大于39,則將其減41,再加10返回

          }

          BYTE gethex() {

          int lo, hi; //聲明整型變量lo, hi

          hi = gethex1(); //從RS232口讀一個(gè)字節(jié),存儲(chǔ)到hi中

          lo = gethex1(); //從RS232口讀一個(gè)字節(jié),存儲(chǔ)到lo中

          if(lo==0xdd)

          return(hi);

          else

          return( hi*16+lo );

          }

          void get_string(char* s, int max) {

          int len; //聲明整型變量len

          char c; //聲明字節(jié)型變量c

          --max; //初始化max值

          len=0; //初始化len值

          do {

          c=getc(); //從RS232口讀一個(gè)字節(jié),存儲(chǔ)到c中

          if(c==8) { // Backspace若是空格鍵

          if(len>0) {

          len--;

          putc(c); //向RS232寫c

          putc( );

          putc(c);

          }

          } else if ((c>= )&&(c<=~))

          if(len

          s[len++]=c;

          putc(c);

          }

          } while(c!=13);

          s[len]=0;

          }

          // stdlib.h is required for the ato_ conversions

          // in the following functions

          #ifdef _STDLIB //若定義_STDLIB,則執(zhí)行下面

          signed int get_int() {

          char s[5]; //聲明字符型數(shù)組s[5]

          signed int i; //聲明有符號(hào)整型變量i

          get_string(s, 5); //從RS232口讀5個(gè)字節(jié),存儲(chǔ)到s數(shù)組中

          i=atoi(s); //將數(shù)組s[]的字符串轉(zhuǎn)換成整型數(shù)送給i

          return(i);

          }

          signed long get_long() {

          char s[7]; //聲明字符型數(shù)組s[7]

          signed long l; //聲明有符號(hào)長(zhǎng)整型變量l

          get_string(s, 7); //從RS232口讀7個(gè)字節(jié),存儲(chǔ)到s數(shù)組中

          l=atol(s); //將數(shù)組s[]的字符串轉(zhuǎn)換成長(zhǎng)整型數(shù)送給l

          return(l);

          }

          float get_float() {

          char s[20]; //聲明字符型數(shù)組s[7]

          float f; //聲明符點(diǎn)型變量l

          get_string(s, 20); //從RS232口讀20個(gè)字節(jié),存儲(chǔ)到s數(shù)組中

          f = atof(s); //將數(shù)組s[]的字符串轉(zhuǎn)換成符點(diǎn)數(shù)送給f

          return(f);

          }

          #endif //結(jié)束if定義

          文件: 2416.c如下:

          //// Library for a MicroChip 24LC16B ////

          //// init_ext_eeprom(); Call before the other functions are used ////

          //// write_ext_eeprom(a, d); Write the byte d to the address a ////

          //// d = read_ext_eeprom(a); Read the byte d from the address a ////

          //// b = ext_eeprom_ready(); Returns TRUE if the eeprom is ready ////

          //// to receive opcodes ////

          //// The main program may define EEPROM_SDA ////

          //// and EEPROM_SCL to override the defaults below. ////

          //// Pin Layout ////

          //// ----------------------------------------------------------- ////

          //// | | ////

          //// | 1: NC Not Connected | 8: VCC +5V | ////

          //// | 2: NC Not Connected | 7: WP GND | ////

          //// | 3: NC Not Connected | 6: SCL EEPROM_SCL and Pull-Up | ////

          //// | 4: VSS GND | 5: SDA EEPROM_SDA and Pull-Up | ////

          //// ----------------------------------------------------------- ////

          #ifndef EEPROM_SDA //若沒(méi)有定義EEPROM_SDA,則執(zhí)行下面

          #define EEPROM_SDA PIN_C4 //用EEPROM_SDA代替PIN_C4

          #define EEPROM_SCL PIN_C3 //用EEPROM_SCL代替PIN_C3

          #endif //結(jié)束if定義

          #use i2c(master, sda=EEPROM_SDA, scl=EEPROM_SCL)

          // master設(shè)置成主機(jī)方式

          //除非指定了FORCE_HW,否則會(huì)產(chǎn)生模擬I2C的軟件函數(shù).

          //使能I2C_START, I2C_STOP直到下一個(gè)#USE I2C的出現(xiàn)為止.

          //使能I2C_READ, I2C_WRITE直到下一個(gè)#USE I2C的出現(xiàn)為止.

          //使能I2C_POLL直到下一個(gè)#USE I2C的出現(xiàn)為止.

          //指定sda腳為EEPROM_SDA, 指定scl腳為EEPROM_SCL

          #define EEPROM_ADDRESS long int //用EEPROM_ADDRESS代替long int

          #define EEPROM_SIZE 2048 //用EEPROM_SIZE代替2048

          void init_ext_eeprom() {

          output_float(EEPROM_SCL); //將EEPROM_SCL引腳設(shè)為輸入,開集電極連接

          output_float(EEPROM_SDA); //將EEPROM_SDA引腳設(shè)為輸入,開集電極連接

          }

          BOOLEAN ext_eeprom_ready() {

          int1 ack; //聲明位變量ack

          i2c_start(); //發(fā)送啟動(dòng)條件

          ack = i2c_write(0xa0); //發(fā)送從機(jī)地址0xa0;若ack=0,表示從機(jī)應(yīng)答(ACK);

          //若ack=1,表示從機(jī)不應(yīng)答(NO ACK);

          i2c_stop(); //發(fā)送停止條件

          return !ack;

          } // ext_eeprom_ready()函數(shù),若返回1,表示從機(jī)準(zhǔn)備好; 若返回0,表示從機(jī)忙或eeprom壞了

          void write_ext_eeprom(long int address, BYTE data) {

          while(!ext_eeprom_ready()); //若從機(jī)忙,則主機(jī)等待

          i2c_start(); //發(fā)送啟動(dòng)條件

          i2c_write( (0xa0|(BYTE)(address>>7))&0xfe); //發(fā)送命令字的高字節(jié)(發(fā)送寫命令)

          i2c_write(address); //發(fā)送命令字的低字節(jié)

          i2c_write(data); //發(fā)送數(shù)據(jù)

          i2c_stop(); //發(fā)送停止條件

          }

          BYTE read_ext_eeprom(long int address) {

          BYTE data; //聲明字節(jié)變量data

          while(!ext_eeprom_ready()); //先發(fā)器件地址,若從機(jī)忙,則主機(jī)等待

          i2c_start(); //在此處是:發(fā)送重新啟動(dòng)條件

          i2c_write( (0xa0|(BYTE)(address>>7))&0xfe); //發(fā)送命令字的高字節(jié)(發(fā)送寫命令)

          i2c_write(address); //發(fā)送命令字的低字節(jié)

          i2c_start(); //發(fā)送啟動(dòng)條件

          i2c_write( (0xa0|(BYTE)(address>>7))|1); //發(fā)送命令字的高字節(jié)(發(fā)送讀命令)

          data=i2c_read(0); //讀I2C數(shù)據(jù),然后發(fā)送ack=0(不用從機(jī)應(yīng)答)

          i2c_stop(); //發(fā)送停止條件

          return(data); //返回所讀到的I2C數(shù)據(jù)

          }

          上面的例子主要用來(lái)讀寫24C16,通過(guò)PC機(jī)RS232進(jìn)行驗(yàn)證



          關(guān)鍵詞: PIC單片機(jī)CCSIFENDI

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();