文章
博客 网店

 74HC95驱动的数码管显示程序


main.c文件:

/********************************
  74HC95驱动的数码管显示程序
  文件名:main.c
  编译:WinAVR-20070122

  硬件环境:CA-M8X   打开的开关如下
            S6(1,2,5,6,7)   - 外部4MHz晶振和595接口
            J8(EN-SEG)      - 数码管显示允许
  
  芯艺设计室 2004-2007  版权所有 
  转载请保留本注释在内的全部内容
  WEB: http://www.chipart.cn
  Email: changfutong@sina.com
*******************************/

#include 
#include 
#include 

#define SER_PORT  PORTD
#define SER_DAT  PD4
#define SER_RCK  PD5
#define SER_SCK  PD6

//显示码(可从chipart.cn下载生成工具)
uint8_t g_aDisplayBuf[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void DelayMs(uint16_t t)
{
  uint16_t i;
  for(i=0;i     _delay_loop_2(250 * 4);
}

//向595 写一字节
void ser_out(uint8_t dat)
{
  uint8_t i;

  for(i=0;i<8;i++)
  {
    if(dat&0x80)
      SER_PORT|=_BV(SER_DAT);
    else
      SER_PORT&=~_BV(SER_DAT);
      
    //产生移位脉冲    
    SER_PORT|=_BV(SER_SCK);
    SER_PORT&=~_BV(SER_SCK);
    dat<<=1;
  }
}
//数码管显示数(0~255)
//num :显示的数   hex:是否用十六进制显示
void display_number(uint8_t num,uint8_t hex)
{
  uint8_t buf[2];//发送显示码缓冲区
  uint8_t temp;
  
  if(hex) //十六进制
  {
    buf[0]=g_aDisplayBuf[num>>4];//高位
    buf[1]=g_aDisplayBuf[num&0x0f];//低位
  }
  else//十进制
  {
    buf[1]=g_aDisplayBuf[num%10];
    temp=num%100;
    buf[0]=g_aDisplayBuf[temp/10];
    temp=num/100;
    
    if(temp>0)
      buf[1]|=0x80; //第一个数码管小数点表示百位1
    if(temp>1)
      buf[0]|=0x80;//两个数码管小数点表示百位2
  }
  
  //串行发送数据
  ser_out(buf[0]);
  ser_out(buf[1]);

  //产生锁存脉冲
  SER_PORT|=_BV(SER_RCK);
  SER_PORT&=~_BV(SER_RCK);
}

int main(void)
{
  uint8_t i=0;
  
  //595控制I/O初始化
  DDRD=_BV(SER_DAT)|_BV(SER_SCK)|_BV(SER_RCK);
  
  while(1)
  {
    display_number(i++,1);
    DelayMs(200);
  }
}

芯艺工作室    蒙ICP备06005492号
Copyright© 2004-2023 ChipArt Studio All Rights Reserved