?? slave_main.c
字號:
#if defined(__PCH__)
#include <18F6720.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP //HS:使用外部晶振10MHz;
//NOWDT:不使用看門狗
//NOPROTECT程序不保護
#use delay(clock=10000000) //使能內(nèi)部函數(shù)delay_ms()和delay_us()
//#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
//#define use_portb_lcd
#endif
char receive_string_buffer[]={'0','0','.','0','0'};
char receive_temp[5]={'0','0','.','0','0'}; //用來存放接收到的數(shù)據(jù),以ASCII格式存放
#include "C:\A\EXT_INT1.C "
#include "C:\A\DAC7612U.C "
#include "C:\A\LCD1604.C "
#include "C:\A\PCF8563.C "
/*
long int AD_value_temp=0; //聲明長整型變量
long int AD_value=0; //聲明長整型變量
*/
void DAC7612U_test_program(){
char string_pointer[]={'0','0','.','0','0'};
char string_temp1[6];
do{
for(counter=0;counter<25;counter++){
strcpy( string_temp1,string_pointer );//將string_pointer所指內(nèi)容拷貝到string_temp1中;
if(counter<10){string_temp1[1]=string_temp1[1]+counter;
string_temp1[0]='0';
}
else if(counter>9&&counter<20){string_temp1[1]=string_temp1[1]+counter-10;
string_temp1[0]='1';
}
else if(counter>19&&counter<25){string_temp1[1]=string_temp1[1]+counter-20;
string_temp1[0]='2';
}
write_string_to_DAC7612U(string_temp1,14);
lcd1604_display(string_temp1);
while( input(PIN_E3) );
delay_ms(1000);
}
}while( input(PIN_E4));
}
/*
#int_ad
void ad_conversion_complete()
{ int32 FLOAT_ad_value;
long int INT_ad_value;
//char receive_temp[5]; //用來存放接收到的數(shù)據(jù),以ASCII格式存放
long int quotient;
long int remainder;
//int i=0;
if(AD_value!=AD_value_temp)
//if(AD_value==AD_value_temp)
{AD_value=AD_value_temp;
setup_adc( ADC_OFF ); //關(guān)掉AD轉(zhuǎn)換
FLOAT_ad_value=AD_value&0x3ff;
//test
//FLOAT_ad_value=0xcc;//相當于1V輸入
FLOAT_ad_value=FLOAT_ad_value*5000;
//FLOAT_ad_value=FLOAT_ad_value/1023;//10位AD轉(zhuǎn)換
FLOAT_ad_value=FLOAT_ad_value/255; //8位AD轉(zhuǎn)換
INT_ad_value=(long int)(FLOAT_ad_value*6);
quotient=INT_ad_value/1000; //求整數(shù)部分;
remainder=INT_ad_value%1000; //求小數(shù)部分;
receive_temp[0] =(int)(quotient/100); //求整數(shù)位的百位數(shù)
quotient=quotient%100; //
receive_temp[1]=(int)(quotient/10); //求整數(shù)位的十位數(shù)
receive_temp[2]=(int)(quotient%10); //求整數(shù)位的個位數(shù)
receive_temp[3]=(int)(remainder/100); //求小數(shù)部分的最高位;
remainder=remainder%100; //求小數(shù)部分的次高位以下部分;
receive_temp[4]=(int)(remainder/10);
// receive_temp[5]=(int)(remainder%10);
if(receive_temp[0]==0)
{receive_temp[0]=receive_temp[1]|'0';
receive_temp[1]=receive_temp[2]|'0';
receive_temp[2]='.';
receive_temp[3]|='0';
receive_temp[4]|='0';
//receive_temp[5]|='0';
}
else{
receive_temp[0]|='0';
receive_temp[1]|='0';
receive_temp[2]|='0';
receive_temp[4]=receive_temp[3]|'0';
receive_temp[3]='.';
//receive_temp[5]|='0';
}
strcpy( receive_string_buffer,receive_temp ); //將receive_temp所指內(nèi)容拷貝到receive_string_buffer中;
write_string_to_DAC7612U(receive_string_buffer,14); //將接收到的5位ASCII碼寫入DAC7612U
lcd1604_display(receive_string_buffer); //將收到的ASCII碼送去顯示
}
setup_adc( ADC_CLOCK_INTERNAL ); //ADC采用內(nèi)部指令時鐘,重新啟動AD轉(zhuǎn)換
}
*/
#INT_EXT1
void ext_int1_service()
{
BYTE j,SLAVE_address;
//int1 receive_ok0;
//int1 receive_ok1;
char receive_temp[5]; //用來存放接收到的數(shù)據(jù),以ASCII格式存放
disable_interrupts(INT_EXT1);//不使能外部中斷1
if( input(slave_I2C_clk)) //若slave_I2C_clk=1時,在slave_I2C_data腳出現(xiàn)下降沿,表示I2C起動條件滿足,則執(zhí)行下面語句
{if( wait_I2C_clk_low() )
{SLAVE_address=read_IIC_byte(); //讀到一個字節(jié);
if(SLAVE_address==0xaa) //若地址相符合,則執(zhí)行下面語句
{iic_send_ack(); //本從機發(fā)送應(yīng)答ACK;
for(j=0;j<=4;j++)
{receive_temp[j]=read_IIC_byte();//讀到一個字節(jié);
if(j<4) iic_send_ack(); //本從機發(fā)送應(yīng)答ACK;
//if(receive_temp[j]!=0) receive_ok0=1;
// else{receive_ok0=0; break;}
}
if(receive_temp[0]!=0x00)
{if(receive_temp[1]!=0x00)
{if(receive_temp[2]!=0x00)
{if(receive_temp[3]!=0x00)
{if(receive_temp[4]!=0x00)
{ delay_us(100);
strcpy( receive_string_buffer,receive_temp );//將receive_temp所指內(nèi)容拷貝到receive_string_buffer中;
//write_string_to_DAC7612U(receive_string_buffer,14); //將接收到的5位ASCII碼寫入DAC7612U
//lcd1604_display(receive_string_buffer); //將接收到的5位ASCII碼寫入LCD顯示;
//delay_us(100);
}
}
}
}
}
}
}
}
//恢復(fù)現(xiàn)場
enable_interrupts(INT_EXT1);//使能外部中斷1
//bit_set(*0xF93,1); //端口B的方向寄存器地址為0xF93,將RB1設(shè)置為輸入
//bit_set(*0xF93,2); //端口B的方向寄存器地址為0xF93,將RB2設(shè)置為輸入
}
void main() {
set_tris_e(0x78); //將RE0:RE2和RE7設(shè)置為輸出口,RE3:RE6設(shè)置為輸入口
set_tris_f(0xfe); //將RF1:RF7設(shè)置為輸入,RF0設(shè)置為輸出;
set_tris_a(0x13); //將RA0:RA1和RA4設(shè)置為輸入,RA2:RA3和RA5:RA7設(shè)置為輸出;
ext_int1_init(); //外部中斷1初始化;每次中斷接到5個有效的ASCII碼,則立即送去LCD顯示,且寫入DAC7612U
write_PCF8563_time(0x06,0x03,0x08,0x15,0x59,0x30); //將2006年3月8日,15點59分30秒寫入PCF8563
set_PCF8563_alarm(0x09, 0x58); //0x09分鐘報警寄存器地址;設(shè)置在每小時零58分報警一次;
DAC7612U_init(); //一次性初始化DAC7612U通道道1和通道0
lcd_init(); //LCD初始化;
//ext_int1_init(); //外部中斷1初始化;每次中斷接到5個有效的ASCII碼,則立即送去LCD顯示,且寫入DAC7612U
setup_adc_ports(ANALOG_AN0_TO_AN1); //將RA0和RA1設(shè)為模擬輸入,所有其它腳為數(shù)字端口;
//setup_adc( ADC_CLOCK_INTERNAL ); //ADC采用內(nèi)部指令時鐘
//set_adc_channel( 0 ); //選擇ADC端口0
delay_us(10);//延時10us
//enable_interrupts(int_ad); //使能AD中斷
enable_interrupts(global); //開總中斷允許位
do{delay_ms(100);//延時100ms
//disable_interrupts(INT_EXT1);//不使能外部中斷1
write_string_to_DAC7612U(receive_string_buffer,14); //將接收到的5位ASCII碼寫入DAC7612U
lcd1604_display(receive_string_buffer); //將接收到的5位ASCII碼寫入LCD顯示;
//AD_value_temp = Read_ADC();//讀ADC端口0
delay_ms(100);//延時100ms
enable_interrupts(INT_EXT1);//不使能外部中斷1
}while(TRUE);
while( input(PIN_E4)); //若按下S2鍵,則進入測試程序;
DAC7612U_test_program();
}
/*INTCON2: 7 RBPU 當RBPU=0時,端口B上拉使能位
6 INTEGE0 外部中斷0邊沿選擇位,當INTEGE0=1,表示上升沿觸發(fā);
5 INTEGE1 外部中斷1邊沿選擇位,當INTEGE1=1,表示上升沿觸發(fā);
4 INTEGE2 外部中斷2邊沿選擇位,當INTEGE2=1,表示上升沿觸發(fā);
3 INTEGE3 外部中斷3邊沿選擇位,當INTEGE3=1,表示上升沿觸發(fā);
2 TMROIP RMR0溢出中斷優(yōu)先權(quán)選擇位,當TMROIP=1時,TMR0有高優(yōu)先權(quán)中斷;
1 INT3IP 外部中斷3(INT3)中斷優(yōu)先權(quán)選擇位;
0 RBIP 端口B電平變化中斷優(yōu)先權(quán)選擇位;
INTCON3: 7 INT2IP 外部中斷2(INT2)中斷優(yōu)先權(quán)選擇位;
6 INT1IP 外部中斷1(INT1)中斷優(yōu)先權(quán)選擇位;
5 INT3IE 外部中斷3(INT3)中斷使能位;
4 INT2IE 外部中斷2(INT2)中斷使能位;
3 INT1IE 外部中斷1(INT1)中斷使能位;
2 INT3IF 外部中斷3(INT3)中斷標志位;
1 INT2IF 外部中斷2(INT2)中斷標志位;
0 INT1IF 外部中斷1(INT1)中斷標志位;
INTCON:7 GIE所有中斷允許位;
6 PEIE物理中斷允許位;
5 TMR0IE定時器0中斷允許位;
4 INT0IE外部中斷0允許位;
3 RBIE端口RB電平變化中斷允許位;
2 TMR0IF定時器0溢出標志位;
1 INT0IF外部中斷0的中斷標志位;
0 RBIF端口RB的RB4~RB7至少有一個產(chǎn)生中斷標志位;
PIR1: 7 PSPIF并口讀寫中斷標志位;
6 ADIF模擬轉(zhuǎn)換AD口中斷標志位;
5 RC1IF串口1接收中斷標志位;
4 TX1IF串口1發(fā)送中斷標志位;
3 SSPIF串行SPI口中斷標志位;
2 CCP1IF比較器1中斷標志位;
1 TMR2IF定時器2溢出標志位;
0 TNR1IF定時器1溢出標志位;
PIE1: 7 PSPIE并口讀寫中斷使能位;
6 ADIE模擬轉(zhuǎn)換AD口中斷使能位;
5 RC1IE串口1接收中斷使能位;
4 TX1IE串口1發(fā)送中斷使能位;
3 SSPIE串行SPI口中斷使能位;
2 CCP1IE比較器1中斷使能位;
1 TMR2IE定時器2溢出中斷使能位;
0 TMR1IE定時器1溢出中斷使能位;
PIR2: 7 未定義;
6 CMIF比較器中斷標志位;
5 未定義;
4 EEIF數(shù)據(jù)EEPROM或FLASH寫操作中斷標志位;
3 BCLIF總線沖突中斷標志位;
2 LVDIF低電壓檢測中斷標志位;
1 TM3IF定時器3溢出標志位;
0 CCP2IF比較器2中斷標志位;
PIE2 7 未定義;
6 CMIEF比較器中斷使能位;
5 未定義;
4 EEIE數(shù)據(jù)EEPROM或FLASH寫操作中斷使能位;
3 BCLIE總線沖突中斷使能位;
2 LVDIE低電壓檢測中斷使能位;
1 TMR3IE定時器3溢出中斷使能位;
0 CCP2IE比較器2中斷標使能位;
ADCON0 7 未定義;
6 未定義;
5 CHS3 選擇AD端口
4 CHS2 選擇AD端口
3 CHS1 選擇AD端口
2 CHS0 選擇AD端口
1 GO/DONE模擬轉(zhuǎn)換(AD)狀態(tài)位
0 ADON模擬轉(zhuǎn)換(AD)使能位
ADCON1 7 未定義;
6 未定義;
5 VCFG1 VCFG1:VCFG0=00表示Vref接VDD和VSS;VCFG1:VCFG0=01表示Vref接外部Vref+和VSS
4 VCFG0 VCFG1:VCFG0=10表示Vref接VDD和外部Vref-;VCFG1:VCFG0=11表示Vref接外部Vref+和Vref-
3 PCFG3配置為模擬端口還是數(shù)據(jù)端口?PCFG3:PCFG0=0000將所有配置為模擬端口;
2 PCFG2 PCFG0=0001除了AN15和AN14外,所有其它通道配置為模擬端口;
1 PCFG1
0 PCFG0
TRISA 端口A方向寄存器
LATF 端口F鎖存器
TRISF 端口A方向寄存器
*/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -