驱动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;
}
}
}
}
谢谢观看!