1、实现目标
通过汇编语言,实现单个静态数码管依次循环显示0~9。
2、数码管
2.1、数码管外观
2.2、数码管工作原理
(1)数码管的亮灭是由内部LED的亮灭实现的。
(2)一位数码管内部有八颗LED灯,利用内部的LED灯的亮和灭让数码管显示不同的数字。
3、原理图及连接
(1)P0端口连接静态数码管(JP3)
(2)IO口对应数码段。
P0.0对应a | P0.1对应b | P0.2对应c | P0.3对应d |
P0.4对应e | P0.5对应f | P0.6对应g | P0.7对应dp |
(3)数码管为共阳数码管。
(4)P0端口的对应IO输出低电平,对应数码段被点亮,输出高电平,数码管熄灭。
4、示例程序
4.1、DB定义字节伪指令
(1)格式:
标号:
DB X1,X2,…,Xn
(2)标号可有可无,Xi是单字节数据,它可为十进制数或十六进制数,可以为一个表达式,也可以是在单引号中的字符,表示ASCII码的字符,两个数据之间用逗号“,”分开。
(3)DB指令通知汇编程序从当前ROM地址开始,保留存储单元,并存入DB后面的数据。
例如下面的代码。
ORG 1000H
DB 0xAA
SDATA(标号):
DB 25,25H
经汇编后,从地址1000H处的存储器的内容如下:
(1000H)=0xAA
(1001H)=19H=25(十进制)
(1002H)=25H
4.2、程序
;P0口接LED数码管
;-------------------------------------
ORG 0000H ;ORG为程序段说明伪指令,它向汇编程序说明该程序段的起始地址,所以可以当中断向量地址用
LJMP L_Main ;跳转到L_Main标号处
L_Main:
;your code
MOV DPTR,#T_table ;T_table所在地址赋值给DPTR
MOV R0, #0x00 ;把立即数赋值给寄存器R0
L_loop:
MOV A, R0
MOVC A,@A+DPTR ;基地变址寻址
MOV P0,A
LCALL F_Delay1S ;调用子程序,函数_延时1秒
INC R0
CJNE R0,#10,L_loop ;如果R0不等于10就跳转到L_1oop
MOV R0,#0x00 ;R0等于10了就清零
LJMP L_loop ;跳转到标号L_loop处
SJMP $ ;在当前位置死循环
;---------------------------------------
F_Delay1S: ;1S = 2us*500000 (50*100*100)
MOV R7,#50 ;立即数50赋值给寄存器R7
L_loop2:
MOV R6,#100 ;立即数100赋值给寄存器R6
L_loop1:
MOV R5,#100 ;立即数100赋值给R5寄存器
DJNZ R5,$ ;R5寄存器值减1,不是零就跳转到当前位置,即减到零才跳出循环
DJNZ R6,L_loop1 ;相当于了100*100了
DJNZ R7,L_loop2 ;相当于50*100*100了
RET
;---------------------------------------
T_table:
;声明并初始化数据。
;声明数据的本质就是:在内存中占用一块空间 ;
;初始化数据的本质就是:给这个空间赋予一个值 。
DB 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90
END