?? para_sw.c
字號:
/* CH374芯片 軟件模擬8位并口連接的硬件抽象層 V1.0 */
/* 提供I/O接口子程序,提供寄存器級讀寫子程序 */
#include "HAL.H"
/* 本例中的硬件連接方式如下(實際應用電路可以參照修改下述定義及子程序) */
/* 單片機的引腳 CH374芯片的引腳
P2.0 A0
P2.6 CS# 如果模擬出的并口上只有CH374,那么CS#可以直接接低電平,強制片選
P3.6 WR#
P3.7 RD#
P0(8位端口) D7-D0 */
sbit CH374_A0 = P2^0;
sbit CH374_CS = P2^6;
sbit CH374_WR = P3^6;
sbit CH374_RD = P3^7;
#define CH374_DATA_DAT_OUT( d ) { P0 = d; } /* 向并口輸出數據 */
#define CH374_DATA_DAT_IN( ) ( P0 ) /* 從并口輸入數據 */
#define CH374_DATA_DIR_OUT( ) /* 設置并口方向為輸出 */
#define CH374_DATA_DIR_IN( ) { P0 = 0xFF; } /* 設置并口方向為輸入 */
void CH374_PORT_INIT( ) /* 由于使用通用I/O模擬并口讀寫時序,所以進行初始化 */
{
CH374_CS = 1;
CH374_WR = 1;
CH374_RD = 1;
CH374_A0 = 0;
CH374_DATA_DIR_IN( ); /* 設置并口輸入 */
}
void Write374Index( UINT8 mIndex ) /* 向CH374寫索引地址 */
{
CH374_DATA_DAT_OUT( mIndex ); /* 向CH374的并口輸出數據 */
CH374_DATA_DIR_OUT( ); /* 設置并口方向為輸出 */
CH374_A0 = 1;
CH374_CS = 0;
CH374_WR = 0; /* 輸出有效寫控制信號, 寫CH374芯片的索引端口 */
// CH374_CS = 0; /* 該操作無意義,僅作延時,CH374要求讀寫脈沖寬度大于70nS */
CH374_WR = 1; /* 輸出無效的控制信號, 完成操作CH374芯片 */
CH374_CS = 1;
CH374_A0 = 0;
CH374_DATA_DIR_IN( ); /* 禁止數據輸出 */
}
void Write374Data( UINT8 mData ) /* 向CH374寫數據,索引地址自動加1 */
{
CH374_DATA_DAT_OUT( mData ); /* 向CH374的并口輸出數據 */
CH374_DATA_DIR_OUT( ); /* 設置并口方向為輸出 */
CH374_A0 = 0;
CH374_CS = 0;
CH374_WR = 0; /* 輸出有效寫控制信號, 寫CH374芯片的數據端口 */
// CH374_CS = 0; /* 該操作無意義,僅作延時,CH374要求讀寫脈沖寬度大于70nS */
CH374_WR = 1; /* 輸出無效的控制信號, 完成操作CH374芯片 */
CH374_CS = 1;
CH374_DATA_DIR_IN( ); /* 禁止數據輸出 */
}
UINT8 Read374Data( void ) /* 從CH374讀數據,索引地址自動加1 */
{
UINT8 mData;
CH374_DATA_DIR_IN( ); /* 設置并口方向為輸入 */
CH374_A0 = 0;
CH374_CS = 0;
CH374_RD = 0; /* 輸出有效寫控制信號, 讀CH374芯片的數據端口 */
CH374_CS = 0; /* 該操作無意義,僅作延時,CH374要求讀寫脈沖寬度大于70nS,強烈建議此處執行一條空指令延時以確保并口有足夠時間輸入數據 */
mData = CH374_DATA_DAT_IN( ); /* 從CH374的并口輸入數據 */
CH374_RD = 1; /* 輸出無效的控制信號, 完成操作CH374芯片 */
CH374_CS = 1;
return( mData );
}
UINT8 Read374Data0( void ) /* 從索引端口讀出數據,索引地址不變,適用于[讀出->修改->寫回]操作 */
{
UINT8 mData;
CH374_DATA_DIR_IN( ); /* 設置并口方向為輸入 */
CH374_A0 = 1;
CH374_CS = 0;
CH374_RD = 0; /* 輸出有效寫控制信號, 讀CH374芯片的索引端口 */
CH374_CS = 0; /* 該操作無意義,僅作延時,CH374要求讀寫脈沖寬度大于70nS,強烈建議此處執行一條空指令延時以確保并口有足夠時間輸入數據 */
mData = CH374_DATA_DAT_IN( ); /* 從CH374的并口輸入數據 */
CH374_RD = 1; /* 輸出無效的控制信號, 完成操作CH374芯片 */
CH374_CS = 1;
CH374_A0 = 0;
return( mData );
}
UINT8 Read374Byte( UINT8 mAddr ) /* 從指定寄存器讀取數據 */
{
Write374Index( mAddr );
return( Read374Data( ) );
}
void Write374Byte( UINT8 mAddr, UINT8 mData ) /* 向指定寄存器寫入數據 */
{
Write374Index( mAddr );
Write374Data( mData );
}
void Modify374Byte( UINT8 mAddr, UINT8 mAndData, UINT8 mOrData ) /* 修改指定寄存器的數據,先與再或,比Write374Byte再Read374Byte效率高 */
{
Write374Index( mAddr );
Write374Data( Read374Data0( ) & mAndData | mOrData );
}
void Read374Block( UINT8 mAddr, UINT8 mLen, PUINT8 mBuf ) /* 從指定起始地址讀出數據塊 */
{
Write374Index( mAddr );
while ( mLen -- ) *mBuf++ = Read374Data( );
}
void Write374Block( UINT8 mAddr, UINT8 mLen, PUINT8 mBuf ) /* 向指定起始地址寫入數據塊 */
{
Write374Index( mAddr );
while ( mLen -- ) Write374Data( *mBuf++ );
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -