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

📄 实验五(3).asm

📁 单片机只是别人的东西
💻 ASM
字号:

;功能:LED动态显示演示实验
TCOCON   DATA    40H     ;定时器溢出计数单元
DISPC    DATA    41H     ;显示数码计数器
DISPP    DATA    43H     ;显示指针
DISPBUF  DATA    48H     ;显示缓冲区,48H单元记录十位,49H单元记录个位

TIME1    EQU     5     ;溢出次数

ORG 0000H
LJMP MAIN

ORG 002BH
LJMP CTC2       ;定时/计数器T2中断服务程序入口地址

ORG 0050H
;-----主程序开始-----
PROC MAIN
MAIN:
     MOV SP, #5FH       ;对于只有前128字节内部RAM芯片来说,
                        ;将60H-7FH,共计32字节作为堆栈区
;     MOV SP, #0DFH     ;对于具有256字节内部RAM芯片来说,
                        ;将0E0H-0FFH,共计32字节作为堆栈区
     MOV DPTR, #8000H   ;关闭蜂鸣器
     MOV A, #0FFH
     MOVX @DPTR, A


     ;---复位后,将08H-0FF内部RAM单元清0。
     MOV R7, #248
     MOV R0, #08H
LOOP1:
     MOV @R0, #0
     INC R0
     DJNZ R7, LOOP1

     ;----初始化定时器T2
     MOV TH2, #1130H
     MOV TL2, #00H          ;初值0DC00送定时器T2
     MOV RCAP2H, #1130H
     MOV RCAP2L, #00H       ;初始化重装初值
     MOV T2CON, #00000100B  ;初始化T2工作方式(自动重装初值、定时)
                            ;并启动了T2

     ;-----初始化中断控制器
     SETB ET2                ;允许定时器T2中断
     SETB EA                 ;开中断
     MOV TCOCON, #TIME1      ;T2每10ms中断一次,则TCOCON回零时间为100*10ms

     LCALL DATA_BUF          ;把数码对应笔段码送显示缓冲区

     SJMP $                  ;虚拟主程序,等待中断

END


;定时/计数器T2中断服务程序
PROC CTC2
CTC2:
     PUSH  PSW
     PUSH  ACC
     CLR   RS0
     SETB  RS1          ;切换工作寄存器区(这里假设用1区)


     DJNZ  TCOCON, NEXT1 ;溢出次数减1,不为0跳转
     ;溢出次数已经回到0,重新初始化溢出次数
     MOV TCOCON, #TIME1
     INC DISPC           ;数码计数器+1
     LCALL DATA_BUF      ;把数码对应笔段码送显示缓冲区
NEXT1:

     ;笔段码送P0
     INC DISPP          ;显示指针+1
     MOV A, DISPP       ;取显示指针
     CJNE A, #0, NEXT2
     ;显示指针为0,说明本次中断要显示个位
     SETB P3.4          ;关闭十位
     CLR P1.2           ;打开个位
     MOV R0, #DISPBUF+1 ;选择个位笔段码
     SJMP NEXT4
NEXT2:
     CJNE A, #1, NEXT3
     ;显示指针为1,说明本次中断要显示十位
     CLR P3.4           ;打开十位
     SETB P1.2          ;关闭个位
     MOV R0, #DISPBUF   ;选择十位笔段码
     SJMP NEXT4
NEXT3:
     ;显示指针>=2,重新置为0
     MOV DISPP, #0
     SETB P3.4          ;关闭十位
     CLR P1.2           ;打开个位
     MOV R0, #DISPBUF+1 ;选择个位笔段码
NEXT4:
     MOV P0, @R0        ;笔段码送P0口

     POP   ACC
     POP   PSW
     CLR TF2             ;清除定时器T2溢出标志
     RETI
END

PROC DATA_BUF           ;把数码对应笔段码送显示缓冲区
DATA_BUF:
     MOV DPTR, #LEDTAB  ;0-F字模表首地址送DPTR
     MOV R0, #DISPBUF

     MOV A, DISPC
     ANL A, #0F0H       ;取十位
     SWAP A
     MOVC A, @A+DPTR    ;取显示数码对应笔段码
     MOV @R0, A         ;送显示缓冲区
     INC R0

     MOV A, DISPC
     ANL A, #0FH        ;取个位
     MOVC A, @A+DPTR    ;取显示数码对应笔段码
     MOV @R0, A         ;送显示缓冲区
     RET
END


LEDTAB:                 ;八段LED共阳数码管字模
;数码  0     1     2     3     4     5    6    7
DB     0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H

;数码  8     9     A     B     C     D     E     F
DB     80H,  90H,  88H, 83H,  0C6H, 0A1H, 86H, 8EH

⌨️ 快捷键说明

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