📄 drv7279.asm
字号:
;********************DRV7279********************
;本程序将指定的显示缓冲区送显,并将读取的键值送显。
;入口参数:显示缓冲区首地址在SADR中,要显示的位数在CNT中。
;出口参数: 无。
;占用资源:W,STATUS,FSR,RD,020H,023H,024H,028H,029H,02AH,3重堆栈。
;说 明:按下某一键,可以在最低位显示该键的键值,若按下S0键则第一位数字将闪烁
IFNDEF DRV72791
#DEFINE DRV72791
#DEFINE CS7279 PORTD,0 ;CS
#DEFINE CLK7279 PORTD,1 ;CLK
#DEFINE DAT7279 PORTD,2 ;DAT
#DEFINE KEY7279 PORTD,3 ;KEY
INCLUDE "DLY5NU.ASM"
INCLUDE "DLYNMS.ASM"
;***************************************
; 发送1个字节到HD7279,高位在前
;***************************************
SEND1 MOVWF TEMP1 ;待发送数据送入TEMP1
MOVLW D'8'
MOVWF CNT ;设定位计数器=8
BCF CS7279 ;设CS为低电平
MOVLW .20
MOVWF SOU
CALL DLY5NU ;延时100uS
SEND_LOOP BCF STATUS,C
RLF TEMP1,F ;输出1位
BCF DAT7279
BTFSC STATUS,C
BSF DAT7279
BSF CLK7279 ;设CLK为高电平
MOVLW .3
MOVWF SOU
CALL DLY5NU ;延时15uS
BCF CLK7279 ;设CLK为低电平
MOVLW .3
MOVWF SOU
CALL DLY5NU
DECFSZ CNT,F ;检查是否8位均发送完毕
GOTO SEND_LOOP ;未发送完,发送下一位
BCF DAT7279
RETLW 0
;**************************************
; 从HD7279接收1个字节,高位在前
;**************************************
RECEIVE2 MOVLW D'8'
MOVWF CNT ;设定位计数器=8
MOVLW B'11111100' ;设RD2口为输入状态
BSF STATUS,RP0
MOVWF TRISD
BCF STATUS,RP0
BCF CS7279 ;设CS为低电平
MOVLW .20
MOVWF SOU
CALL DLY5NU ;长延时
RECEIVE_LOOP
BSF CLK7279 ;置CLK为高电平
MOVLW .3
MOVWF SOU
CALL DLY5NU
BSF STATUS,C
BTFSS DAT7279
BCF STATUS,C
RLF TEMP1,F ;读取1位数据
BCF CLK7279 ;设CLK为低电平
MOVLW .3
MOVWF SOU
CALL DLY5NU
DECFSZ CNT,F ;检查是否已接收8位数据
GOTO RECEIVE_LOOP
MOVLW B'11111000'
BSF STATUS,RP0
MOVWF TRISD ;重设RD2(DATA)为输出态
BCF STATUS,RP0
RETLW 0
;******************开始*************************
DRV7279 MOVF CNT,W
MOVWF TEMP3 ;保存显示位数
MOVLW B'11111000' ;I/O口初始化
BSF STATUS,RP0
MOVWF TRISD
BCF STATUS,RP0
MOVLW B'11111001'
MOVWF PORTD
MOVLW .25
MOVWF SOU
CALL DLYNMS ;延时约25MS
MOVLW B'10100100' ;发复位(清除)指令
CALL SEND1
MOVLW 98H
CALL SEND1 ;消隐显示
MOVF TEMP3,W
MOVWF CNT
CLRF TEMP1
LOOP95 BSF STATUS,C
RLF TEMP1,F
DECFSZ CNT,F
GOTO LOOP95
MOVF TEMP1,W ;用算法确定消隐前几位
CALL SEND1
MOVF SADR,W
MOVWF FSR ;显示缓冲区
MOVLW 0C8H
MOVWF TEMP2 ;TEMP2储存下载数据指令
NEXT60 MOVF TEMP2,W
CALL SEND1 ;送出指令
MOVF INDF,W
ANDLW 0FH
CALL SEND1 ;送出数据
INCF TEMP2,F
DECFSZ TEMP3,F
GOTO $+2
GOTO DONE21
MOVF TEMP2,W
CALL SEND1
SWAPF INDF,W
ANDLW 0FH
CALL SEND1
INCF FSR,F
INCF TEMP2,F
DECFSZ TEMP3,F ;所有位送出?
GOTO NEXT60
DONE21 BSF CS7279 ;恢复CS为高电平
LOOP94 BTFSC KEY7279 ;检查是否有键按下
GOTO $-1
MOVLW B'00010101' ;有键按下,发读键盘指令
CALL SEND1 ;发送指令
CALL RECEIVE2 ;从HD7279读入键码
MOVF TEMP1,W
MOVWF TEMP2 ;暂存键值
; 发送按键的键值到HD7279
OVER3 MOVLW B'10100001' ;发送左移指令,使当前显示内容
CALL SEND1 ;左移,留出空位供显示新数据
MOVLW B'11001000' ;下载数据且译码(方式1)指令(第1位)
CALL SEND1
MOVF TEMP2,W ;发送数据
ANDLW 0FH
BTFSC STATUS,Z
GOTO FLASH ;闪烁显示
CALL SEND1
DONE20 BTFSS KEY7279 ;等待按键放开
GOTO $-1
BSF CS7279 ;恢复CS为高电平
GOTO LOOP94
FLASH CALL SEND1
MOVLW 88H
CALL SEND1
MOVLW 0FEH ;第一位闪烁
CALL SEND1
MOVF TEMP2,W
GOTO DONE20
RETURN
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -