?? ch375hft.asm
字號:
; /* 2004.06.05
; ****************************************
; ** Copyright (C) W.ch 1999-2004 **
; ** Web: http://www.winchiphead.com **
; ****************************************
; ** USB Host File Interface for CH375 **
; ** TC2.0@PC, KC7.0@MCS51 **
; ****************************************
; */
; /* CH375 主機文件系統接口 */
; /* 支持: FAT12/FAT16 */
;
; /* MCS-51單片機ASM語言的U盤文件讀寫示例程序, 適用于89C52或者更大程序空間的單片機 */
; /* 該程序將U盤中的/C51/CH375HFT.C文件中的小寫字母轉成大寫字母后, 寫到新建的文件NEWFILE.TXT中,
; 如果找不到原文件CH375HFT.C, 那么該程序新建NEWFILE.TXT文件并寫入提示信息
; 另外,本例還演示以字節為單位讀取U盤中的/C51/CH375HFT.C文件, 讀寫速度較前面的扇區模式慢,
; 但是由于字節模式讀寫文件不需要文件數據緩沖區FILE_DATA_BUF, 所以總共只需要600字節的RAM,
; 適用于單片機硬件資源有限、數據量小并且讀寫速度要求不高的系統
; */
; /* CH375的INT#引腳采用查詢方式處理, 數據復制方式為"單DPTR復制", 所以速度較慢, 適用于所有MCS51單片機 */
;
; /* A51 CH375HFT.ASM */
; /* LX51 CH375HFT.OBJ , CH375HF4.LIB 如果將CH375HF4換成CH375HF6就可以支持FAT32 */
; /* OHX51 CH375HFT */
;
LIB_CFG_VALUE EQU 05H ; CH375程序庫配置
; 位7: CH375的INT#引腳連接方式: 0查詢方式,1中斷方式 */
; 位5: 在寫操作結束后是否延時: 0寫后延時,1不延時 */
; 位3位2: 針對文件讀寫的多扇區數據的復制方式: 00外部子程序, 01單DPTR復制, 10雙DPTR復制, 11單DPTR和P2+R0復制 */
; 位1位0: 針對磁盤讀寫的單扇區數據的復制方式: 00單DPTR復制, 01單DPTR復制, 10雙DPTR復制, 11單DPTR和P2+R0復制 */
CH375_CMD_PORT_ADDR EQU 0BDF1H ; CH375命令端口的I/O地址 */
CH375_DAT_PORT_ADDR EQU 0BCF0H ; CH375數據端口的I/O地址 */
DISK_BASE_BUF_ADDR EQU 0000H ; 外部RAM的磁盤數據緩沖區的起始地址,從該單元開始的緩沖區長度為SECTOR_SIZE */
FILE_DATA_BUF_ADDR EQU 0200H ; 外部RAM的文件數據緩沖區的起始地址,緩沖區長度不小于一次讀寫的數據長度 */
#define FILE_DATA_BUF_LEN FILE_DATA_BUF_LEN
FILE_DATA_BUF_LEN EQU 7E00H ; 外部RAM的文件數據緩沖區,緩沖區長度不小于一次讀寫的數據長度 */
; 如果準備使用雙緩沖區交替讀寫,那么不要定義FILE_DATA_BUF_LEN,而是在參數中指定緩沖區起址,用CH375FileReadX代替CH375FileRead,用CH375FileWriteX代替CH375FileWrite */
CH375_INT_WIRE EQU INT0 ; P3.2, INT0, CH375的中斷線INT#引腳,連接CH375的INT#引腳,用于查詢中斷狀態 */
$INCLUDE (..\CH375HF4.INC) ; ASM頭文件,常用定義
; 應用程序段定義
MY_CODE SEGMENT CODE
MY_DATA SEGMENT DATA
;/* 在P1.4連接一個LED用于監控演示程序的進度,低電平LED亮,當U盤插入后亮 */
;sbit P1_4 = P1^4;
LED_OUT EQU P1.4
;#define LED_OUT_INIT( ) { P1_4 = 1; } /* P1.4 高電平 */
;#define LED_OUT_ACT( ) { P1_4 = 0; } /* P1.4 低電平驅動LED顯示 */
;#define LED_OUT_INACT( ) { P1_4 = 1; } /* P1.4 低電平驅動LED顯示 */
;sbit P1_5 = P1^5;
LED_RUN EQU P1.5
;/* 在P1.5連接一個LED用于監控演示程序的進度,低電平LED亮,當對U盤操作時亮 */
;#define LED_RUN_ACT( ) { P1_5 = 0; } /* P1.5 低電平驅動LED顯示 */
;#define LED_RUN_INACT( ) { P1_5 = 1; } /* P1.5 低電平驅動LED顯示 */
;sbit P1_6 = P1^6;
LED_WR EQU P1.6
;/* 在P1.6連接一個LED用于監控演示程序的進度,低電平LED亮,當對U盤寫操作時亮 */
;#define LED_WR_ACT( ) { P1_6 = 0; } /* P1.6 低電平驅動LED顯示 */
;#define LED_WR_INACT( ) { P1_6 = 1; } /* P1.6 低電平驅動LED顯示 */
; 復位和中斷向量
CSEG AT 0000H
LJMP ASM_MAIN ; 單片機復位后的主程序入口
; CSEG AT 0003H ; INT0中斷向量
; LJMP InterruptHandle ; CH375的中斷服務程序,如果使用"中斷方式"則需根據中斷引腳修改向量
; 應用程序中用到的變量,只定義大小,不指定地址,由鏈接程序自動分配地址
RSEG MY_DATA
SecCount: DS 1
NewSize: DS 2
; 應用程序中用到的常量,只定義大小,不指定地址,由鏈接程序自動分配地址
RSEG MY_CODE
SOURCE_NAME: DB '\C51\CH375HFT.C',00H
INFO_MISS_FILE: DB '找不到/C51/CH375HFT.C文件',0DH,0AH,00H
NEW_NAME: DB '\NEWFILE.TXT',00H
NEW_NAME_2: DB '\MY_FILE2.TXT',00H
DATA_FOR_FILE2: DB 'OK! 這是寫到新文件中的',0DH,0AH,00H
; 應用程序代碼,不指定地址,由鏈接程序自動分配地址
RSEG MY_CODE
;
; 延時100毫秒,不精確 */
mDelay100mS: MOV R7,#0C8H
mDelay100mS_next: MOV R6,#0C8H
mDelay100mS_loop: NOP
NOP
DJNZ R6,mDelay100mS_loop
DJNZ R7,mDelay100mS_next
RET
;
; 將程序空間的字符串復制到內部RAM中 */
; 入口: R0 指向內部RAM的目的地址, DPTR 指向程序空間的字符串源地址
_mCopyStringToIRAM: CLR A
MOVC A,@A+DPTR
INC DPTR
MOV @R0,A
INC R0
JNZ _mCopyStringToIRAM
RET
;
; 檢查操作狀態,如果錯誤則停機,實際應用程序需要另作處理
_mStopIfError: MOV A,R7
JNZ ERROR_FOUND ; 錯誤
RET ; 操作成功則返回
ERROR_FOUND: CLR LED_OUT ; LED閃爍顯示
LCALL mDelay100mS
SETB LED_OUT
LCALL mDelay100mS
SJMP ERROR_FOUND
;
; 應用程序主程序, 僅作演示
ASM_MAIN: MOV SP,#0CFH ; 堆棧
CLR LED_OUT ; 開機后LED亮一下以示工作
LCALL mDelay100mS
SETB LED_OUT
LCALL CH375LibInit ; 初始化CH375程序庫和CH375芯片
LCALL _mStopIfError
; 主循環, 等待U盤插入并處理, 實際上單片機可以做其它事, 當需要讀寫U盤時再查詢U盤狀態
WAIT_DISK_IN: MOV A,CH375DiskStatus ; 查詢CH375中斷并更新中斷狀態,等待U盤插入 */
XRL A,#DISK_CONNECT
JZ DISK_IN_NOW ; U盤已經插入
LCALL xQueryInterrupt
SJMP WAIT_DISK_IN
DISK_IN_NOW: CLR LED_OUT ; LED亮
LCALL mDelay100mS ; 延時,可選操作,有的USB存儲器需要幾十毫秒的延時 */
LCALL mDelay100mS
; 檢查U盤是否準備好,大多數U盤不需要這一步,但是某些U盤必須要執行這一步才能工作
MOV SecCount,#0AH
IS_DISK_READY: LCALL mDelay100mS
LCALL CH375DiskReady ; 查詢磁盤是否準備好
MOV A,R7
XRL A,#ERR_SUCCESS
JZ DISK_READY_OK ;準備好了
DJNZ SecCount,IS_DISK_READY ; 繼續等待,有的U盤總是返回未準備好,不過可以被忽略
DISK_READY_OK: NOP
CLR LED_RUN ; 開始操作U盤
; 打開原文件\C51\CH375HFT.C
MOV R0,#LOW (mCmdParam) ; 命令參數,mCmdParam.Open.mPathName
MOV DPTR,#SOURCE_NAME ; 指向原文件名,該文件在C51子目錄下
LCALL _mCopyStringToIRAM ; 復制文件名作為調用子程序的參數
LCALL CH375FileOpen ; 打開文件
MOV A,R7
XRL A,#ERR_MISS_DIR
JZ DIR_NOT_FOUND ; C51子目錄不存在
MOV A,R7
XRL A,#ERR_MISS_FILE
JZ FILE_NOT_FOUND ; CH375HFT.C文件不存在
LCALL _mStopIfError
SJMP FOUND_SOURCE_FILE ; 找到文件\C51\CH375HFT.C
; 沒有找到原文件
DIR_NOT_FOUND:
FILE_NOT_FOUND: MOV R7,#00H
MOV DPTR,#FILE_DATA_BUF ; 向文件緩沖區復制默認的提示信息作為新文件的內容
COPY_INFO_CHAR: PUSH DPL
PUSH DPH
MOV DPTR,#INFO_MISS_FILE ; 在沒有找到原文件時的錯誤提示信息
MOV A,R7
MOVC A,@A+DPTR
POP DPH
POP DPL
MOVX @DPTR,A ; 將提示信息作為新文件的內容
INC DPTR
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -