找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4892|回复: 2
收起左侧

入门第一个74HC595驱动 C语言

[复制链接]
ID:374522 发表于 2018-7-19 08:42 | 显示全部楼层 |阅读模式
/********   实验驱动74HC595 芯片********
     单片机型号:ATMEGA48PA

   /********** 74HC595电平逻辑*********************
   SI   SCK   SCLR   RCK     OE   输出管脚
   X     X      X     X      H    QA--QH 输出高阻
   X     X      X     X      L    QA--QH 输出有效值
   X     X      L     X      X    称位寄存器清零
   L   上沿     H     X      X    称位寄存器存储 L
   H   上沿     H     X      X    称位寄存器存储 H
   x   下沿     H     X      X    称位寄存器壮态保持
   X     X      X    上沿    X    输出存储器锁存(移位寄存器中的壮态值)
   X     X      X    下沿    X    输出存储器壮态 保持
   **************分析******************
   实计使用:
    SI   数据       (14脚)
        RCK  锁存       (12脚)
        SCK  时钟       (11脚)
       OE 与 RCK 相连  (13脚)
           SCLR 接高电平   (10脚)
   ***************************************/
//ICC-AVR application builder : 2017-12-5 17:22:41
// Target : m48
// Crystal: 1.0000Mh
/***************************************************/
#include <iom48v.h>
#include <macros.h>
#define uchar unsigned char
#define uint  unsigned int
extern unsigned int a  =  10;    //延时基数
extern unsigned int b  =  1;      //并行数据 初使参数
extern unsigned int c  =  0;
// int temp=0b00000001;   //  移位数据 初使参数
/**************分析******************
    实计使用:
    SI   数据   (14脚)
        RCK  锁存   (12脚)
        SCK  时钟   (11时钟)
   注意:第调用一次 脚位电平反转 ^=
***************************************/
#define   SI_1    PORTB  |=  (1<<0)  
#define   SI_0    PORTB  &= ~(1<<0)

#define   SCK_1   PORTB  |= (1<<1)  
#define   SCK_0   PORTB  &=~(1<<1)  

#define   RCK_1   PORTB  |= (1<<2)
#define   RCK_0   PORTB  &=~(1<<2)


/************端口初使化******************************/
void port_init(void)
{
  PORTB = 0x00;
  DDRB  = 0xFF;
  PORTC = 0x00;
  DDRC  = 0xFF;
  PORTD = 0B00000011;
  DDRD  = 0xFF;

}
/***************mS延时***********************/
void Delay_ms(unsigned int Time)
{
  unsigned char n=0;
    while(Time>0)
    {   
        for (n=1;n<187;n++)
        {
            NOP();
        }
        Time--;
    }
}
/***********显示/字**************************/
const unsigned char DisTab[]=  
{ 0b00000000,  // 0
  0b00000001,  // 1
  0b00000011,  // 2
  0b00000111,  // 3
  0b00001111,  // 4
  0b00011111,  // 5
  0b00111111,  // 6
  0b01111111,  // 7
  0b11111111,  // 8
// 0b00000000,  // 9
};
/********将显示数据装入74HC595内部移位奇存器*****/
void WR_595(char c)
{
     char  unm,j,i,x; //定义3个(16位)常量
         unm=DisTab[c];        // 显示数据存入 unm 中
         for (j=0;j<7;j++)
         {  
                SCK_1;             //上沿 移位寄存器(存储)
          //  x = unm&0x80;      //数据 (unm 与 0X80)与运算后存入X
                 x = unm&0b1000000;
                if(x==0)           // 数据写到 SI 端口
                  {
                   SI_0;  //如果X==0,SI_1 数据写1,
                  }
                  else             //如果X==0,SI_1 数据写0,
                     {
                       SI_1;
                     }
             SCK_0;             //下沿 移位寄存器(壮态保持)
                 unm = unm<<1;      //数据移位
      }
  }                       
/**********锁存并显示**************/
void OUT_595(void)
    {
             RCK_1;             //上沿,壮态锁存
                 RCK_0;             //下沿,保持74HC595输出壮态
                 Delay_ms(500);    //延时 74HC显示一段时间
    }
/**********************************/



/***************开始***********************/
void main(void)
{  
    port_init();            //端口初使化
  while(1)                  //超极循环
   {
        char i;
                for(i=0;i<8;i++)
                    {   
                            WR_595(2);   //显示数据装入并显示
                                OUT_595();
                    }               
                 
   }  

}


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:374522 发表于 2018-7-20 20:32 | 显示全部楼层
不好意思,还不会传图片
回复

使用道具 举报

ID:1 发表于 2018-7-19 15:58 | 显示全部楼层
楼主能分享下原理图吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表