⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch372.asm

📁 可编程并行接口8255A完成的交通灯实验   用8255A的B端口和C端口控制12个LED的亮和灭(输出为0则亮
💻 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 + -