找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5633|回复: 10
打印 上一主题 下一主题
收起左侧

求个595控制8X8点阵的汇编程序参考,麻烦能带上说明?

[复制链接]
跳转到指定楼层
楼主
ID:64047 发表于 2014-8-11 22:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目前只会用汇编,自己写了一个程序达不到效果,想求一个汇编的做做参考
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:7485 发表于 2014-8-12 11:54 | 只看该作者
现在不在手边。回去后帮你找找。大概是16位数码管的。

评分

参与人数 1威望 +6 收起 理由
liuz + 6 赞一个!

查看全部评分

回复

使用道具 举报

板凳
ID:64047 发表于 2014-8-12 13:17 | 只看该作者
ahshmj 发表于 2014-8-12 11:54
现在不在手边。回去后帮你找找。大概是16位数码管的。

记得给我帮我找个参考哈,先谢谢你了
回复

使用道具 举报

地板
ID:1 发表于 2014-8-12 13:24 | 只看该作者
74hc595的使用方法:http://www.51hei.com/chip/1799.html
回复

使用道具 举报

5#
ID:50962 发表于 2014-8-12 13:30 | 只看该作者
74hc595+点阵的  原理图和程序: http://www.51hei.com/mcu/2068.html
回复

使用道具 举报

6#
ID:64047 发表于 2014-8-12 16:08 | 只看该作者
liuz 发表于 2014-8-12 13:30
74hc595+点阵的  原理图和程序: http://www.51hei.com/mcu/2068.html

你这是单色点阵
回复

使用道具 举报

7#
ID:7485 发表于 2014-8-12 16:08 | 只看该作者
以下是595显示子程序,段输出使用一个595,位输出使用2个级联,共16位。硬件接线你应该没问题吧?
;------串口595显示子程序---------------------------
;74HC595二级联输出位码和段码
;输出锁存器输出数据子程序
;如果是驱动数码管,2个74HC595级联,一个位驱动,一个段驱动
;入口:R0作为显示缓存的地址指针。先送位码,后送段码
;前面的程序里面,显示缓存从5FH开始向下,5FH对应最左边的数码管依次向下,数码管向右。
;5位数码管加1位指示灯,位码通过ULN2003驱动,高有效,最高位数码管对应595的QE端
;代码为00010000B,或10H,然后是08H、04H、02H、01H,(或者是 RR  ACC ),
;Q0; QE是数码管(Q0是个位,QE是万位),QF是指示灯
;显示缓存(8秒钟变换一次,时间、温度)
;3个显示缓冲区,1.按键正在设置的数据显示,2.时钟显示, 3.温度测量值显示
;===================================================================
DISP:
            PUSH  ACC                  ;保护现场ACC入栈
            PUSH  00H                  ;R0入栈
            JB    BZ_ANJ, DIS_BZ1      ;如果,按键设置中,BZ_ANJ 被置位,转显示正在设置的信息
            MOV   A,   SEC             ;如果不是按键调整中,秒计数器,SEC.3置位与否相隔8秒,
            JB    ACC.3,  DIS_BZ2      ;8秒间隔,轮换显示时间和温度(因为就5个数码管)
            MOV   R0,  #WENDU_HC     ;温度显缓首址送R0,+1是空位(指示灯)
            JMP   DIS_BZ0              ;
DIS_BZ2:                               ;显示时间
            MOV   R0,   #SHIJ_HC     ;BZ_ANJ没有置位,时间显缓首址送R0
            JMP   DIS_BZ0              ;
DIS_BZ1:                               ;以上是:如设置中,显示键设置。否则,分时显示时间、温度
            JB    BZ_INFO, KKLL        ;显示的是错误提示,则不需预处理,BZ_INFO是错误标志
            CALL  YU_DISP              ;按键设置中的  时间  或  温度  值先预处理
KKLL:
            MOV   R0,   #AN_J_HC     ;按键正在调整的数据的显缓首址送R0,显示"error"
DIS_BZ0:
            CALL  DISPLAY
            POP   00H                  ;R0出栈
            POP   ACC                  ;ACC出栈
            RET
