3个595控制8X8点阵,感觉都没错了还是达不到效果

2019-07-15 18:49发布

3个595控制8X8点阵,一个595接公共端,另两个595级联控制双 {MOD},红。绿,下面附有电路图
程序带有一定解释
                   SC1  BIT P1.2        //hang
                   CLK1 BIT P1.1
                   SEN1 BIT P1.0
                   SC2  BIT P2.2 //lie
                   CLK2 BIT P2.1
                   SEN2 BIT P2.0                  
                  
                   ORG 0000H
                   AJMP START
                   NOP

                   ORG 0030H
MAIN:      MOV R0,#00H
           MOV R1,#08H
                   MOV R2,#80H        ;第一行地址
           MOV R3,#08H        ;移八次
                   MOV R4,#00H       
                   MOV R5,#00H
START:     LCALL LIE         ;调列
                   LCALL HANG         ;调行
                   LCALL DIS          ;调显示
                   DJNZ R1,CL          ;处理程序                   
                   MOV R1,#08H
                   MOV R0,#00H
                   MOV R2,#80H
                   AJMP START
CL:                   MOV A,R2
                   RR A                          //第一行一列送完送第2行2列
                   MOV R2,A
                   INC R0       
                   AJMP START

LIE:           MOV 30H,R2          //把第一列的数值送个30
               CLR C
LIE1:           MOV R4,30H           //把送来的列地址,通过八次以为移入锁存器中
           MOV A,R4
                   RLC A
                   MOV R4,A
                   MOV SEN2,C
                   CLR CLK2
                   NOP
                   SETB CLK2
                   DJNZ R3,LIE1
                   MOV R4,#00H
                   MOV R3,#10H           //双 {MOD}点阵,移位行时得移2字节16位(一个移给红 {MOD}595,一个移给绿 {MOD}595)
                   RET

HANG:      CLR C
           MOV DPTR,#TAB
           MOV A,@R0                   //把行显示给R5
                   MOVC A,@A+DPTR  
                   MOV R5,A
HANG1:           MOV A,R5
           RLC A
                   MOV R5,A
                   MOV SEN1,C
                   CLR CLK1
                   NOP
                   SETB CLK1
                   CJNE R3,#08H,HANG2        //判断可移完八次,没用转回移完第一字节
                   INC R0                                //以为,Inc R0,移第二字节,
HANG2:           DJNZ R3,HANG1
                   MOV R5,#00H
                   MOV R3,#08H                  
                   RET

DIS:       CLR SC2
                   NOP
           SETB SC2
                   CLR SC1                           //开锁存,输出行列数据
                   NOP
                   SETB SC1
                   LCALL DEL
                   RET

DEL:       MOV R7,#10
DEL1:           MOV R6,#100
                   DJNZ R6,$
                   DJNZ R7,DEL1
                   RET
                    
TAB:  DB  00H,00H,00H,6CH,00H,92H,00H,82H,00H,44H,00H,28H,00H,10H


                  END

QQ截图20140812102534.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
mb4555
1楼-- · 2019-07-16 18:02
编写了一个程序,简练代码,变量也用的很少,
编译通过,没有电路板测试。可能有多少错误,自己调整吧
;----------移八次把行地址移入595中锁存
OUTCLK1 MACRO           ;移八次把行地址移入595中锁存
              SETB CLK1   ;移八次把行地址移入595中锁存
                NOP
             CLR CLK1      
            ENDM
;----------;移八次把L列数据移入595中锁存
OUTCLK2 MACRO                ;移八次把L列数据移入595中锁存
              SETB CLK2  
                NOP
             CLR CLK2      
            ENDM  
;---------------输出行
H_OUT  MACRO
        SETB SC1
                NOP
                CLR SC1       
              ENDM
;---------------输出列
L_OUT         MACRO
                SETB SC2
                NOP
                CLR SC2       
              ENDM         
                                                     
                   SC1  BIT P1.2   //锁存
           CLK1 BIT P1.1   //时钟脉冲
           SEN1 BIT P1.0   //数据输入
           SC2  BIT P2.2   //锁存
           CLK2 BIT P2.1   //时钟脉冲
           SEN2 BIT P2.0   //数据输入                                   
          ORG 0000H
          AJMP MAIN
          ORG 0030H
MAIN:     LCALL DEL          
          LCALL DEL         
MAIN1:    MOV DPTR,#TAB
          MOV R3,#08
