湖北大学单片机实验2 数码管显示系统设计

实验目的:

分为两个实验:单只数码管循环显示0-9和8只数码管滚动显示单个数字

  1. 掌握数码管共阳极和共阴极的字形码;
  2. 掌握七段数码管的静态显示方式和动态显示方式;
  3. 掌握段选和线选;
  4. 掌握汇编的查表程序;

实验器材:

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

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值