实验目的:
分为两个实验:单只数码管循环显示0-9和8只数码管滚动显示单个数字
- 掌握数码管共阳极和共阴极的字形码;
- 掌握七段数码管的静态显示方式和动态显示方式;
- 掌握段选和线选;
- 掌握汇编的查表程序;
实验器材:
Proteus、keil
实验原理(给出硬件电路图):
- 单只数码管循环显示0-9
- 8只数码管滚动显示单个数字
实验步骤:
- 单只数码管循环显示0-9
数码管为共阴极,则如果哪个发光二极管的阳极接高电平,则相应笔段的发光二极管发光。
(二)8只数码管滚动显示单个数字
段选:选择每个小数码管中的某几个二极管,P0口实现段选
位选:选择上图中大数码管中的某一个小数码管,P2口实现线选
程序代码及实验结果(含汇编语言代码和C语言代码):
- 单只数码管循环显示0-9
#include<reg51.h>
#include<intrins.h>
//数码管显示数字0~9对应的十六进制
unsigned char led[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void delay(int a)//延时函数,增大从一个状态到另一个状态之间的时间,避免因变化过快而超出人眼视觉停留的最佳时间
{
unsigned int t;
while(a--);
for(t=0;t<120;t++);
}
void main()
{
unsigned char i;
while(1) //死循环
{
for(i=0;i<10;i++) //让0-9数字亮,循环次数为10
{
P0=led[i];
delay(30000);
}
}
}
ORG 0000H
LJMP START
ORG 0030H
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;共阴极数码管的字形码,对应的分别是显示字符‘0’、‘1’.....‘9’
START:MOV R0,#00H ;设置首地址
MOV R1,#0AH ;设置循环次数
MOV DPTR,#TABLE
LOOP: ;将表中的十六进制数送到P0口
MOV A,R0 ;寄存器寻址,把R0中存放的数据存放在累加器A中
MOVC A,@A+DPTR ;利用变址寻址方式,A中存放着表格的地址
MOV P0,A ;将表格中的数据赋给P0
;延时函数
LCALL DELAY ;无条件跳转,跳到延时函数
LCALL DELAY
INC R0 ; 首地址加1
DJNZ R1,LOOP ;循环次数减1,如果减1 后为0则跳转到LOOP
CLR A ;将累加器A中的数据清零,准备下一次的循环
LJMP START
DELAY: MOV R7,#0FFH ;延时函数
D1: MOV R6,#0FFH
D2: DJNZ R6,D2 ;程序的作用是原地转圈250次
DJNZ R7,D1
RET ;返回主函数
END
(二)8只数码管滚动显示单个数字
/*
*数码管共阳极
*P0.0~P0.7置0实现段选(segment)
*P2.0~P2.7置1实现位选(position)
*/
#include<reg51.h>
#include<intrins.h>
unsigned char seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};//共阳极
unsigned char i;
void delay(int a)//延时函数,增大从一个状态到另一个状态之间的时间,避免因变化过快而超出人眼视觉停留的最佳时间
{
while(a--);
}
void main()
{
while(1)
{ //位选,选择第1个数码管,在电路图中第一个小数码管在最左侧
P2=0x01;//0000 0001,初始化状态,选择第一个数码管
for(i=0;i<=7;i++) //段选,共8个小数码管
{
P0=seg[i]; //seg[0]显示数字0,以此类推
delay(30000); //增大从一个状态到另一个状态之间的时间
P2=_crol_(P2,1);//_color_函数:左移第一个小数码管显示完一个数字后,位选第二个数码管进行显示第二个数字
}
}
}
ORG 0000H
LJMP START
ORG 0030H
TABLE:DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H ;共阳极数码管的字形码,显示字符为‘0’.....'9'
START:MOV R0,#00H ;设置首地址为0
MOV R1,#08H ;设置循环次数为8
MOV DPTR,#TABLE
MOV R2,#01H ;0000 0001让第一个数码管工作
LOOP1:
MOV P2,R2 ;把R2的数据传到P2口,P2.0为高电平,让第一个数码管工作
MOV A,R0 ;寄存器寻址,把R0中存放的数据存放在累加器A中
MOVC A,@A+DPTR ;利用变址寻址方式,A中存放着表格的地址
MOV P0,A ;将表格中的数据赋给P0,对照C语言中的P0=led【i】
LCALL DELAY ;无条件跳转,跳到延时函数
LCALL DELAY
INC R0 ; 首地址加1
CLR A ;将累加器A中的数据清零,准备下一次的循环
;更改数码管工作,让第二个数码管开始工作
MOV A,R2
RL A ;让A中的内容向左移动,让第二个数码管开始工作
MOV R2,A ;此时R2中的数据已经想左移动了一位,第二个数码管开始工作
DJNZ R1,LOOP1 ;循环次数减1,如果减1 后为0则跳转到LOOP
LCALL START
DELAY: MOV R7,#0FFH ;延时函数
D1: MOV R6,#0FFH
D2: DJNZ R6,D2 ;程序的作用是原地转圈250次
DJNZ R7,D1
RET ;返回主函数
END