LOOP:           LCALL LLB       
                  INC  DPTR
          LCALL LLR
          L_OUT//输出列
                  LCALL HHH
                  DJNZ R3,LOOP
                  AJMP MAIN1
;------扫描输出8行
HHH:    SETB SEN1        //输出第一个1
                OUTCLK1    ;移八次把行地址移入595中锁存
                H_OUT//输出行               
        MOV R2,#08H  ;移八次
        HH1:
                LCALL DEL         ;每一行停留一下
             CLR  SEN1         //连续输出8个0 .最后一个是关闭行
                OUTCLK1    ;移八次把行地址移入595中锁存
                H_OUT//输出行
            DJNZ R2,HH1
        RET
;------输出绿列
LLB:    CLR         A
                MOVC A,@A+DPTR
                LCALL  LL
            RET
;------输出红列
LLR:    MOV A,#0FFH
                LCALL  LL
            RET                           
;------输出列的一个字节
LL:          MOV R2,#08H  
    LL1:MOV C,ACC.7
               MOV SEN2,C
                  OUTCLK2        ;移八次把L列数据移入595中锁存
                   RL A
               DJNZ R2,LL1                                
        RET
;------延时子程序
DEL:    MOV R7,#10
  DEL1: MOV R6,#10
        DJNZ R6,$
        DJNZ R7,DEL1
               RET                    
  TAB:  DB  ~00H,~6CH,~92H,~82H,~44H,~28H,~10H,~00H
        END
mb4555
2楼-- · 2019-07-16 23:30
的确很多错误;修改好了

;----------移八次把行地址移入595中锁存
OUTCLK1 MACRO           ;移八次把行地址移入595中锁存
              SETB CLK1   ;移八次把行地址移入595中锁存
                NOP
             CLR CLK1      
            ENDM
;----------;移八次把L列数据移入595中锁存
OUTCLK2 MACRO                ;移八次把L列数据移入595中锁存
              SETB CLK2  
                NOP
             CLR CLK2      
            ENDM  
;---------------输出行
H_OUT  MACRO
        SETB SC1
                NOP
                CLR SC1       
              ENDM
;---------------输出列
L_OUT         MACRO
                SETB SC2
                NOP
                CLR SC2       
              ENDM         
                                     
                   SC1  BIT P1.2   //锁存
           CLK1 BIT P1.1   //时钟脉冲
           SEN1 BIT P1.0   //数据输入
           SC2  BIT P2.2   //锁存
           CLK2 BIT P2.1   //时钟脉冲
           SEN2 BIT P2.0   //数据输入                                 
          ORG 0000H
          AJMP MAIN
          ORG 0030H
MAIN:     LCALL DEL          
          LCALL DEL         
MAIN1:    MOV DPTR,#TAB
                  MOV R4,#80H      ;打开第一行显示的控制位,取最高位
                  MOV R3,#08       ;一共有8行
LOOP:           
          LCALL LLR
          LCALL LLB       
                  INC  DPTR
          L_OUT//输出列
                  LCALL HHH
                  MOV A,R4
                  RL A
                 MOV R4,A
                  DJNZ R3,LOOP
                  AJMP MAIN1
;------打开某一行
HHH:    MOV A,R4
        MOV C,ACC.7
               MOV SEN1,C
                OUTCLK1            ;移八次把行地址移入595中锁存
                H_OUT                ;输出行               
                LCALL DEL        ;每一行停留一下
        RET
;------输出绿列一行
LLB:    CLR         A
                MOVC A,@A+DPTR
                LCALL  LL
            RET
;------输出红列一行
LLR:    MOV A,#0FFH
                LCALL  LL
            RET                           
;------输出行的一个字节
LL:          MOV R2,#08H  
    LL1:MOV C,ACC.7
               MOV SEN2,C
                  OUTCLK2        ;移八次把L列数据移入595中锁存
                   RL A
               DJNZ R2,LL1                                
        RET
;------延时子程序
DEL:    MOV R7,#10
  DEL1: MOV R6,#10
        DJNZ R6,$
        DJNZ R7,DEL1
               RET                    
  TAB:  DB  00H,6CH,92H,82H,44H,28H,10H,00H          
        END
落尘浅羽
3楼-- · 2019-07-17 01:56
mb4555 发表于 2014-8-13 18:55
的确很多错误;修改好了

;----------移八次把行地址移入595中锁存

已解决,我的子程序没分你那么细精灵,有一点阴影

一周热门 更多>