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

📄 lesson9.asm

📁 单片机实验
💻 ASM
字号:
PORT    EQU   0CFA0H
BUF     EQU   23H       ;存放计数值
SBF     EQU   22H       ;存放秒值
MBF     EQU   21H       ;存放分值
CSEG AT 0000H
        LJMP START
CSEG AT 401BH
        LJMP CLOCK
CSEG AT 4100H
START:  MOV    R0,#40H  ;40H-45H是显示缓冲区,依次存放
        MOV    A,#00H   ;分高位、分低位,0A,0A(横线)
        MOV    @R0,A    ;以及秒高位、秒底位
        INC    R0
        MOV    @R0,A
        INC    R0
        MOV    A,#0AH
        MOV    @R0,A
        INC    R0
        MOV    @R0,A
        INC    R0
        MOV    A,#00H
        MOV    @R0,A
        INC    R0
        MOV    @R0,A

        MOV    TMOD,#10H  ;定时器1初始化为方式1
        MOV    TH1,#38H   ;置时间常数,延时0.1秒
        MOV    TL1,#00H

        MOV    BUF,#00H   ;置0
        MOV    SBF,#00H
        MOV    MBF,#00H

        SETB   ET1
        SETB   EA
        SETB   TR1

DS1:    MOV    R0,#40H    ;置显示缓冲区首址
        MOV    R2,#20H    ;置扫描初值,点亮最左边的LED6
DS2:    MOV    DPTR,#PORT    
        MOV    A,@R0      ;得到的段显码输出到段数据口
        ACALL  TABLE
        MOVX   @DPTR,A

        MOV    A,R2       ;向位数据口P1输出位显码
        CPL    A
        MOV    P1,A   

        MOV    R3,#0FFH   ;延时一小段时间
DEL:    NOP
        DJNZ   R3,DEL

        INC    R0         ;显示缓冲字节加一
        CLR    C
        MOV    A,R2
        RRC    A          ;显码右移一位
        MOV    R2,A       ;最末一位是否显示完毕?,如无则
        JNZ    DS2        ;继续往下显示

        MOV    R0,#45H
        MOV    A,SBF      ;把秒值分别放于44H,45H中
        ACALL  GET

        DEC    R0         ;跳过负责显示"-"的两个字节
        DEC    R0
        MOV    A,MBF      ;把分值分别放入40H,41H中

        ACALL  GET
        SJMP   DS1        ;转DS1从头显示起
TABLE:  INC    A          ;取与数字对应的段码
        MOVC   A,@A+PC
        RET
        DB     3FH,06H,5BH,4FH,66H,6DH,7DH, 07H, 7FH,6FH, 40H
         
GET:    MOV    R1,A      ;把从分或秒字节中取来的值的高
        ANL    A,#0FH    ;位屏蔽掉,并送入缓冲区
        MOV    @R0,A

        DEC    R0
        MOV    A,R1      ;把从分或秒字节中取来的值的低
        SWAP   A         ;位屏蔽掉,并送入缓冲区
        ANL    A,#0FH
        MOV    @R0,A
        DEC    R0        ;R0指针下移一位
        RET
CLOCK:  MOV    TL1,#0AFH  ;置时间常数
        MOV    TH1,#3CH
        PUSH   PSW
        PUSH   ACC
        INC    BUF       ;计数加一
        MOV    A,BUF     ;计到10否?没有则转到QUIT退出中断
        CJNE   A,#0AH,QUIT
        MOV    BUF,#00H  ;置初值
        MOV    A,SBF
        INC    A         ;秒值加一,经十进制调整后放入
        DA     A         ;秒字节
        MOV    SBF,A
        CJNE   A,#60H,QUIT ;计到60否?没有则转到QUIT退出中断
        MOV    SBF,#00H    ;是,秒字节清零
        MOV    A,MBF
        INC    A           ;分值加一,经十进制调整后放入
        DA     A           ;分字节
        MOV    MBF,A
        CJNE   A,#60H,QUIT ;分值为60否?不是则退出中断
        MOV    MBF,#00H    ;是,清零
QUIT:   POP    ACC
        POP    PSW
        RETI               ;中断返回
END       

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -