我用c8051f340單片機(jī)驅(qū)動(dòng)ch375,用的是LIB5,但是連ch375初始化都不成功,是不是因?yàn)閱纹瑱C(jī)速度過快,應(yīng)該怎么修改呀 附程序: sbit DAT=P3^1; sbit test=P1^7; sbit CH375_CS = P2^5; sbit CH375_WR = P2^6; sbit CH375_RD = P2^1; sbit CH375_A0 = P1^6; sbit oe=P1^6; //sbit RST=P4^2; UINT8 changenumber; UINT8 xdata time[14]; UINT8 xdata timercur[7]; UINT8 xdata *p; UINT8 Error; UINT8 *result;
//UINT8 i,j,k,m; sbit ACC0=ACC^0; sbit ACC7=ACC^7;
void menu1(); void readtime(void); void BCD_to_INT(); void displaytimeset(); void deleteGLUsers(); void menu2(void); void DelUsers(); void AddUsers(); void DelUsers(void); bit ISendByte16(UINT8 sla,UINT16 suba,UINT8 c); bit IRcvByte16(UINT8 sla,UINT16 suba,UINT8 *c); void ChangeUsers_del(UINT8 xdata i); void COMSendUINT8(UINT8 command,UINT8 param,UINT8 size,UINT8 flag); void COMWriteByte(unsigned char kk); void ChangeEdit(UINT8 ii);//主菜單1選擇菜單 void menu1(); void deleteGLUsers(); void display_26(); void delay(void); UINT8 KeyScan(void); ////////////////////////////////////////////////////////////// #define MAX_BYTE_IO 35 /* 以字節(jié)為單位單次讀寫文件時(shí)的最大長度,默認(rèn)值是29,值大則占用內(nèi)存多,值小則超過該長度必須分多次讀寫 */
/* 以下定義的詳細(xì)說明請看CH375HF5.H文件 */ #define LIB_CFG_FILE_IO 1 /* 文件讀寫的數(shù)據(jù)的復(fù)制方式,0為"外部子程序",1為"內(nèi)部復(fù)制" */ #define LIB_CFG_INT_EN 0 /* CH375的INT#引腳連接方式,0為"查詢方式",1為"中斷方式" */ /*#define LIB_CFG_UPD_SIZE 1*/ /* 在添加數(shù)據(jù)后是否自動(dòng)更新文件長度: 0為"不更新",1為"自動(dòng)更新" */ /* 默認(rèn)情況下,如果扇區(qū)數(shù)/字節(jié)數(shù)不為0那么CH375FileWrite/CH375ByteWrite只負(fù)責(zé)寫入數(shù)據(jù)而不修改文件長度, 如果需要每次寫完數(shù)據(jù)后會(huì)自動(dòng)修改/更新文件長度,那么可以使全局變量CH375LibConfig的位4為1, 如果長時(shí)間不寫入數(shù)據(jù)則應(yīng)該更新文件長度,防止突然斷電后前面寫入的數(shù)據(jù)與文件長度不相符, 如果確定不會(huì)突然斷電或者后面很快有數(shù)據(jù)不斷寫入則不必更新文件長度,可以提高速度并減少U盤損耗(U盤內(nèi)部的內(nèi)存壽命有限,不宜頻繁改寫) */
/* 只使用單片機(jī)內(nèi)置的1KB外部RAM: 0000H-01FFH 為磁盤讀寫緩沖區(qū), 以字節(jié)為單位讀寫文件不需要文件數(shù)據(jù)讀寫緩沖區(qū)FILE_DATA_BUF */ #define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盤數(shù)據(jù)緩沖區(qū)的起始地址,從該單元開始的緩沖區(qū)長度為SECTOR_SIZE */ #define FILE_DATA_BUF_ADDR 0x0000 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū)的起始地址,緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度,字節(jié)模式不用該緩沖區(qū) */ /* 由于單片機(jī)內(nèi)置的外部RAM只有1KB, 有些單片機(jī)還要去掉256字節(jié)內(nèi)部RAM, 只剩下768字節(jié)的外部RAM, 其中前512字節(jié)由CH375子程序用于磁盤數(shù)據(jù)緩沖 */ #define FILE_DATA_BUF_LEN 0x0200 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū),緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度,字節(jié)模式不用該緩沖區(qū) */
#define CH375_INT_WIRE INT0 /* P3.2, INT0, CH375的中斷線INT#引腳,連接CH375的INT#引腳,用于查詢中斷狀態(tài) */
#define NO_DEFAULT_CH375_F_ENUM 1 /* 未調(diào)用CH375FileEnumer程序故禁止以節(jié)約代碼 */ #define NO_DEFAULT_CH375_F_QUERY 1 /* 未調(diào)用CH375FileQuery程序故禁止以節(jié)約代碼 */
#include "..\CH375HF5.H"
/* 在P1.4連接一個(gè)LED用于監(jiān)控演示程序的進(jìn)度,低電平LED亮,當(dāng)U盤插入后亮 */ sbit P1_4 = P1^4; #define LED_OUT_INIT( ) { P1_4 = 1; } /* P1.4 高電平 */ #define LED_OUT_ACT( ) { P1_4 = 0; } /* P1.4 低電平驅(qū)動(dòng)LED顯示 */ #define LED_OUT_INACT( ) { P1_4 = 1; } /* P1.4 低電平驅(qū)動(dòng)LED顯示 */ sbit P1_5 = P1^5; /* 在P1.5連接一個(gè)LED用于監(jiān)控演示程序的進(jìn)度,低電平LED亮,當(dāng)對U盤操作時(shí)亮 */ #define LED_RUN_ACT( ) { P1_5 = 0; } /* P1.5 低電平驅(qū)動(dòng)LED顯示 */ #define LED_RUN_INACT( ) { P1_5 = 1; } /* P1.5 低電平驅(qū)動(dòng)LED顯示 */ sbit P1_6 = P1^6; /* 在P1.6連接一個(gè)LED用于監(jiān)控演示程序的進(jìn)度,低電平LED亮,當(dāng)對U盤寫操作時(shí)亮 */ #define LED_WR_ACT( ) { P1_6 = 0; } /* P1.6 低電平驅(qū)動(dòng)LED顯示 */ #define LED_WR_INACT( ) { P1_6 = 1; } /* P1.6 低電平驅(qū)動(dòng)LED顯示 */ void mDelay100mS( ); /* 本例用I/O引腳模擬產(chǎn)生CH375的并口讀寫時(shí)序 */ /* 本例中的硬件連接方式如下(實(shí)際應(yīng)用電路可以參照修改下述3個(gè)并口讀寫子程序) */ /* 單片機(jī)的引腳 CH375芯片的引腳 P3.2 INT# P1.0 A0 P1.1 CS# 如果模擬出的并口上只有CH375,那么CS#可以直接接低電平,強(qiáng)制片選 P1.2 WR# P1.3 RD# P0(8位端口) D7-D0 */
void mDelay1_2uS( ) /* 至少延時(shí)1.2uS,根據(jù)單片機(jī)主頻調(diào)整 */ { mDelay100mS( ); return; }
void CH375_PORT_INIT( ) /* 由于使用通用I/O模塊并口讀寫時(shí)序,所以進(jìn)行初始化 */ { delay(); CH375_CS = 1; delay(); CH375_WR = 1; delay(); CH375_RD = 1; delay(); CH375_A0 = 0; delay(); P0 = 0xFF; /* 并口輸入 */ delay(); }
void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫命令 */ { delay(); mDelay100mS( ); mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延時(shí)1uS */ delay(); P0 = mCmd; /* 向CH375的并口輸出數(shù)據(jù) */ delay(); CH375_A0 = 1; delay(); CH375_CS = 0; delay(); CH375_WR = 0; /* 輸出有效寫控制信號, 寫CH375芯片的命令端口 */ delay(); CH375_CS = 0; /* 該操作無意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100nS */ delay(); CH375_WR = 1; /* 輸出無效的控制信號, 完成操作CH375芯片 */ delay(); CH375_CS = 1; delay(); CH375_A0 = 0; delay(); P0 = 0xFF; /* 禁止數(shù)據(jù)輸出 */ delay(); mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延時(shí)2uS */ mDelay100mS( ); delay(); }
void xWriteCH375Data( UINT8 mData ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫數(shù)據(jù) */ { delay(); P0 = mData; /* 向CH375的并口輸出數(shù)據(jù) */ delay(); CH375_A0 = 0; delay(); CH375_CS = 0; delay(); CH375_WR = 0; /* 輸出有效寫控制信號, 寫CH375芯片的數(shù)據(jù)端口 */ delay(); CH375_CS = 0; /* 該操作無意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100nS */ delay(); CH375_WR = 1; /* 輸出無效的控制信號, 完成操作CH375芯片 */ delay(); CH375_CS = 1; delay(); P0 = 0xFF; /* 禁止數(shù)據(jù)輸出 */ delay(); mDelay1_2uS( ); /* 至少延時(shí)1.2uS */ }
UINT8 xReadCH375Data( void ) /* 外部定義的被CH375程序庫調(diào)用的子程序,從CH375讀數(shù)據(jù) */ { UINT8 mData; delay(); mDelay1_2uS( ); /* 至少延時(shí)1.2uS */ delay(); P0 = 0xFF; /* 輸入 */ delay(); CH375_A0 = 0; delay(); CH375_CS = 0; delay(); CH375_RD = 0; /* 輸出有效寫控制信號, 讀CH375芯片的數(shù)據(jù)端口 */ delay(); CH375_CS = 0; /* 該操作無意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100nS */ delay(); mData = P0; /* 從CH375的并口輸入數(shù)據(jù) */ delay(); CH375_RD = 1; /* 輸出無效的控制信號, 完成操作CH375芯片 */ delay(); CH375_CS = 1; delay(); return( mData ); }
/* 如果單片機(jī)與CH375是串口連接,那么參考下面的子程序 void CH375_PORT_INIT( ) { SCON = 0xD0; 設(shè)置串口為9位數(shù)據(jù) 設(shè)置波特率和其它串口參數(shù) }
void xWriteCH375Cmd( UINT8 mCmd ) { TI = 0; TB8 = 1; SBUF = mCmd; while ( TI == 0 ); }
void xWriteCH375Data( UINT8 mData ) { TI = 0; TB8 = 0; SBUF = mData; while ( TI == 0 ); }
UINT8 xReadCH375Data( void ) { while ( RI == 0 ); RI = 0; return( SBUF ); } */
/* 延時(shí)100毫秒,不精確 */ void mDelay100mS( ) { UINT8 i, j, c; for ( i = 200; i != 0; i -- ) for ( j = 200; j != 0; j -- ) c+=3; }
/* 將程序空間的字符串復(fù)制到內(nèi)部RAM中,返回字符串長度 */ UINT8 mCopyCodeStringToIRAM( UINT8 idata *iDestination, UINT8 code *iSource ) { UINT8 i = 0; while ( *iDestination = *iSource ) { iDestination ++; iSource ++; i ++; } return( i ); }
/* 檢查操作狀態(tài),如果錯(cuò)誤則顯示錯(cuò)誤代碼并停機(jī) */ void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ printf( "Error: %02X\n", (UINT16)iError ); /* 顯示錯(cuò)誤 */ while ( 1 ) { LED_OUT_ACT( ); /* LED閃爍 */ mDelay100mS( ); LED_OUT_INACT( ); mDelay100mS( ); } } void delay(void)//延時(shí)程序 { UINT8 j,i; i=0; // while(i<30) while(i<10) { j=0; while(j<10) { j++; } i++; } } /* 為printf和getkey輸入輸出初始化串口 */ void Reset() //液晶復(fù)位 { //reset 低復(fù)位 _|- reset=0; delay(); delay(); //_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); reset=1; } void main( ) { UINT8 k; UINT8 i, month, hour; UINT16 date, adc, len; PCA0MD &= ~0x40; //關(guān)閉看門狗 OSCICN