找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求sst89e516rd制作6位数码管硬件仿真汇编程序

[复制链接]
跳转到指定楼层
楼主
ID:260841 发表于 2018-3-9 13:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求助一下程序,现在在做这个硬件仿真,
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:260841 发表于 2018-4-3 20:27 | 只看该作者
           STRT  EQU  P0.4                ; 定义 (等价代换)        第一列
       SEC   EQU P0.5                   ;矩阵键盘接口处
       MIN   EQU P0.6
       HOUR  EQU P0.7                //第4列

           CL EQU  P2.6          ;蜂鸣器
       ORG 0000H
       SJMP MAIN
       ORG 000BH       ;TO溢出时的  定时器 T0中断程序入口地址
       AJMP T0INT0     ;TO溢,跳到T0INT0       
       ORG 0050H


MAIN: CLR  P0.0                        ;键盘的第一行有效
      MOV  P2,#0FFH    ; 初值                   11111111         给所有的位选端置零
      MOV R4,#20
                 ;计20次 后面中断进位                 
      MOV TMOD,#01H   ; TO为模式1   //向TMOD寄存器写入立即数01h。
      MOV TH0,#03CH   //表示对定时器T0赋初值低八位
      MOV TL0,#0B0H
          SETB TR0        ;      开启TO  定时/计数器0开始运行 TR0是单片机会响应定时/计数器0的启动位   与下面不同 这个是开启  下面这个是允许
      SETB ET0         ;T0中断允许控制位位 开定时器中断0
      SETB EA         ;开中断         开总中断
   
  MOV 30H,#00H     ; 清零30H-32H地址单元:
  MOV 31H,#00H
  MOV 32H,#00H                ;时分秒的储存单元






KS:  LCALL DISP        ;作用:无任何按键,动态显示
     JB    SEC, KM   ;检查 秒键 按否?当sec等于1就去执行KM,否则往下执行
KSS: LCALL DISP
     LCALL   DALY2        ;显示
     JNB   SEC,KSS    ;$当前地址,产生中断
     AJMP  SINC        ;松  秒键    (秒+1)

KM: LCALL DISP
    JB MIN,KH          ;分调整按键(按,不管)
KMM:LCALL DISP
        LCALL  DALY2
    JNB MIN,KMM
    AJMP MINC          ;(分+1)

KH: LCALL DISP
    JB HOUR,K1         ;时调整按键 (按,不跳)
KHH:LCALL DISP
        LCALL  DALY2
    JNB HOUR,KHH
    AJMP HINC         ;(时+1)

SINC: LCALL  DISP  //秒
      LCALL  CLO
          LCALL  DISP
      INC 30H            ;秒调整   30H单元的数据+1
      MOV A,30H        
      CJNE A,#60,SINC0   ;A=60时,不管 ,   否则跳
      MOV 30H,#0         ;A=60   30H单元的数据清零   60/10=6.0   (6与0)    59/10=(5与9)
SINC0:AJMP KS  //A的值跟60不同就回去再扫

MINC: LCALL  DISP   //分
      LCALL  CLO
          LCALL  DISP
      INC 31H           ;31H单元的数据+1
      MOV A,31H
      CJNE A,#60,MINC0
MOV 31H,#0
MINC0: AJMP KM          ;返回"主跳"

HINC: LCALL  DISP  //时
      LCALL  CLO
          LCALL  DISP
      INC   32H      
      MOV A,32H
CJNE A,#24,HINC0
MOV 32H,#0
HINC0:AJMP KH  

k1: LCALL DISP
    JB STRT,KS    ;检查开始键
K11:LCALL DISP
        LCALL  DALY2
    JNB STRT,K11  //当strt等于0时就跳k11
    AJMP START        

START:LCALL  DISP
      LCALL  CLO
          LCALL  DISP
      CPL TR0                       ;////入口开始.将TR0位给取反。以来实现一个暂停
      AJMP K1

