?? ch375blk.asm
字號:
; CH375/CH372 Bulk Data Test
; U2(AT89C51) Program
; 本程序測試數據傳輸的正確性, 并通過收發大數據塊來測試傳輸速度,
; 本程序適用于時鐘頻率不高于24MHz的標準MCS-51單片機, 如果高于24MHz則應該適當增加延時, 如果低于24MHz則可以適當減少延時
; 只要單片機允許, 盡量使用較高的時鐘, 例如將原12MHz晶振換為24MHz,
; 因為MCS51單片機自身速度較慢,讀寫外部RAM需要2個周期以及附加的循環指令,即使24MHz時鐘也無法超過500KB/S
; 為了減少單片機自身對速度測試的影響,本程序中速度測試部分在單片機中斷服務程序中完成
;
; Website: http://winchiphead.com
; Email: tech@winchiphead.com
; Author: W.ch 2003.09
;
;
; 需要主程序定義的參數
CH375_CMD_PORT EQU 0BDF1H ;CH375命令口的地址,地址譯碼后自動片選
CH375_DAT_PORT EQU 0BCF0H ;CH375命令口的地址,地址譯碼后自動片選
;
THIS_CMD_CODE DATA 3EH ;保存當前命令碼
RECV_LEN DATA 3FH ;剛接收到的數據的長度
RECV_BUFFER DATA 40H ;數據緩沖區,用于保存接收到的下傳數據,長度為0到64字節
; 由于MCS-51單片機存取外部RAM的讀寫速度低于內部RAM, 并且需要用到DPTR, 所以讀寫速度較慢, 其程序可以參考本程序修改
;
; 定義位標志
FLAG_RECV_OK BIT 2FH.0 ;接收成功標志,1指示成功接收到數據塊
FLAG_SEND_WAIT BIT 2FH.1 ;發送等待標志,1指示有數據塊正在CH375中等待發送
;
; CH375的命令代碼定義
$INCLUDE (..\..\MCU_IF1\MCS51ASM\CH375INC.ASM)
;
;****************************************************************************
;
; 應用層定義
;TEST_OTHER EQU 00H ;其它自定義的命令碼
TEST_START EQU 20H ;測試過程開始
TEST_DATA EQU 21H ;測試數據正確性
TEST_UPLOAD EQU 22H ;測試上傳數據塊
TEST_DOWNLOAD EQU 23H ;測試下傳數據塊
;
STACK EQU 0FH ;堆棧區棧頂(向上延伸)
;
; 有關CH451的定義
CH451_DCLK BIT P1.7 ;串行數據時鐘,上升沿激活
CH451_DIN BIT P1.6 ;串行數據輸出,接CH451的數據輸入
CH451_LOAD BIT P1.5 ;串行命令加載,上升沿激活
CH451_DOUT BIT P3.3 ;INT1,鍵盤中斷和鍵值數據輸入,接CH451的數據輸出
;
;****************************************************************************
;主程序,用于配合演示CH375
ORG 0000H ;復位后單片機入口
LJMP START
ORG 0003H ;CH375中斷
LJMP CH375_INTER
;
START:
; 以下初始化指令不是必要的,將單片機恢復為默認狀態
CLR EA ;關中斷
MOV SP,#STACK ;置堆棧初值
MOV A,#0FFH
MOV P0,A
MOV P1,A ;清端口狀態
MOV P2,A
MOV P3,A
CLR A
MOV IE,A ;清中斷允許控制寄存器
MOV IP,A ;清中斷優先級控制寄存器
MOV PSW,A ;清程序狀態字
MOV TCON,A ;清定時器/計數器控制寄存器
MOV TMOD,A ;清定時器/計數器工作方式寄存器
MOV PCON,A ;清電源控制寄存器
MOV THIS_CMD_CODE,#00H ;清除命令碼
MOV R7,#0FFH
CALL DELAY_MS ;延時等待CH375初始化完成
; 初始化
CALL CH375_INIT ;初始化
CALL CH451_INIT ;初始化
; .....
;
; 啟動CH451的顯示驅動
MOV B,#04H ;設置系統參數命令
MOV A,#01H ;使能顯示驅動
CALL CH451_WRITE ;發出命令
MOV B,#05H ;設置顯示參數
MOV A,#88H ;BCD譯碼方式,8級亮度
CALL CH451_WRITE ;發出命令
MOV R6,#08H
MOV R5,#08H
MOV R4,#01H
SHOW_INIT: MOV B,R5
MOV A,R4
INC R5
INC R4
CALL CH451_WRITE ;顯示字符
DJNZ R6,SHOW_INIT
;
SETB EA ;允許中斷
SETB TR0 ;由定時器0自由計數值產生隨機數
;
; 以下指令開始工作循環,等待PC機命令進行操作
WAIT_REQUEST: NOP
JNB FLAG_RECV_OK,WAIT_REQUEST ;等待下傳數據
CLR FLAG_RECV_OK
MOV A,RECV_LEN ;分析下傳數據并準備應答
JZ WAIT_REQUEST ;長度為0,在本程序中沒有意義
; MOV R0,#RECV_BUFFER ;剛接收到的數據塊
; MOV R7,RECV_LEN ;剛接收到的數據長度
; MOV A,@R0 ;我們在計算機和單片機的應用程序之間約定下傳數據的首字節是命令碼
; CJNE A,#TEST_OTHER,WAIT_REQUEST ;自定義的命令碼,其它測試命令已經在中斷服務程序中處理掉了
; NOP ;其它命令,分析后準備應答
; MOV R0,#SEND_BUFFER ;指向準備上傳的數據的緩沖區
; MOV R7,SEND_LEN ;準備上傳的數據的長度
; CALL CH375_UPLOAD ;上傳數據塊子程序(通過批量端點上傳)
MOV B,#03H ;移位命令
MOV A,#00H ;左移一位
CALL CH451_WRITE ;發出命令使CH451顯示左移一位
SJMP WAIT_REQUEST ;等待下一個請求
;
; 以毫秒為單位延時
; ENTRY: R7 延時毫秒數
; USE: ACC, R7
DELAY_MS: MOV A,#0FAH ;250*(1*6+2)*0.5=1000uS
DELAY_1MS: NOP
NOP
NOP
NOP
NOP
NOP
DJNZ ACC,DELAY_1MS ;每周期延時1毫秒
DJNZ R7,DELAY_MS
RET
;
; 初始化子程序
CH451_INIT: CLR CH451_DIN ;先低后高,輸出上升沿通知CH451選擇4線串行接口
SETB CH451_DCLK ;置為默認的高電平
SETB CH451_DIN
SETB CH451_LOAD
SETB CH451_DOUT ;置為輸入
CLR EX1 ;禁止中斷
RET
;
;
; 輸出命令子程序
; ENTRY: B-ACC 待寫的12位數據, 低8位在ACC中, 高4位在B的低4位中
; USE: ACC, B, R7
CH451_WRITE: CLR CH451_LOAD ;命令開始,此命令可以放在后面
MOV R7,#08H ;將ACC中8位送出
CH451_WRITE_8: RRC A ;低位在前,高位在后
CLR CH451_DCLK
MOV CH451_DIN,C ;送出一位數據
SETB CH451_DCLK ;產生時鐘上升沿通知CH451輸入位數據
DJNZ R7,CH451_WRITE_8 ;位數據未完繼續
MOV A,B
MOV R7,#04H ;將B中4位送出
CH451_WRITE_4: RRC A ;低位在前,高位在后
CLR CH451_DCLK
MOV CH451_DIN,C ;送出一位數據
SETB CH451_DCLK ;產生時鐘上升沿通知CH451輸入位數據
DJNZ R7,CH451_WRITE_4 ;位數據未完繼續
SETB CH451_LOAD ;產生加載上升沿通知CH451處理命令數據
RET
;
;
;****************************************************************************
;
; 初始化子程序
; USE: ACC, R7, DPTR
CH375_INIT: CLR FLAG_RECV_OK ;清接收成功標志,1指示成功接收到數據塊
CLR FLAG_SEND_WAIT ;清發送等待標志,1指示有數據塊正在CH375中等待發送
; 測試CH375是否正常工作,可選操作
; MOV DPTR,#CH375_CMD_PORT ;命令口地址
; MOV A,#CMD_CHECK_EXIST
; MOVX @DPTR,A ;測試CH375是否正常工作,可選操作
; NOP ;如果時鐘頻率低于16MHz則無需該指令延時,高于30MHz要多加2條指令
; MOV DPTR,#CH375_DAT_PORT ;數據口地址
; MOV A,#55H
; MOVX @DPTR,A ;寫入測試數據
; CPL A
; MOV R7,A ;取反數據
; MOVX A,@DPTR ;返回數據應該是測試數據取反
; XRL A,R7
; JZ CH375_INIT_OK ;測試通過
; MOV DPTR,#CH375_CMD_PORT ;命令口地址
; MOV A,#CMD_RESET_ALL
; MOV R7,#50H ;多次重復發命令
;CH375_INIT_HR: MOVX @DPTR,A ;執行硬件復位
; DJNZ R7,CH375_INIT_HR
; MOV R7,#0A0H ;160*256uS=40mS
;CH375_INIT_D2: CLR A
;CH375_INIT_D1: DJNZ ACC,CH375_INIT_D1 ;延時1uS
; DJNZ R7,CH375_INIT_D2 ;延時256uS
; SJMP CH375_INIT ;再次測試
;CH375_INIT_OK:
; 設置外部自定義的USB設備VID和PID,可選操作,不執行該命令則使用默認的VID和PID
; MOV DPTR,#CH375_CMD_PORT ;命令口地址
; MOV A,#CMD_SET_USB_ID
; MOVX @DPTR,A ;設置外部自定義的USB設備VID和PID,可選操作
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -