惠州市胜克机电设备有限公司 版权所有
Copyright By www.hzskjd.com |
74HC595简介:
详细资料:http://web32558.web-60.com/Article.asp?id=40
74HC595同数据相关的引脚可以分为三类:
DS:串行数据输入,接单片机的某个数字I/O引脚。
Q0~Q7:8位并行数据输出,可以直接控制8个LED,或者是七段数码管的8个引脚。
Q7′:级联输出端,与下一个74HC595的DS相连,实现多个芯片之间的级联。
74HC595同控制相关的引脚一共有四个:
SH_CP:移位寄存器的时钟输入。上升沿时移位寄存器中的数据依次移动一位,
即Q0中的数据移到Q1中,Q1中的数据移到Q2中,依次类推;下降沿时移位寄存
器中的数据保持不变。
ST_CP:存储寄存器的时钟输入。上升沿时移位寄存器中的数据进入存储寄存器,
下降沿时存储寄存器中的数据保持不变。应用时通常将ST_CP置为低点平,移位
结束后再在ST_CP端产生一个正脉冲更新显示数据。
MR:重置(RESET),低电平时将移位寄存器中的数据清零,应用时通常将它直
接连高电平(VCC)。
OE:输出允许,高电平时禁止输出(高阻态)。引脚不紧张的情况下可以用
单片机的一个引脚来控制它,这样可以很方便地产生闪烁和熄灭的效果。实际
应用时可以将它直接连低电平(GND)。
对于一个最简单的74HC595应用来讲,可以用单片机的三个数字I/O端口分别控
制DS、SH_CP和ST_CP,然后将MR和OE分别接VCC和地。
3461AH 共阴数码管 简介:
管脚排序是将显示数字面对你,即正面观察数码管,左下为第一针,
逆时针方向,右下为第六针,右上为第七针,左上为第十二针。
其中12-9-8-6公共脚,A-11 B-7 C-4 D-2 E-1 F-10 G-5 DP-3。
电路原理图:
程序:
/************************************************
* 文件描述 : 74HC595简单操作
* 程序文件 : main.c
* 版 本 : 1.0
* 作 者 : yongheng0852
* 日 期 : 2014.04.03
* 芯 片 : IAP15F2K61S2
* 时 钟 :内部11.0592MHz
* 开发环境 :Keil uVision4
* 备 注 : 阅读文档的帮助文件
************************************************/
#include<stc15f2k60s2.h>
#define uchar unsigned char
#define uint unsigned int
sbit OE_595 = P4^5; //74HC595的13脚,使能信号,低电平(允许)有效
sbit SH_CP_595 = P4^2; //74HC595的11脚,移位寄存器的时钟输入。上升沿时移位寄存器中的数据依次移动一位
sbit ST_CP_595 = P4^1; //74HC595的12脚,锁存寄存器的时钟输入。上升沿时移位寄存器中的数据进入存储寄存器
sbit DI_595 = P3^7; //74HC595的14脚,数据端口,第一个芯片DS为14脚,第二个芯片的DS接第一个芯片的9脚(Q7")
uint led_qw,led_bw,led_sw,led_w,led_q,led_b,led_s,led_g; //定义数码管数据分配位
unsigned long sum_595; //定义数码管需要显示数据的全局变量
unsigned char code numtab[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
//定义数码管所需显示0到F的数据,数码管位共阴极
void delay1ms(uint k) //延时子函数
{
uint a,b;
for(a=k;a>0;a--)
for(b=0;b<100;b++);
}
void LED_595(uchar wei_595,duan_595) //数据写入函数子函数
{
uchar i,w,d; //定义局部变量,用于保存程序的形参
w=~wei_595; //单独一个数码管 ,因为数码管是共阴极,所以位码是低电平有效,将位码取反保存于局部变量W中。
d=duan_595; //数码管的一段,保存形参中的段码
OE_595=0; //芯片使能,使之显示数据
ST_CP_595=0; //锁存寄存器的时钟输入拉低(高电平有效)
/*************************************************************************************************************
开发板使用两片74HC595芯片来驱动8位数码管,第一个芯片用于
驱动位码,第二个芯片用于驱动段码,在程序写入数据的时候,
必须先写入8位段码,再写入8位位码。此程序使用for循环写入
数据,一次写入8位,分两次写入,由于芯片的处理时间为ns时
间,单片机是us时间,故不需要延时
**************************************************************************************************************/
for(i=0;i<8;i++) //段码写入
{
SH_CP_595=0; //将移位寄存器时钟拉低(高电平有效)
d=d<<1; //将段码数据左移一位,使最高位移动到溢出标志位CY
DI_595=CY; //将CY,赋值给DS,数据位
SH_CP_595=1; //拉高移位寄存器的始终,使数据写入芯片
};
for(i=0;i<8;i++) //位码写入
{
SH_CP_595=0; //将移位寄存器时钟拉低(高电平有效)
w=w<<1; //将位码数据左移一位,使最高位移动到溢出标志位CY
DI_595=CY; //将CY,赋值给DI,数据位
SH_CP_595=1; //拉高移位寄存器的始终,使数据写入芯片
};
ST_CP_595=1; //锁存寄存器的时钟输入拉低(高电平有效)
}
/*************************************************************************************************************
数码管数据分配,计算各个数码管需要显示的位数, /除法运算(或者求模),%求余运算
例如123:
(百位是1 则:123/100得到商为1), 123/100=1;
(十位是2 则:123%100得到余数23,再将23/10得到商为2), 123%100/10=2;
(个位是3 则:123%100得到余数23,再将23%10得到余数为3), 123%100%10=3;
**************************************************************************************************************/
void led_displsy(unsigned long led_data) //数码管显示函数
{
unsigned long led_sum; //定义分离变量
led_sum=led_data;
led_qw=led_sum/10000000; //千万//led_qw,led_bw,led_sw,led_w,led_q,led_b,led_s,led_g;
led_bw=led_sum%10000000/1000000; //百万
led_sw=led_sum%10000000%1000000/100000; //十万
led_w =led_sum%10000000%1000000%100000/10000; //万
led_q =led_sum%10000000%1000000%100000%10000/1000; //千
led_b =led_sum%10000000%1000000%100000%10000%1000/100; //百
led_s =led_sum%10000000%1000000%100000%10000%1000%100/10; //十
led_g =led_sum%10000000%1000000%100000%10000%1000%100%10; //个
LED_595(0x1,numtab[led_qw]); //调用写入函数
delay1ms(10);
LED_595(0x2,numtab[led_bw]);
delay1ms(10);
LED_595(0x4,numtab[led_sw]);
delay1ms(10);
LED_595(0x8,numtab[led_w]);
delay1ms(10);
LED_595(0x10,numtab[led_q]);
delay1ms(10);
LED_595(0x20,numtab[led_b]);
delay1ms(10);
LED_595(0x40,numtab[led_s]);
delay1ms(10);
LED_595(0x80,numtab[led_g]);
delay1ms(10);
}
void main(void)
{
while(1)
{
sum_595++;
if(sum_595==99999999)sum_595=0; //当变量值超过数码管能显示的值时,使分离数据等于0;
led_displsy(sum_595); //调用数码管显示函数
}
}
惠州市胜克机电设备有限公司 版权所有
Copyright By www.hzskjd.com |