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

📄 drv7279.asm

📁 PIC单片机的汇编源码合集,应用比较广泛,设计程序时可做子程序来用
💻 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 + -