基本原理
,数码管分为共阴和共阳数码管电路图如下
区别在上,以下实验是由共阳数码管实现。
共阳数码管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;//将打开的锁存器全部锁住
}