单片机实验4
实验内容
利用AT89C51系列单片机为CPU,设计电路, 连接4位数码管,并连接两个按键,按第一个按键数码管显示值增加1,按另外一个按键数码管显示值减1。要求线路连接正确,包含晶振电路和复位电路,数码管采用动态显示.
单片机型号为AT89C51、用proteus8.9、keil5软件 汇编语言编写
代码
====================================================================
Created: 2021
Processor: AT89C51
Compiler: ASEM-51 (Proteus)
====================================================================
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP INTOSEL1 //按键加
ORG 0013H
AJMP INTOSEL2 //按键减
ORG 0030H
MAIN:
MOV DPTR, #TAB
SETB EX0 //开外部中断0
SETB EX1 //开外部中断1
SETB IT0 //模式1
SETB IT1
SETB EA //开cpu中断
MOV R0, #01H //数码管值片选信号
MOV R1, #00H //个位
MOV R2, #00H //十位
MOV R3, #00H //百位
MOV R4, #00H //千位
MOV R5, #11H //数码管4位循环片选信号
SEG7LOOP: //4位数码管循环
MOV A, R5
MOV P2, A
RL A
MOV R5, A
//前4行 P2端口低4位 作为4位数码管片选,以上操作为循环赋值
//给每一位数码管附上相应的值
MOV A, @R0 //片选值
MOVC A, @A+DPTR
MOV P0, A
LCALL DELAY
INC R0
CJNE R0, #05H, SEG7LOOP //片选值信号 为R1---R4,R0为5时,重新到R1
MOV R0, #01H
AJMP SEG7LOOP
INTOSEL1: //加法
CJNE R1, #09H, ONE //个位为9要进位
MOV R1, #0H //个位清零
CJNE R2, #09H, TEN //十位为9要进位
MOV R2, #0H //十位清零
CJNE R3, #09H, HUNDRED //百位为9要进位
MOV R3, #0H //百位清零
CJNE R4, #09H, THOUSAND //千位为9要进位
MOV R4, #0H //千位清零
RETI //返回中断点
ONE:
INC R1 //个位非9,加1
RETI //返回中断点
TEN:
INC R2 //十位非9,加1
RETI //返回中断点
HUNDRED:
INC R3 //百位非9,加1
RETI //返回中断点
THOUSAND:
INC R4 //千位非9,加1
RETI //返回中断点
INTOSEL2: //减法
CJNE R1, #00H, ONE1 //为0不够减,借位
MOV R1, #09H //变9
CJNE R2, #00H, TEN1 //后面和加法类似,不再描述
MOV R2, #09H
CJNE R3, #00H, HUNDRED1
MOV R3, #09H
CJNE R4, #00H, THOUSAND1
MOV R4, #09H
RETI
ONE1:
DEC R1
RETI
TEN1:
DEC R2
RETI
HUNDRED1:
DEC R3
RETI
THOUSAND1:
DEC R4
RETI
//时延
DELAY:
MOV R6, #0FFH
DJNZ R6,$
RET
TAB:
DB 0C0H , 0F9H , 0A4H , 0B0H , 99H , 92H , 82H , 0F8H , 80H , 90H
END
所有代码在proteus里测试过
附图
晶振和复位电路参考---->此链接
起始
加一
减一