📄 ch372.asm
字号:
CODE SEGMENT
ASSUME CS:CODE
CH372_DATA EQU 0000H
CH372_CMD EQU 0001H
DISPDATA EQU 0520H
DISPDATA1 EQU 0528H
BUFFER EQU 0500H
ADRESS_L EQU 0502H
ADRESS_H EQU 0503H
CHANGDU_L EQU 0504H
CHANGDU_H EQU 0505H
CMD_FLAG EQU 0506H
COUNT EQU 0507H
DN_COUNT EQU 0508H
CMD_BUFFER EQU 0510H
CONTPORT EQU 00DFH
DATAPORT EQU 00DEH
INTPORT1 EQU 0020H
INTPORT2 EQU 0021H
INTQ0 EQU INTREEUP0
ORG 1000H
START: JMP Tint2
Tint2: CLI
;*************************
MOV AX,0H
MOV DS,AX
CALL WRINTVER ;WRITE INTRRUPT
MOV AL,1bH
MOV DX,INTPORT1
OUT DX,AL ; ICW1=13
MOV AL,08H ;ICW2=08
MOV DX,INTPORT2
OUT DX,AL
MOV AL,09H ;ICW4=09
OUT DX,AL
MOV AL,0FEH ;OCW1=FE
OUT DX,AL
MOV CX,01FFH
LOOP $
CALL FORMAT
CALL LEDDISP
MOV BYTE PTR DS:[CMD_FLAG],00H
MOV BYTE PTR DS:[COUNT],00H
MOV WORD PTR DS:[DN_COUNT],00H
CALL CH372 ;初始CH372
;等待PC机指令
WAIT_REQ: NOP
NOP
NOP
NOP
;********************************************************
NOP
NOP
JMP WAIT_REQ
WRINTVER:MOV AX,0H
MOV ES,AX
MOV DI,0020H
LEA AX,INTQ0
STOSW
MOV AX,CS
STOSW
RET
; 初始CH372,并开中断
CH372: MOV DX,CH372_CMD
MOV AL,15H ;SET USB MODE
OUT DX,AL
NOP
MOV DX,CH372_DATA
MOV AL,02H ;00H=未启用的设备方式, 01H=已启用的设备方式并且使用外部固件模式, 02H=已启用的设备方式并且使用内置固件模式,
OUT DX,AL
NOP
WT0: IN AL,DX
CMP AL,51H
JNZ WT0
STI
RET
;
;中断程序
INTREEUP0:
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
MOV DX,CH372_CMD
MOV AL,22H ;获取中断状态 并取消中断请求
OUT DX,AL
NOP
MOV DX,CH372_DATA
IN AL,DX
CMP AL,02H ; USB端点2的OUT 批量下传成功
JNZ CH372_INT1
JMP CH372_DOWNOK ; 接收成功
CH372_INT1:CMP AL,0AH ;USB端点2的IN 批量上传成功
JNZ CH372_INT2
JMP CH372_UPOK ;发送成功
CH372_INT2:CMP AL,09H ;USB端点1的IN
JNZ CH372_INT3
JMP CH372_UP_INTOK ;中断数据发送成功
CH372_INT3:JMP CH372_INTRET
CH372_INTRET: MOV AL,20H
MOV DX,INTPORT1
OUT DX,AL
POP SI
POP DX
POP CX
POP BX
POP AX
STI
IRET
; USB批量数据接收成功
CH372_DOWNOK: MOV DX,CH372_CMD
MOV AL,28H ;从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 长度+数据
OUT DX,AL
NOP
MOV DX,CH372_DATA
IN AL,DX ;读下载长度
NOP
MOV AH,0H
MOV CX,AX
MOV BYTE PTR DS:[COUNT],AL
CMP AL,00H
JZ INTRET
; 判断是命令+数据,还是纯数据
MOV AL,BYTE PTR DS:[CMD_FLAG]
TEST AL,01H
JNZ CH372_INTDOWN
JMP CH372_INTCMD
INTRET: JMP CH372_INTRET
CH372_INTDOWN:JMP CH372_INTDN0 ;接收数据块
CH372_INTCMD: MOV BX,CMD_BUFFER ;把命令包送入命令缓冲区
CH372_INTCMD0:IN AL,DX
MOV [BX],AL
INC BX
NOP
LOOP CH372_INTCMD0
MOV AL,BYTE PTR DS:[CMD_BUFFER] ;取命令 分析
CMP AL,0A0H
; 连续上传数据块之前进行同步,实际是让单片机清除上传缓冲区的已有内容
;如果上一次进行数据上传时,计算机提前结束上传,
;那么有可能在上传缓冲区中遗留有数据,所以在第二次上传前需要清除上传缓冲区
JNZ CH372_INTCMD1
MOV DX,CH372_CMD
MOV AL, 1DH ;设置USB端点2/主机端点的发送器
OUT DX,AL
NOP
MOV DX,CH372_DATA
MOV AL,0EH
OUT DX,AL
JMP CH372_INTRET
;下传数据块
CH372_INTCMD1:CMP AL,91H ;接口测试
JNZ CH372_INTCMD2
MOV DX,CH372_CMD
MOV AL,2BH ;向USB端点2的发送缓冲区写入数据块
OUT DX,AL
NOP
MOV DX,CH372_DATA
MOV AL,07H ;长度
OUT DX,AL
MOV AL,BYTE PTR DS:[CMD_BUFFER+0] ;DATA1
NOT AL
OUT DX,AL
MOV AL,BYTE PTR DS:[CMD_BUFFER+1] ;DATA1
NOT AL
OUT DX,AL
MOV AL,BYTE PTR DS:[CMD_BUFFER+2] ;DATA2
NOT AL
OUT DX,AL
MOV AL,BYTE PTR DS:[CMD_BUFFER+3] ;DATA3
NOT AL
OUT DX,AL
MOV AL,BYTE PTR DS:[CMD_BUFFER+4] ;DATA4
NOT AL
OUT DX,AL
MOV AL,BYTE PTR DS:[CMD_BUFFER+5] ;DATA5
NOT AL
OUT DX,AL
MOV AL,BYTE PTR DS:[CMD_BUFFER+6] ;DATA6
NOT AL
OUT DX,AL
MOV WORD PTR DS:[CHANGDU_L],0000H
JMP CH372_INTRET
;************************************************************************
CH372_INTCMD2:CMP AL,56H ;下传指定显示命令
JNZ CH372_INTCMD3
MOV AL,BYTE PTR DS:[CMD_BUFFER+4]
MOV AH,AL
MOV AL,BYTE PTR DS:[CMD_BUFFER+3]
MOV BL,AL
MOV BH,0H
MOV AL,CS:[BX+DATA1]
MOV BL,AH
MOV BH,0H
MOV [BX+DISPDATA],AL
MOV SI,DISPDATA1
CALL LEDDISP
JMP CH372_INTRET
;********************************************************
CH372_INTCMD3:JMP CH372_INTRET
CH372_INTDN0: MOV DX,CH372_DATA ;接收下传纯数据块
IN AL,DX
MOV BX,WORD PTR DS:[CMD_BUFFER+2]
MOV [BX],AL
INC BX
INC WORD PTR DS:[DN_COUNT]
MOV WORD PTR DS:[CMD_BUFFER+2],BX
LOOP CH372_INTDN0
MOV AX,WORD PTR DS:[CHANGDU_L]
CMP AX,WORD PTR DS:[DN_COUNT]
JNZ DN_DATAFLAG1
MOV BYTE PTR DS:[CMD_FLAG],00H ;下传全部完成,清标志位
MOV WORD PTR DS:[DN_COUNT],00H ;清下传计数
JMP Q1
DN_DATAFLAG1: MOV BYTE PTR DS:[CMD_FLAG],01H
Q1: JMP CH372_INTRET
; USB批量数据发送成功
CH372_UPOK: MOV AL,BYTE PTR DS:[CHANGDU_L]
OR AL,BYTE PTR DS:[CHANGDU_H]
CMP AL,00H
JZ CH372_INTUNLK ;没有数据退出
CLC
MOV AL,BYTE PTR DS:[CHANGDU_L]
SBB AL,40H
MOV BYTE PTR DS:[BUFFER],AL
MOV AL,BYTE PTR DS:[CHANGDU_H]
SBB AL,00H
MOV BYTE PTR DS:[BUFFER+1],AL
JC CH372_UPEND ;小于64个
MOV CX,40H
MOV AL,BYTE PTR DS:[BUFFER]
MOV BYTE PTR DS:[CHANGDU_L],AL
MOV AL,BYTE PTR DS:[BUFFER+1]
MOV BYTE PTR DS:[CHANGDU_H],AL
JMP CH372_UPNEXT
CH372_UPEND: MOV CX,WORD PTR DS:[CHANGDU_L]
MOV WORD PTR DS:[CHANGDU_L],00H
CH372_UPNEXT: MOV DX,CH372_CMD
MOV AL,2BH
OUT DX,AL
NOP
MOV DX,CH372_DATA
MOV AL,CL
OUT DX,AL
CH372_INTUP1: MOV BX,WORD PTR DS:[ADRESS_L] ;上传数据
MOV AL,[BX]
INC BX
MOV WORD PTR DS:[ADRESS_L],BX
MOV DX,CH372_DATA
OUT DX,AL
LOOP CH372_INTUP1
JMP CH372_INTUNLK ;解锁
CH372_INTUNLK:MOV DX,CH372_CMD
MOV AL,23H ;解锁寄存器
OUT DX,AL
NOP
JMP CH372_INTRET
CH372_UP_INTOK:MOV DX,CH372_CMD
MOV AL,23H ;解锁寄存器
OUT DX,AL
NOP ;清中断等待标志,通知应用程序可以继续发送中断数据
JMP CH372_INTRET
DELAY: MOV CX,03FFFH
LOOP $
RET
LEDDISP:MOV AL,90H
MOV DX,CONTPORT
OUT DX,AL
MOV BYTE PTR DS:[0600H],00
LED1: CMP BYTE PTR DS:[0600H],07H
JA LED2
MOV BL,DS:[0600H]
MOV BH,0H
MOV AL,CS:[BX+SI]
MOV DX,DATAPORT
OUT DX,AL
ADD BYTE PTR DS:[0600H],01H
JNZ LED1
LED2: RET
DATA1 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;0~F
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H,00H
FORMAT: MOV BX,0
MOV WORD PTR DS:[BX+DISPDATA],4006H
ADD BX,2
MOV WORD PTR DS:[BX+DISPDATA],5B40H
ADD BX,2
MOV WORD PTR DS:[BX+DISPDATA],4F07H
ADD BX,2
MOV WORD PTR DS:[BX+DISPDATA],3976H
ADD BX,2
MOV SI,DISPDATA
MOV AL,00H
MOV BX,DISPDATA1
MOV CX,0008H
CLRDATA:MOV [BX],AL
INC BX
LOOP CLRDATA
RET
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -