STC15F104W控制3个74HC595芯片输出数码管显示

一、74HC595脚位图及说明

STC15F104W控制3个74HC595芯片输出数码管显示_第1张图片

管脚说明:

14脚:DS(SER),串行数据输入引脚
13脚:OE,输出使能控制脚,它是低电才使能输出,所以接GND
12脚:RCK(STCP),存储寄存器时钟输入引脚。上升沿时,数据从移位寄存器转存到存储寄存器。
11脚:SCK(SHCP),移位寄存器时钟引脚,上升沿时,移位寄存器中的bit 数据整体后移,并接受新的bit(从SER输入)。
10脚:MR,低电平时,清空移位寄存器中已有的bit数据,一般不用,接 高电平即可。
9 脚 :串行数据出口引脚。当移位寄存器中的数据多于8bit时,会把已有的bit“挤出去”,就是从这里出去的。用于595的级联。
Q0~Q7:并行输出引脚
使用参数:

VCC:2V~6V,5V最好
IQn:± 35mA

工作流程:

DS收到一位,SCK来一个上升沿,将这位数据放入队列中,然后重复前面的步骤,等第8次时RCK来一个上升沿,将收到的8为数据存储到存储寄存器中。如果级联n个74HC595的话,需要8n次后再控制RCK来一个上升沿。

STC15F104W控制3个74HC595芯片输出数码管显示_第2张图片

实验例程

#include
#include

typedef unsigned char uchar;
typedef unsigned int uint;

/**********函数声明********************/
void SendTo595(uchar byteData);
/***********************************/

sbit SER = P3^4;    //p3.4脚控制串行数据输入
sbit SCK = P3^6;    //串行输入时钟
sbit RCK = P3^5;    //存储寄存器时钟


void main()
{

       SendTo595(85);  //85的二进制:0101 0101
       
       while(1);


}

//功能:发送一个字节的数据给595,再并行输出
void SendTo595(uchar byteData)
{
   char i=0;
    for(;i<8;i++)
   {
           SER = byteData>>7;         //大家自己考量这2句
        byteData= byteData<<1;      

          SCK = 1;          //上升沿,让串行输入时钟变为高电平,并延时2个时钟周期
        _nop_();
        _nop_();

        SCK = 0;          //变为低电平,为下次准备
   }  
   
   /*位移寄存器数据准备完毕,转移到存储寄存器*/
   RCK = 1;         //上升沿,让存储寄存器时钟变为高电平,并延时2个时钟周期
   _nop_();
   _nop_();
   RCK = 0; 

}
遇到问题:

问题1:串口无法下载

问题解决:用另一个项目的板子就可以下载,所以将可能影响串口TTL电平的电阻和三极管去掉后就可以下载了,因为这里是将3.3V的TTL电平转换成了5V的。

问题2:配置io口输出,io口电平只有0.15V

问题解决:对照另一个项目的板子发现另一块板子的io电平是5V,这块板子的IO口下拉了,最终通过设置IO口推挽输出模式解决了下拉的问题。

经验总结:

数码管显示0-9:

uchar num0_9[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};//分别显示0 1 2 3 4 5 6 7 8 9 和 暗

级联代码:

//向数码管写入要显示的数据

void digit_display(unsigned char dat1,unsigned char dat2,unsigned char dat3)

{

   char i=0;

   for(i=0;i<8;i++)

   {

      SH_CP = 0;

   

      DS=0x80&dat3;//&为按位运算符,即全1为1,有0为0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位为1则是1高位为0则这个式子为0

   

      dat3=_crol_(dat3,1); //左移一位 将高位补给低位,如果二进制数为01010101 那么_crol_(1) 为10101010

      SH_CP = 1;          //上升沿让串行输入时钟变成高电平 并延时一个时钟周期

      _nop_();

      _nop_();

   }  

   for(i=0;i<8;i++)

   {

      SH_CP = 0;

   

      DS=0x80&dat2;//&为按位运算符,即全1为1,有0为0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位为1则是1高位为0则这个式子为0

   

      dat2=_crol_(dat2,1); //左移一位 将高位补给低位,如果二进制数为01010101 那么_crol_(1) 为10101010

      SH_CP = 1;          //上升沿让串行输入时钟变成高电平 并延时一个时钟周期

      _nop_();

      _nop_();

   }

   for(i=0;i<8;i++)

   {

      SH_CP = 0;

   

      DS=0x80&dat1;//&为按位运算符,即全1为1,有0为0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位为1则是1高位为0则这个式子为0

   

      dat1=_crol_(dat1,1); //左移一位 将高位补给低位,如果二进制数为01010101 那么_crol_(1) 为10101010

      SH_CP = 1;          //上升沿让串行输入时钟变成高电平 并延时一个时钟周期

      _nop_();

      _nop_();

   }  

   /*位移寄存器完毕,转移到存储寄存器*/

   ST_CP = 0;         //上升沿,存储寄存器变为高电平 延迟两个时钟周期

   _nop_();

   _nop_();

   ST_CP = 1;

}

你可能感兴趣的:(单片机,嵌入式硬件)