DISP:  MOV A,30H   //单元中的数据/10,分离个位与十位     将地址为30H的寄存器内的数据送入A,结果A=由该寄存器内所存的实际数值决定。
       MOV B,#10
       DIV AB     ;  ;A除B,商存入A,余存入B
       MOV 40H,B   ;余数(秒个位数)
       MOV 41H,A   ;商(秒十位数)

       MOV A,31H        //分
       MOV B,#10
       DIV AB          // ;A除B,商存入A,余存入B
       MOV 42H,B   ;余数(分个位数)
       MOV 43H,A   ;商(分十位数)
     
          MOV A,32H          //时
      MOV B,#10
       DIV AB
       MOV 44H,B   ;余数(时个位数)
       MOV 45H,A   ;商(时十位数)

  ////////时间在数码管显示//////////
     MOV A,40H   ;秒个位
     ACALL SEG7
     MOV P1,A
     CLR P2.5
     ACALL DLY
     SETB P2.5

      MOV A,41H   ;秒十位
      ACALL SEG7
      MOV P1,A
     CLR P2.4
         ACALL DLY
         SETB P2.4

MOV A,42H   ;分个位
ACALL SEG7
MOV P1,A
CLR P2.3
ACALL DLY
SETB P2.3

MOV A,43H   ;分十位
ACALL SEG7
MOV P1,A
CLR P2.2
ACALL DLY
SETB P2.2

MOV A,44H   ;时个位
ACALL SEG7
MOV P1,A
CLR P2.1
ACALL DLY
SETB P2.1

MOV A,45H  ;时十位
ACALL SEG7
MOV P1,A
CLR P2.0
ACALL DLY
SETB P2.0
RET




T0INT0:PUSH ACC
        PUSH PSW
        CLR TR0                                         ;暂停定时器T0
        MOV A,#0B5H            ;  ; 10110101
        ADD A,TL0                          ;         低八位初值修正
    MOV TH0,#03CH         ; 00111100                  ;定时中断子程序。重装定时常数
        MOV TL0,A                       ;   重装初值(低8位修正值)
        SETB TR0                                ;开启定时器T0
        DJNZ R4,T0INTR          ;  ;R4减1,不为0短跳转TOINTR
        MOV R4,#20
    INC 30H                 ;1S,秒存储单元内数+1
    MOV A,30H  
        CJNE A,#60,T0INTR        ;未满60S,跳出中断。
    MOV 30H,#0              ;满60S,秒单元清零
    INC 31H                 ;分+1
    MOV A,31H
    CJNE A,#60,T0INTR   ;未满60分,跳出中断。
    MOV 31H,#0     ;满60分,分单元清零
    INC 32H   ;时+1
    MOV A,32H
    CJNE A,#24,T0INTR   ;未满24,跳出中断。
    MOV 32H,#0   ;满24时,时单元清零
T0INTR:        POP PSW
            POP ACC
        RETI



CLO:  CLR CL                                           ;P2.6蜂鸣器         CL0是蜂鸣器子程序
      LCALL  DALY1
          SETB   CL
      RET

DALY1:   ;误差 0us
          MOV R6,#0D7H          //0.215毫秒

DALY2:   ;误差 0us
         MOV R6,#01H        //        消抖

DL0:
    MOV R5,#2FH
    DJNZ R5,$
    DJNZ R6,DL0
    RET

DLY:    MOV R7,#2
D1:     MOV R6,#40
        DJNZ R6,$
        DJNZ R7,D1
        RET


DL3:
    MOV R5,#2DH
    DJNZ R5,$
    DJNZ R6,DL3
    NOP
    NOP
    RET

SEG7:   INC A              ; A加1        结果存在A
        MOVC A,@A+PC                        //查表取值送入A
        RETI                    ; 中断返回

        DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H         //0-9的表格
                END



这是矩阵键盘加数码管显示
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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