?? ch375451.asm
字號:
; CH375/CH372/CH451 EVT
; U2(AT89C51) Program
;
; Website: http://winchiphead.com
; Email: tech@winchiphead.com
; Author: W.ch 2003.12
;
;****************************************************************************
;
; 應用層定義
CONST_CMD_LEN EQU 07H ; 命令塊的長度
; 由于命令與數據都是通過數據下傳管道(USB端點2的OUT)下傳, 為了防止兩者混淆,
; 我們可以在計算機應用程序與單片機程序之間約定, 命令塊的長度總是7, 而數據塊的長度肯定不是7, 例如64,32等
; 另外, 可以約定, 命令塊的首字節是命令碼, 等等
DEMO_CH451_CMD EQU 56H ; PC發送命令給CH451
DEMO_TEST_DATA EQU 91H ; 測試命令,將PC機發來的命令包的所有數據取反后返回
DEMO_UP_CLEAR EQU 0A0H ; 連續上傳數據塊之前進行同步,實際是讓單片機清除上傳緩沖區的已有內容
DEMO_UP_DATA EQU 0A1H ; 連續上傳數據塊,指定外部RAM緩沖區起始地址,不限長度
DEMO_DOWN_DATA EQU 0A2H ; 連續下傳數據塊,指定外部RAM緩沖區起始地址,不限長度
;
STACK EQU 0FH ;堆棧區棧頂(向上延伸)
;
; CH375的命令代碼定義
$INCLUDE (..\..\MCU_IF1\MCS51ASM\CH375INC.ASM)
;
; 需要主程序定義的參數
CH375_CMD_PORT EQU 0BDF1H ;CH375命令口的地址,地址譯碼后自動片選
CH375_DAT_PORT EQU 0BCF0H ;CH375命令口的地址,地址譯碼后自動片選
;
; 有關CH451的定義
CH451_DCLK BIT P1.7 ;串行數據時鐘,上升沿激活
CH451_DIN BIT P1.6 ;串行數據輸出,接CH451的數據輸入
CH451_LOAD BIT P1.5 ;串行命令加載,上升沿激活
CH451_DOUT BIT P3.3 ;INT1,鍵盤中斷和鍵值數據輸入,接CH451的數據輸出
CH451_KEY DATA 28H ;存放鍵盤中斷中讀取的鍵值
LAST_KEY DATA 29H ;保存上次的鍵值
;
; 有關CH375的定義
CH451_CMD_H DATA 30H ;PC機發給CH451的高4位命令,為0FFH則命令無效
CH451_CMD_L DATA 31H ;PC機發給CH451的低8位命令
BUF_ADDR_L DATA 32H ;保存用于傳輸的外部RAM或者內部RAM緩沖區的地址,低8位
BUF_ADDR_H DATA 33H ;保存用于傳輸的外部RAM或者內部RAM緩沖區的地址,高8位
BUF_LEN_L DATA 34H ;當前剩余的要傳輸的數據長度,低8位
BUF_LEN_H DATA 35H ;當前剩余的要傳輸的數據長度,高8位
CMD_BUFFER DATA 38H ;命令包緩沖區,本程序約定命令包長度為CONST_CMD_LEN
CMD_BUFFER_NOT DATA 39H ;命令碼的反碼,用于校驗命令包
CMD_BUFFER_ID DATA 3AH ;命令包緩沖區次字節,緩沖區識別碼,針對MCS51單片機定義: 1-專用功能寄存器SFR, 2-內部RAM, 3-外部RAM, 不過本程序實際只演示內部RAM
CMD_BUFFER_ADRL DATA 3BH ;命令包緩沖區第3字節,緩沖區地址低8位
CMD_BUFFER_ADRH DATA 3CH ;命令包緩沖區第4字節,緩沖區地址高8位
CMD_BUFFER_LENL DATA 3DH ;命令包緩沖區第5字節,數據總長度低8位
CMD_BUFFER_LENH DATA 3EH ;命令包緩沖區第6字節,數據總長度高8位
; 由于MCS-51單片機存取外部RAM的讀寫速度低于內部RAM, 并且需要用到DPTR, 所以讀寫速度較慢, 其程序可以參考本程序修改
;
; 定義位標志
FLAG_INT_WAIT BIT 2FH.2 ;中斷等待標志,1指示有中斷數據正在CH375中等待發送
;
;
;****************************************************************************
;主程序,用于配合演示CH375和CH451功能
ORG 0000H ;復位后單片機入口
LJMP START
ORG 0003H ;CH375中斷
LJMP CH375_INTER
ORG 0013H ;CH451中斷,鍵盤中斷后將通知PC機應用層
LJMP CH451_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 R7,#0FFH
CALL DELAY_MS ;延時等待CH375初始化完成
; 初始化
CALL CH375_INIT ;初始化
CALL CH451_INIT ;初始化
; .....
; 啟動CH451的顯示驅動和鍵盤掃描
MOV B,#04H ;設置系統參數命令
MOV A,#03H ;禁止看門狗,使能鍵盤功能,使能顯示驅動
CALL CH451_WRITE ;發出命令
MOV B,#05H ;設置顯示參數
MOV A,#8CH ;BCD譯碼方式,12級亮度
CALL CH451_WRITE ;發出命令
MOV CH451_KEY,#0FFH ;清除按鍵代碼,在使能鍵盤前,CH451的DOUT輸出串行數據
MOV LAST_KEY,#0FFH ;有可能被當作鍵盤中斷請求INT1,所以要先清除
MOV CH451_CMD_H,#0FFH ;清除CH451的命令碼
; 由于在CH451啟動鍵盤功能前的串行輸出數據有可能產生鍵盤中斷,所以需要再次取消中斷
CLR IE1
SETB EA ;允許中斷
; ...
;
; 如果P2的第5腳和第6腳之間插上短路子則由單片機控制演示,否則由PC機通過USB控制進行演示
JB P3.5,WAIT_USB_REQ ;T1,由PC機通過USB演示
;
; 由單片機控制演示,等待按鍵,然后先左移原顯示,再加上按鍵值
MOV B,#0FH
MOV A,#17H ;向第1個數碼管加載數據'H'
CALL CH451_WRITE ;發出命令
MOV B,#0EH
MOV A,#0EH ;向第2個數碼管加載數據'E'
CALL CH451_WRITE ;發出命令
MOV B,#0DH
MOV A,#18H ;向第3個數碼管加載數據'L'
CALL CH451_WRITE ;發出命令
MOV B,#0CH
MOV A,#19H ;向第4個數碼管加載數據'P'
CALL CH451_WRITE ;發出命令
MOV B,#0BH
MOV A,#10H ;向第5個數碼管加載數據' '
CALL CH451_WRITE ;發出命令
MOV B,#0AH
MOV A,#14H ;向第6個數碼管加載數據'['
CALL CH451_WRITE ;發出命令
MOV B,#09H
MOV A,#88H ;向第7個數碼管加載數據'8.'
CALL CH451_WRITE ;發出命令
MOV B,#08H
MOV A,#15H ;向第8個數碼管加載數據']'
CALL CH451_WRITE ;發出命令
MOV B,#06H ;閃爍控制
MOV A,#30H ;第3個和第4個數碼管閃爍
CALL CH451_WRITE ;發出命令
; 以下演示為顯示按鍵代碼,并且左移
WAIT_KEY: MOV A,#0FFH
XCH A,CH451_KEY ;取按鍵值并清除原值
MOV R2,A
XRL A,#0FFH
JZ WAIT_KEY ;沒有按鍵
; 檢測到新按鍵則先左移顯示再顯示鍵值
MOV A,#00H ;左移一位
MOV B,#03H ;移位命令
CALL CH451_WRITE ;發出命令
MOV A,#00H ;左移一位
MOV B,#03H ;移位命令
CALL CH451_WRITE ;發出命令
MOV A,R2
ANL A,#3FH ;鍵值0-63
MOV B,#0AH
DIV AB ;A為鍵值的十位數
MOV B,#09H ;向第7個數碼管加載數據
CALL CH451_WRITE ;發出命令
MOV A,R2
ANL A,#3FH ;鍵值0-63
MOV B,#0AH
DIV AB
MOV A,B ;A為鍵值的個位數
MOV B,#08H ;向第8個數碼管加載數據
CALL CH451_WRITE ;發出命令
SJMP WAIT_KEY
;
; 以下指令開始工作循環,等待PC機命令進行操作
WAIT_USB_REQ: NOP
NOP
NOP ;其它事務
NOP
MOV A,CH451_CMD_H ;高4位命令
CJNE A,#0FFH,IS_CH451_CMD ;在CH375中斷服務程序中接收到PC機發給CH451的命令
; 沒有CH451的命令, 以下檢測按鍵狀態
; LAST_KEY和CH451_KEY兩個變量,都是0FFH則沒有鍵按下
; 僅CH451_KEY為有效鍵值則是鍵剛按下, 兩者都是有效鍵值并且相同則已經通知過計算機
MOV A,LAST_KEY
XRL A,#0FFH
JNZ IS_KEY_RELEASE ;按鍵已經按下并且已經通知過PC機,所以去檢測按鍵釋放
MOV A,CH451_KEY
XRL A,#0FFH
JZ WAIT_USB_REQ ;沒有鍵按下,主循環
MOV A,CH451_KEY
CLR C
SUBB A,#40H
JC WAIT_USB_REQ ;鍵碼無效
; 檢測到新的鍵鍵,則置入有效的中斷特征數據,以通知PC機應用層
MOV A,CH451_KEY
MOV LAST_KEY,A
MOV R0,#01H ;設定中斷特征數據01H,通知PC機的應用層,按鍵已按下
MOV R7,LAST_KEY ;中斷數據的次字節就是鍵碼,所以PC機應用層直接獲取鍵值,不必再讀取
CALL CH375_UP_INT2 ;上傳中斷數據,本程序用于鍵盤中斷,所以每次只需要傳輸兩字節
LJMP WAIT_USB_REQ ;主循環
IS_KEY_RELEASE: NOP
CALL CH451_READ ;重新讀取最近一次有效按鍵的鍵值
MOV CH451_KEY,A ;保存鍵值
XRL A,LAST_KEY
JZ WAIT_USB_REQ ;鍵碼相同,按鍵仍然沒有釋放
MOV R0,#02H ;設定中斷特征數據02H,通知PC機的應用層,按鍵已釋放
MOV R7,LAST_KEY ;中斷數據的次字節就是鍵碼,所以PC機應用層直接獲取鍵值
MOV LAST_KEY,#0FFH ;將要發送釋放信號給PC
CALL CH375_UP_INT2 ;上傳中斷數據
LJMP WAIT_USB_REQ ;主循環
; PC發送命令給CH451,由于主程序中的CH451_READ可能會被CH375的高優先級中斷,所以不宜在CH375中斷服務程序中執行
IS_CH451_CMD: NOP
MOV B,CH451_CMD_H ;高4位命令
MOV A,CH451_CMD_L ;低8位命令
MOV CH451_CMD_H,#0FFH ;清除原命令碼,防止重發
CALL CH451_WRITE ;向CH451發送命令
LJMP WAIT_USB_REQ ;主循環
;
;****************************************************************************
;
; 初始化子程序
; USE: ACC, R7, DPTR
CH375_INIT: CLR FLAG_INT_WAIT ;清中斷等待標志,1指示有中斷數據正在CH375中等待發送
; 測試CH375是否正常工作,可選操作
; MOV DPTR,#CH375_CMD_PORT ;命令口地址
; MOV A,#CMD_CHECK_EXIST
; MOVX @DPTR,A ;測試CH375是否正常工作,可選操作
; NOP ;如果時鐘頻率低于16MHz則無需該指令延時
; 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
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -