单片机数码管显示

驱动15系列单片机显示指定数字到数码管
检测引脚电平,当输入为低电平时,74HC595驱动数码管显示1234,当引脚检测为高电平时,显示5678,
15系列单片机需要自己写一个.h头文件,共阳极数码管SEG通过2个74HC595(U8段选择
和U11位选)和MCU相连。74HC595是八位串并转换器,由八位移位寄存器,八位并行锁存器和八位三态驱动器组成,移位寄存器的串行数据输入端为A,串行数据输出端是SQH,移位时钟端是SCK(上升沿移位),并行锁存器的锁存端是LCK(上升沿所存),三态驱动器的允许端是OE(低电平允许)。
P4.0和U8串行数据输入端A相连,U8的串行数据输出端和SQH与U11的串行数据输入端A相连,P4.3与U8和U11的位移时钟端SCK相连,P4.2与U8和U11的并行锁存器的锁存端LCK相连,P4.1与U8和U11的三态驱动器的允许端OE相连。
数码管显示时,首先通过P4.0串行输出第一位显示的位码(四位)和段码(八位,高位在前),P4.3控制数据移位,12位输出完成后P4.2并行锁存数据,P4.1允许输出。第一位数码管亮,延时一定时间后输出第二位的位码和段码,四位输出完成后循环。
原理图略过,,,,,,
.h头文件如下

#ifndef _QEX16_H
#define _QEX16_H
void Seg_Tran(unsigned char *pucSeg_Buf,unsigned char *pucSeg_Code);
void Seg_Disp(unsigned char *pucSeg_Code,unsigned char ucSeg_Pos);
#endif
sfr P4=0xc0;
sbit DAT=P4^0;
sbit OE=P4^1;
sbit LCK=P4^2;
sbit SCK=P4^3;
void Seg_Tran(unsigned char *pucSeg_Buf,unsigned char *pucSeg_Code)
//pucSeg_Buf显示字符串,pucSeg_Code显示字形码
{
	unsigned char i,j=0,ucSeg_Code;
	
	for(i=0;i<4;i++,j++)
	{
		switch(pucSeg_Buf[j])
		{
		//低电平点亮
			case'0':ucSeg_Code=0xc0;break;
			case'1':ucSeg_Code=0xf9;break;
			case'2':ucSeg_Code=0xa4;break;
			case'3':ucSeg_Code=0xb0;break;
			case'4':ucSeg_Code=0x99;break;
			case'5':ucSeg_Code=0x92;break;
			case'6':ucSeg_Code=0x82;break;
			case'7':ucSeg_Code=0xf8;break;
			case'8':ucSeg_Code=0x80;break;
			case'9':ucSeg_Code=0x90;break;
			case'A':ucSeg_Code=0x88;break;
			case'B':ucSeg_Code=0x83;break;
			case'C':ucSeg_Code=0xc6;break;
			case'D':ucSeg_Code=0xA1;break;
			case'E':ucSeg_Code=0x86;break;
			case'F':ucSeg_Code=0x8E;break;
			case'H':ucSeg_Code=0x89;break;
			case'L':ucSeg_Code=0xC7;break;
			case'-':ucSeg_Code=0xbf;break;
			default:ucSeg_Code=0xff;
		}
		//小数点的处理
 		if(pucSeg_Buf[j+1]=='.')
		{
			ucSeg_Code&=0x7f;
			j++;
		}
		pucSeg_Code[i]=ucSeg_Code;
	}
}

void Seg_Disp(unsigned char *pucSeg_Code,unsigned char ucSeg_Pos)
{
	unsigned char i;
	unsigned int temp;
	
	temp=(1<<(8+ucSeg_Pos))+pucSeg_Code[ucSeg_Pos];
	LCK=0;
	for(i=0;i<12;i++)
	{
		SCK=0;
		if(temp&0x800)
			DAT=1;
		else 
			DAT=0;
		temp<<=1;
		SCK=1;//移位
	}
	LCK=1;//锁存
	OE=0;
}
	

.c文件

#include <reg51.h>
#include <stdio.h>
#include <2.h>
sfr T2H=0xd6;
sfr T2L=0xd7;
sfr AUXR=0x8e;
sfr AUXR1=0xa2;
sbit P04=P0^4;
unsigned char ucSec=0;
unsigned char pucSeg_Buf[6],pucSeg_Code[4],ucSeg_Pos=0;
unsigned char ucUart_Buf[2],ucUart_Num=0;
unsigned int uims=0,uiSeg_Dly=0;
unsigned int num;
void T1_init()//初始化T1
{
	TH1=0xfc;
	TL1=0x18;
	TR1=1;
}
void T1_Proc()//T1处理
{
	if(!TF1)
		return;
	TF1=0;//清除时间到标志
	uims++;
	if(uims==1000)//1ms
	{
		uims=0;
		ucSec++;
		if(ucSec==60)//1min
			ucSec=0;
	}
	if((uims&3)==0)
	{
		Seg_Disp(pucSeg_Code,ucSeg_Pos);//循环显示
		ucSeg_Pos++;
		if(ucSeg_Pos==4)
			ucSeg_Pos=0;
	}
	uiSeg_Dly++;
	if(uiSeg_Dly==500)
		uiSeg_Dly=0;
}
	
	

void Seg_Proc()//数码管刷新
{
	if(uiSeg_Dly!=0)
		return;
	uiSeg_Dly=1;
	Seg_Tran(pucSeg_Buf,pucSeg_Code);
	sprintf(pucSeg_Buf,"%04u",num);
}
void main()
{
	T1_init();
	while(1)
	{
		T1_Proc();
		Seg_Proc();
	{
		if(P04==0)
		{
			num=1234;
		}
		else
		{
			num=5678;
		}
	}
}
	}
                       谢谢观看!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值