【单片机竞赛:共阳数码管静态控制】

51单片机(国信天长单片机实训平台)基于keli的常用程序之 共阳数码管一般静态控制程序设计

前言

实验目的:8个数码管分别单独依次显示0 ~ 9,所有数码管依次显示0 ~ F和- . 。

一、国信长天单片机竞赛实训平台的电路图与分析

国信长天单片机竞赛实训平台电路图
在这里插入图片描述

在这里插入图片描述

1.观察电路图

通过观察电路图,我们可以发现,数码管由a1~ dp1(h1)和com1~ com8控制,其中com1~ com4,com5 ~ com8分别控制两个四位数码管,a1~ dp1(h1)由个573移位寄存器连接电阻控制,com1~ com8由573寄存器控制,负责控制灯亮的位置,而寄存器分别由138的Y7与Y6控制。

2.关于数码管段码与显示的关系

在这里插入图片描述

16进制代码显示的数字hgfedcba
0xc0011000000
0xf9111111001
0xa4210100100
0xb0310110000
0x99410011001
0x92510010010
0x82610000010
0xf8711111000
0x80810000000
0x90910010000
0x88A10001000
0x80B10000000
0xc6C11000110
x0c0D11000000
0x86E10001100
0x8eF10001110
0xbf10111111
0x7f.01111111

如图所示,abcdefgh分别控制八个亮的部位,共阳级的意思是后端接阳极(1),接阴极(0)即可触发,则可以得到16进制的16个代数的二进制编码,a为低位,h为高位,改编成16进制编码,及为数码管段码。表格中列取的不代表是全部的,我们可以通过需要亮哪些,给它编码即可。

二、编写程序步骤

1.主程序

一般硬性格式的程序,因为一般都是这个框架,先让整体框架在你脑袋里形成,再一步一步完善。
主程序:

#include "reg52.h"
 void main()
 {
	 while(1)
	 { 
	 }

}

2.数码管代数编码

将段码编写进入数组,调用时方便

unsigned char code smg_daishu[18]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
 0x88,0x80,0xc6,0xc0,0x86,0x8e,
 0xbf,0x7f};//0123456789 abcdef - .

3.编写延时函数Delay

计算机执行程序的速度非常快,如果不主动添加延时函数让程序被动等待,则肉眼观察不到数码管的变化:

  void delay(unsigned int t)
 {
    while(t--);
	while(t--);
}

4.编写关闭外设函数

一般比赛需要关闭外设,同时防止给电时蜂鸣器乱叫:

 void stop()
 {
  P2=(P2&0x1f)|0x80;//关闭led 110
  P0=0xff;
  P2&=0x1f;
  P2=(P2&0x1f)|0xa0;//关闭继电器蜂鸣器 101
  P0=0;
  P2&=0x1f;
 }

关于底下这一行:

P2=(P2&0x1f)|0xa0;

上一篇文章有详细讲解,读者可以去自行阅读。这里是链接【单片机竞赛:LED灯的一般控制】

5.编写138选择函数

  void HC138(unsigned char n)
 {
  switch(n)
	{
		case 6:
			P2=(P2 & 0x1f) | 0xc0;
		break;
		case 7:
			P2=(P2 & 0x1f) | 0xe0;
		break;
 }

因为需要用到Y6与Y7两个端口,所以通过switch选择使用哪种。

6.编写数码管控制函数

	void showsmgb(unsigned char dat,unsigned pos)
	{
	HC138(6);
	P0=0x01 << pos;
    HC138(7);
    P0=dat;
	}
	void shousmga()
	{
		unsigned char i,j;
		for(i=0;i<8;i++)
		{
		   for(j=0;j<10;j++)
		   {
				 showsmgb(smg_daishu[j],i);
				 delay(60000);
		   }
		}
		for(j=0;j<16;j++)
		{
	       HC138(6);
	       P0=0xff;
           HC138(7);
           P0=smg_daishu[j];
	       delay(60000);
	    }
	}

1.Y6控制位置,Y7控制输入,shousmgb为通过选择HC138的端口,来输出所以需要的输出的东西
2.showsmga第一个for循环嵌套一个for循环,懂得c语言基础的读者很容易了解到,为了从首到尾依次亮,i为位置,j为数据。如有需要了解参寻五毛变向的博客
3.第二个for循环为全亮,将smg_daishu[j];中的所有数据依次显示。

P0=0x01 << pos;

关于上面一行,这里为什么是左移运算符,因为数码管从左到右亮,其实为从数据的低位到高位,但是计算机中二进制低位在右,所以是左移运算符。

7.整合所有函数

#include "reg52.h"
 void delay(unsigned int t)
 {
    while(t--);
	while(t--);
 }
unsigned char code smg_daishu[18]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
 0x88,0x80,0xc6,0xc0,0x86,0x8e,
 0xbf,0x7f};//0123456789 abcdef - .
 void HC138(unsigned char n)
 {
  switch(n)
	{
		case 6:
			P2=(P2 & 0x1f) | 0xc0;
		break;
		case 7:
			P2=(P2 & 0x1f) | 0xe0;
		break;
   }
 }
	void showsmgb(unsigned char dat,unsigned pos)
	{
	HC138(6);
	P0=0x01 << pos;
    HC138(7);
    P0=dat;
	}
	void shousmga()
		{unsigned char i,j;
		for(i=0;i<8;i++)
		{
		   for(j=0;j<10;j++)
		   {
				 showsmgb(smg_daishu[j],i);delay(60000);
		   }
		}
		 for(j=0;j<16;j++)
		   {
				 HC138(6);
	             P0=0xff;
                 HC138(7);
                 P0=smg_daishu[j];
				 delay(60000);
	     }
		 }
		void stop()
		{
		 P2=(P2&0x1f)|0x80;
         P0=0xff;
         P2&=0x1f;
	     P2=(P2&0x1f)|0xa0;
         P0=0;
         P2&=0x1f;
		 }
			
	main()
	{ stop();
   while(1)
	 {
		 shousmga();
		 delay(60000);
	 }
		 
 }

将所需要循环的放入主函数的for循环中,将关闭外设代码放入主函数中,大功告成。

总结

将数码管所需显示的数据放入数组中存取,是一个良好的编程手法,如需显示其他的也可以这样使用,搞清楚com端与所显示的区别,关于数码管静态编程的部分你就掌握的差不多啦。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值