玩单片机也有小几年了,虽然经常接触寄存器一词可确不能说完全会用,这两天一直在研究74HC595寄存器,把它摸透了之后顺带封装了一些函数,如果只是简单应用的话这些函数使用非常简单,分享给大家参考,欢迎下载学习。
用途还不少,我粗略想了一下,可以用在数码管、点阵、LCD屏,具体更多玩法可以自行研究,有新的改进成果别忘了踢我一下哦,我也想看看。
数据引脚定义可在“74HC595.c”文件中修改
可以看到,只需一个函数便可使用595芯片了,函数内可放数组可放16进制数值,第一位变量需要注意,这个变量只可填两种字符,L/R它们分别代表高位先传送和低位先传送,可以解决一些电路设计上的问题。
这里最直观的就是引脚顺序的问题,有时候设计好的pcb引脚顺序不一定是程序输出数值的顺序,这时候就只能重绘或者更改程序了,因为曾吃过此类亏所以顺便写了可调节方向的变量,方便使用。
这里是引脚顺序和程序顺序反向了,所以显示异常。这时候调整了方向函数之后就正常显示了。
如果还没理解的话看下图
引脚顺序来回调换都可以正常显示,只需要调整方向变量即可。
单片机源程序如下:
- #include "main.h"
- #include "74HC595.h"
- sbit SMG1 =P2^7;
- sbit SMG2 =P2^6;
- sbit SMG3 =P2^5;
- sbit SMG4 =P2^4;
- sbit SHCP = P2^0;
- sbit DS = P2^1;
- sbit STCP = P2^3;
- /*****自定义延时*****/
- void delay(int a)
- {
- u8 i,j;
- for(i=0;i<=a;i++){
- for(j=0;j<=16;j++)
- {;}
- }
- }
- /***标准20um延时****/
- void Delay20us()
- {
- unsigned char i;
- nop_();
- nop_();
- i = 71;
- while (--i);
- }
- /****串转并函数*****/
- void hc595_data(u8 order,u8 dat){
-
- u8 i=0;
- SHCP=0;
- STCP=0;
- for(i=0;i<8;i++){
- SHCP=0; //移位时钟信号拉低
- switch(order)
- {
- case 'R': DS=0x01&dat; //dat与0x01相与,保留高位1
- dat>>=1; break;//dat数据右移位
-
- case 'L': DS=0x80&dat;//dat与0x01相与,保留高位1
- dat<<=1; break; //dat数据左移位
- }
- SHCP=1; //移位时钟拉高,生成上升沿
- Delay20us();//延时20us,因芯片工艺而异
- }
- SHCP=0;
- STCP=0; //拉低寄存器数据输出时钟
- Delay20us();
- STCP=1; //拉高时钟生成上升沿
- }
- void hc595_del(void){ //数据清除函数
-
- u8 i=0;
- SHCP=0;
- STCP=0;
- for(i=0;i<8;i++){
- SHCP=0;
- DS=0x00; //往寄存器中填0,清空上一次数据
- Delay20us();
- SHCP=1;
- }
- SHCP=0;
- STCP=0;
- Delay20us();
- STCP=1;
- }
- void SMGbit(u8 Bit)
- {
- switch(Bit){ //数码管位选
- case 0: SMG4=1;SMG3=1;SMG2=1;SMG1=0; break;
- case 1: SMG4=1;SMG3=1;SMG2=0;SMG1=1; break;
- case 2: SMG4=1;SMG3=0;SMG2=1;SMG1=1; break;
- case 3: SMG4=0;SMG3=1;SMG2=1;SMG1=1; break;
- }
- hc595_del(); //清除寄存器数据,这很重要
- delay(10);
- }
复制代码
Keil代码与Proteus仿真下载:
74HC595(函数已打包).rar
(218.78 KB, 下载次数: 60)
|