标准模版——添加数码管功能模块

一、seg.h代码

#include "STC15F2K60S2.H"
#include "stdio.h"  

void Seg_Tran(unsigned char *pucSeg_Buf,unsigned char *pucSeg_Code);
void Seg_Disp(unsigned char *pucSeg_Code,unsigned char ucSeg_Pos);

二、seg.c代码

#include "seg.h"

//段码转换函数
//0xc0
//1100 0000  
//以上分别对应这8位dp g f e d c b a
//共阳数码管为低电平时被点亮
//传入两个数组,第一个为传入的想要转换的数,第二个为相对应的转换后的段码
//之所以为*,因为传进来的不只是一个字符,而是一个字符串或者是一个字符数组
void Seg_Tran(unsigned char *pucSeg_Buf,unsigned char *pucSeg_Code)
{
	unsigned char i,j;
	for(i=0,j=0;i<=7;i++,j++)
	{
		switch(pucSeg_Buf[j])
		{
			case '0':
				pucSeg_Code[i]=0xc0;
			break;
			case '1':
				pucSeg_Code[i]=0xf9;
			break;
			case '2':
				pucSeg_Code[i]=0xa4;
			break;
			case '3':
				pucSeg_Code[i]=0xb0;
			break;
			case '4':
				pucSeg_Code[i]=0x99;
			break;
			case '5':
				pucSeg_Code[i]=0x92;
			break;
			case '6':
				pucSeg_Code[i]=0x82;
			break;
			case '7':
				pucSeg_Code[i]=0xf8;
			break;
			case '8':
				pucSeg_Code[i]=0x80;
			break;
			case '9':
				pucSeg_Code[i]=0x90;
			break;
			case 'A':
				pucSeg_Code[i]=0x88;
			break;
			case 'b':
				pucSeg_Code[i]=0x83;
			break;
			case 'C':
				pucSeg_Code[i]=0xc6;
			break;
			case 'd':
				pucSeg_Code[i]=0xa1;
			break;
			case 'E':
				pucSeg_Code[i]=0x86;
			break;
			case 'F':
				pucSeg_Code[i]=0x8e;
			break;
			case ' ':
				pucSeg_Code[i]=0xff;
			break;
		}
		if(pucSeg_Buf[j+1] =='.')
			{
				pucSeg_Code[i]&=0x7F;//0111 1111l与运算,与1不变,与0取反
				j++;
			}
	}
}

void Seg_Disp(unsigned char *pucSeg_Code,unsigned char ucSeg_Pos)
{
	
		P0 =pucSeg_Code[ucSeg_Pos];	
		P2=P2&0x1F|0xE0;	
		P2=P2&0x1F;
	
		P0 =1<<ucSeg_Pos;//根据ucSeg_Pos的值,只有对应位置为1,实现了对任一个想要点亮的数码管的控制
		P2=P2&0x1F|0xC0;	
		P2=P2&0x1F;
		
}

三、主函数代码

unsigned char pucSeg_Buf[12],pucSeg_Code[8];

pucSeg_Buf开了12位因为有/0,并且可能有小数点

pucSeg_Code 一共有8位数码管,所以开8位

#include "tim.h"
#include "init.h"
#include "led.h"
#include "seg.h"
#include "stdio.h"
//Timer
unsigned long ulms=0;
unsigned int uiLed_Dly=0;
unsigned int uiSeg_Dly=0;
//LED
unsigned char ucLed=0x25;
//Seg
unsigned char ucSeg_Pos=0;
unsigned char pucSeg_Buf[12],pucSeg_Code[8];
//Function
void Led_Proc(void);
void Seg_Proc(void);
void main()
{
	Cls_Peripheral();
	Timer0Init();
	EA=1;
	
	while(1)
	{
		Led_Proc();
		Seg_Proc();
	}
}
void Led_Proc(void)
{
	if(uiLed_Dly<200)
		return;
	uiLed_Dly=0;
	Led_Disp(ucLed);
}
void Seg_Proc(void)
{
	if(uiSeg_Dly<200)
	return;
	uiSeg_Dly=0;
	
	sprintf(pucSeg_Buf,"12.34 124");//将文字存储到数组中
	Seg_Tran(pucSeg_Buf,pucSeg_Code);//将存入的数组中的内容转换成段码
}
void Time_0(void) interrupt 1
{
	ulms++;
	uiLed_Dly++;
	uiSeg_Dly++;
	
	if(ulms%2==0)//数码管2ms循环一次,因为数码管没有办法一次性显示不同内容,因此逐位去点来点亮
	{
		ucSeg_Pos=(ucSeg_Pos+1)%8;//ucSeg_Pos会在0-7之间循环,依次点亮数码管的每个位
		Seg_Disp(pucSeg_Code,ucSeg_Pos);//基于段码,让对应的位进行显示
		
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值