;-------------------------------------------------------------------------------------
DISPLAY:
            PUSH  ACC                  ;保护现场ACC入栈
            PUSH  00H                  ;R0入栈
            PUSH  01H                  ;R1入栈
            PUSH  02H
            PUSH  DPH                  ;地址指针高位入栈
            PUSH  DPL                  ;地址指针低位入栈
            PUSH  B                    ;B入栈
            MOV   R1,   #ZIXING-1        ;统一取出段码,放在10H~1FH
            MOV   R2,   #06H           ;6位数码管显示的数,包括指示灯
            MOV   DPTR, #DTAB          ;字形码(段码)表首址
DISP0:
            MOV   A,   @R0             ;读取段码放放在10H~1FH
            MOVC  A,  @A+DPTR
            MOV   @R1, A
            DEC   R0
            DEC   R1
            DJNZ  R2,  DISP0
            MOV   R0,  #ZIXING-5       ;从右至左显示,最后是指示灯
            MOV   B,   #01             ;从最右数码管开始,最后是"分"个位
            MOV   R1,  #6H             ;最后一位是指示灯
DISP1:
            MOV   A,   B               ;取位码
            CALL  WR_595               ;先向595移位寄存器写入位码
            MOV   A,   @R0             ;取段码
            CALL  WR_595               ;再向595移位寄存器写入段码
            CLR   RCK_595              ;复位时钟线
            SETB  RCK_595              ;上升沿将数据从595移位寄存器送到595输出锁存器
            CLR   RCK_595              ;复位时钟线
            MOV   A,  B                ;以下3行,指向下一位数码管
            RL    A                    ;从右至左(00000001B)开始显示,最后是指示灯
            MOV   B,  A
            INC   R0                   ;从右至左(00000001B)开始显示,最后是指示灯
            DJNZ  R1,  DISP1           ;6位数送完了吗?
            POP   B                    ;B出栈
            POP   DPL                  ;
            POP   DPH                  ;
            POP   02H
            POP   01H                  ;
            POP   00H                  ;R0出栈
            POP   ACC                  ;ACC出栈
            RET
;--------------------------------------
;写595移位寄存器子程序
;--------------------------------------
WR_595:
            PUSH  04H
            MOV  R4,  #08H
WR_LOOP:
            RLC  A                     ;左移,高位在先
            MOV  SDATA_595, C          ;数据送到总线上
            SETB  SCLK_595             ;上升沿发生移位,接收1位数据
            CLR  SCLK_595              ;复位
            DJNZ R4, WR_LOOP           ;送完8位了吗?
            POP   04H
            RET

评分

参与人数 1黑币 +21 收起 理由
liuz + 21 很给力!

查看全部评分

回复

使用道具 举报

8#
ID:64047 发表于 2014-8-12 16:23 | 只看该作者
ahshmj 发表于 2014-8-12 16:08
以下是595显示子程序,段输出使用一个595,位输出使用2个级联,共16位。硬件接线你应该没问题吧?
;------ ...

我写了个程序你看看,没注释不过你应该能看懂,达不到亮的要求
因为是双色点阵,所以在行送数值时,送了2字节一次。
                   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
                   MOV R2,A
                   INC R0       
                   AJMP START

LIE:           MOV 30H,R2
               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
                   RET

HANG:      CLR C
           MOV DPTR,#TAB
           MOV A,@R0
                   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
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
回复

使用道具 举报

9#
ID:19715 发表于 2014-8-13 16:13 | 只看该作者
编写了一个程序,简练代码,变量也用的很少,
编译通过,没有电路板测试。可能有多少错误,自己调整吧
;----------移八次把行地址移入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
回复

使用道具 举报

10#
ID:19715 发表于 2014-8-13 18:55 | 只看该作者
的确很多错误;修改好了
回复

使用道具 举报

11#
ID:19715 发表于 2014-8-13 18:55 | 只看该作者
;----------移八次把行地址移入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

评分

参与人数 1黑币 +10 收起 理由
admin + 10 很给力!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表