51之数码管

基本原理

,数码管分为共阴和共阳数码管电路图如下在这里插入图片描述在这里插入图片描述

区别在上,以下实验是由共阳数码管实现。
共阳数码管com必须要给予一个高电平才能给对应数码管使能,再使能的同时必须给对应引脚给一个低电平才能亮。然后如何让数码管显示几个数字,一般方法就是:用定时器的控制来一个个数码管显示,在时间很短的情况下人眼根本无法看出
具体代码如下

main.c

#include"bsp_init.h"
#include"bsp_mit.h"
#include"nixie_init.h"
#include<stdio.h>

unsigned char seg_buf[20]="2022.11.04.";
unsigned char seg_cmd[10];
unsigned char str[8];
unsigned char post=0;
void main()
{
	Cls_Peripheral();
  Mit_Init();
	
	sprintf(seg_cmd,"%s",seg_buf);//将seg_buf中的数据多加几个空格,穿过去到seg_cmd中
	Transf_Str(str,seg_cmd); //把seg_cmd中的数据(这里的数据是已经将对应字符转换成了对应的灯的亮灭)转移到str中
	EA=1;                             //打开中断
	while(1);
}



void Timer0_Rountine() interrupt 1
{                                    
	
	Seg_Dis(str,post);//使能函数对数码管进行使能
	post++;
	if(post==8) post=0;
}

数码管函数的代码nixie_init.c

#include"nixie_init.h"

//将str_buf中的数据传到string的数据中

void Transf_Str(unsigned char *string,unsigned char *str_buf)
{
	unsigned int  i=0;
	unsigned int  j=0;
	unsigned char temp;
	
	for(i=0;i<=7;i++,j++)
  {
	   switch(str_buf[j])
     {
		  case '0':	temp = 0xc0; break;			
			case '1':	temp = 0xf9; break;			
			case '2':	temp = 0xa4; break;			
			case '3':	temp = 0xb0; break;		
			case '4':	temp = 0x99; break;			
			case '5':	temp = 0x92; break;			 
			case '6':	temp = 0x82; break;			
			case '7':	temp = 0xf8; break;		
			case '8':	temp = 0x80; break;			
			case '9':	temp = 0x90; break;
			
			case '-': temp = 0xbf; break;
			case ' ': temp = 0xff; break;
			default :	temp = 0xff; break;		 
		 }
		 
		 if(str_buf[j+1]=='.')//这个如果遇到'.'可以直接跳过
     {
		  temp&=0x7f;//temp可以直接或一个第八位为零
			j++;
		 }
		 string[i]=temp;
	}
}

//这里string是将改变好的值传入过来,然后point是来传入
void Seg_Dis(unsigned char *nstring,unsigned char point)
{ 
	   
	     /*总结:P0应该直接等于,不能按位操作,按位操作就不对了,选通Y6是来选择数码管的。
	然后选通Y7是点亮数码管,点亮前应该直接先进行清空屏幕P0=0xff。*/
	
      P2&=~(0x07<<5);//将P2的5,6,7位清零
	    P2|=0x03<<6;//将P2的6,7位置1
	   // P2 = P2 & 0x1F | 0xC0; // 0xC0,选通Y6,也就是位码的锁存器,将数据透传过去
	    //选通Y6锁存器 
	    P0=1<<point;//选择数码管
			P2&=0x1f;//将打开的锁存器全部锁住
			
			P0=0xff;//清空屏幕
			//选通Y7锁存器
			P2&=~(0x07<<5);//将P2的5,6,7位清零
			P2|=0x07<<5;//将P2的5,6,7位置1
			
		  //P2 = P2 & 0x1F | 0xE0; //0xE0,选通Y7,也就是段码的锁存器,将数据透传过去
			P0=nstring[point];//p0来赋值,点亮对应数码管
			P2&=0x1f;//将打开的锁存器全部锁住
						
} 

定时器部分的代码bsp_mit.c

#include"bsp_mit.h"

//定义一个1ms的定时器
void Mit_Init()
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时

	ET0=1;      //定时器0中断闭合
	EA=0;       //总中断开关闭合
}

关闭外设代码

#include"bsp_init.h"

/*1.函数名:关闭所有外设
  2.传入参数:无类型
	3.返回值:无
	4.函数功能:实现外设的关闭,灯LED进行初始化。*/
	
void Cls_Peripheral(void)
{
	P2|=0xe0;
	P2&=(0x01<<6);//将Y5选通,就是外设的锁存器,数据通过去
	P0=0x00;//将外设数据全部灭掉做准备
	P2&=0x1f;//将打开的锁存器全部锁住
	
	P2|=(0x01<<7);
	P2&=(~(0x03<<5));//将LED的Y4锁存器打开
	P0=0xff;//关闭LED灯
	P2&=0x1f;//将打开的锁存器全部锁住
	 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值