当前位置:主页 > AVR单片机 > 164驱动8位LED显示 ICC程序
201709/06

164驱动8位LED显示 ICC程序

AVR单片机 Comments 围观:
// 串行数码管显示  TLC549 AD转换值

// 芯片 ATMEGA16L 
// 时钟 4MHz 内部
// us延时  j=1;while(--j); 一个循环6个周期,4M晶振,延时1.5us
#include 

//164数据线置1
#define hc164_data_SET     PORTD |= 0x01  
//164数据线清0 
#define hc164_data_CLR     PORTD &= ~0x01 
//164时钟线置1 
#define hc164_clk_SET      PORTD |= 0x02  
//164时钟线清0 
#define hc164_clk_CLR      PORTD &= ~0x02 

void delay_nms(unsigned int);   //延时 n ms  
void hc164_send_byte (unsigned char byte); //164发送数据子程序
void leddisplay(void);          // 数码管显示子程序  

#define CLK549    4    // tlc549时钟线, PD4输出
#define DATA549    5    // tlc549数据线, PD5输入
#define CS549    6    // tlc549片选线 ,PD6输出
 
#define CLK549_SET     PORTD |= 1< #define CLK549_CLR     PORTD &= ~(1< #define DATA549_IN     PIND&(1<TA549)       // tlc549数据线, PD5输入
#define CS549_SET     PORTD |= 1< #define CS549_CLR     PORTD &= ~(1<

unsigned char TLC549_ADC (void);  //AD转换子程序

unsigned char ledxs[8]={16,16,16,16,16,0,0,0}; // 数码管显示缓冲区
                //     AD转换值   百位  十位  个位  
const unsigned char tab[]={0xb7,0x12,0x67,0x76,0xd2,0xf4,0xf5,0x16,0xf7,0xf6,0xd7,0xf1,0xa5,0x73,0xe5,0xc5,0,0xff};
                          //共阴极代码 0-F,  全灭,全亮
void main(void)
{
   unsigned char ad_value,temp,j;   
   j=1;while(--j); // 一个循环6个周期,4M晶振,延时1.5us
   delay_nms(200); 
   PORTD &= ~(1<TA549); // tlc549数据线,上拉电阻无效
   DDRD = 0x53;            // PD0、PD1(164驱动)置为输出方式;  
                           // PD4、PD6(tlc549时钟和片选)置为输出方式 ,PD5(tlc549数据线)置为输入方式
   while(1)
   {
     ad_value = TLC549_ADC();  //读取AD转换值
     temp = ad_value/100;
     ledxs[5] = temp;          //求得AD转换值百位
     temp = ad_value%100;
     ledxs[6] = temp/10;       // 求得AD转换值十位
     ledxs[7] = temp%10;       // 求得AD转换值个位
     leddisplay();           // 串行显示
     delay_nms(1000);
   }
}
unsigned char TLC549_ADC(void)
{
      unsigned char value=0;
      unsigned char i,j;
      CS549_SET;
   j=2;while(--j);
      CLK549_CLR;
      j=4;while(--j);
      CS549_CLR;        //芯片起始
      j=4;while(--j);   //等待延时
      for(i=0;i<8;i++)  //输入采样转换时钟 (预采样)
      {
         CLK549_SET;
   j=2;while(--j);
         CLK549_CLR;
   j=2;while(--j);
      }
      CS549_SET;       //开始转换
      j=20;while(--j); //等待转换结束

      CLK549_CLR;
      j=4;while(--j);
      CS549_CLR;       //开始读取转换结果
      j=4;while(--j);
      for(i=0;i<8;i++) // 读采样值
      {
         CLK549_SET;
   j=2;while(--j);
         value<<=1;
   //if((PIND&(1<TA549))==(1<TA549))   value |= 0x01; //接收1位数据  
   if( DATA549_IN )   value |= 0x01;  //接收1位数据  
         CLK549_CLR;
   j=2;while(--j);
      }
      CS549_SET;
      j=20;while(--j);
      return(value);  //返回转换结果
}
void leddisplay()     // 数码管显示子程序
{
  unsigned char i,j;
  for(i=0;i<8;i++)
  {
     hc164_send_byte (tab[ledxs[i]]);
     j=2;while(--j);
  }

void hc164_send_byte (unsigned char byte)  //164发送数据子程序
{
  unsigned char i;
   for(i=0;i<8;i++)
   {
      if( byte & ( 1 << i )) 
     hc164_data_SET;
   else 
     hc164_data_CLR;
      hc164_clk_SET;
      hc164_clk_CLR;   
   }  

void delay_nms(unsigned int k)  //延时 n ms
{
  while(k)   //4M晶振,一个循环1ms
  {
  int i;
  i=700;
  while(i--);
  k=k-1;
  }
}


文章作者:
本文地址:
版权所有 © 未注明“转载”的博文一律为原创,转载时必须以链接形式注明作者和原始出处!
如果你觉得文章不错,您可以推荐给你的朋友哦!

◇◇上一篇:tlc1549 ICC程序 下一篇:ds1302 ICC程序 ◇◇

发表评论:                              


验证码:点击我更换图片

来看看其他人说了些什么?-----------------------------------------------------------------> 进入详细评论页