单片机 74HC595 实例

1、采用2片595驱动数码管,需要单片机3路IO口根据数码管动态扫描原理进行显示。
2、数码管型号:0.36 4位共阳。

原理图

在这里插入图片描述

点亮一个数码管

定义IO口

sbit DIO  = P1^0; //串行数据口
sbit S_CLK = P1^2;//移位寄存器时钟
sbit R_CLK = P1^1;//输出锁存器时钟

发送数据

 void  main()
 {
 	//第二个数码管显示0
	unsigned char i, dat;//i循环次数  dat需要发送的数据
	dat = 0xc0;//发送列值
	for(i=0; i<8; i++)//循环8次
	{
		S_CLK = 0;//拉低移位寄存器时钟
		R_CLK = 0;//拉低输出锁存器时钟
		//先发送高位
		if(dat & 0x80)//发送1 
			DIO = 1;
		else		  //发送0
			DIO = 0;
		S_CLK = 1;//拉高移位寄存器时钟,数据移位
		dat <<= 1;//数据左移
	}
	dat = 0x02;//发送行值
	for(i=0; i<8; i++)//循环8次
	{
		S_CLK = 0;//拉低移位寄存器时钟
		R_CLK = 0;//拉低输出锁存器时钟
		if(dat & 0x80)//发送1
			DIO = 1;
		else		  //发送0
			DIO = 0;
		S_CLK = 1;//拉高移位寄存器时钟,数据移位
		dat <<= 1;//数据左移
	}
	R_CLK = 1;//拉高输出锁存器时钟,并行输出数据
	while(1);
 }

在这里插入图片描述

点亮8位数码管

#define uchar unsigned char

void main (void);					// 主函数
void LED4_Display (void);			// LED显示
void LED_OUT(uchar X);				// LED单字节串行移位函数

unsigned char code LED_0F[];		// LED字模表

sbit DIO = P1^0;				//串行数据输入
sbit R_CLK  = P1^1;				//输出锁存器时钟——上升沿有效
sbit S_CLK = P1^2;				//移位寄存器时钟————上升沿有效

//-----------------------------------------------------------------------------
// 全局变量
uchar LED[8];	//用于LED的8位显示缓存


//*****************************************************************************
// 主程序
//
void main (void) 
{

	LED[0]=1;
	LED[1]=2;
	LED[2]=3;
	LED[3]=4;
	LED[4]=5;
	LED[5]=6;
	LED[6]=7;
	LED[7]=8;

	while(1)
	{
		LED4_Display ();
	} 
} 

void LED4_Display (void)
{
	unsigned char code *led_table;          // 查表指针
	uchar i;
	//显示第1位
	led_table = LED_0F + LED[0];
	i = *led_table;

	LED_OUT(i);			
	LED_OUT(0x01);		

	R_CLK = 0;
	R_CLK = 1;
	//显示第2位
	led_table = LED_0F + LED[1];
	i = *led_table;

	LED_OUT(i);		
	LED_OUT(0x02);		

	R_CLK = 0;
	R_CLK = 1;
	//显示第3位
	led_table = LED_0F + LED[2];
	i = *led_table;

	LED_OUT(i);			
	LED_OUT(0x04);	

	R_CLK = 0;
	R_CLK = 1;
	//显示第4位
	led_table = LED_0F + LED[3];
	i = *led_table;

	LED_OUT(i);			
	LED_OUT(0x08);		

	R_CLK = 0;
	R_CLK = 1;
	//显示第5位
	led_table = LED_0F + LED[4];
	i = *led_table;

	LED_OUT(i);			
	LED_OUT(0x10);	

	R_CLK = 0;
	R_CLK = 1;
	//显示第6位
	led_table = LED_0F + LED[5];
	i = *led_table;

	LED_OUT(i);			
	LED_OUT(0x20);	

	R_CLK = 0;
	R_CLK = 1;
	//显示第7位
	led_table = LED_0F + LED[6];
	i = *led_table;

	LED_OUT(i);			
	LED_OUT(0x40);	

	R_CLK = 0;
	R_CLK = 1;
	//显示第8位
	led_table = LED_0F + LED[7];
	i = *led_table;

	LED_OUT(i);		
	LED_OUT(0x80);	

	R_CLK = 0;
	R_CLK = 1;
}

void LED_OUT(uchar X)
{
	uchar i;
	for(i=8;i>=1;i--)
	{
		if (X&0x80) DIO=1; else DIO=0;
		X<<=1;
		S_CLK = 0;
		S_CLK = 1;
	}
}

unsigned char code LED_0F[] = 
{// 0	 1	  2	   3	4	 5	  6	   7	8	 9	  A	   b	C    d	  E    F    -
	0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf
};

在这里插入图片描述

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值