基于51单片机的74HC164驱动六位数码管动态显示程序

基于51单片机的74HC164驱动六位数码管动态显示程序

有需要资料的请回原文下载

#include<reg52.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int
//74HC164
sbit CLK=P1^0;        // μíμ&ccedil;&AElig;&frac12;μ&frac12;&cedil;&szlig;μ&ccedil;&AElig;&frac12;±&szlig;&Ntilde;&Oslash;′¥·¢
sbit MOSI=P1^1;         //         êy&frac34;Yê&auml;è&euml;

unsigned char code Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
                          0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};        //12ò&otilde;êy&Acirc;&euml;1ü
unsigned char DS_data[6];
/*****************************************************
oˉêy1|&Auml;ü:êy&Acirc;&euml;1üé¨&Atilde;è&Ntilde;óê±×óoˉêy
oˉêy1|&Auml;ü:&Ntilde;óê±1ms

***************************************************/
void delay1ms()
{
   unsigned char i,j;        
         for(i=0;i<10;i++)
          for(j=0;j<33;j++)
           ;                 
}
void separateData(unsigned long dat)         // dat&Icirc;a6&Icirc;&raquo;êy
{
   DS_data[0]=dat%10;
   DS_data[1]=dat/10%10;
   DS_data[2]=dat/100%10;
   DS_data[3]=dat/1000%10;
   DS_data[4]=dat/10000%10;
   DS_data[5]=dat/100000%10;
}
void write_164(unsigned char dat)
{
   unsigned char i;
   for(i=0;i<8;i++)
   {
     CLK=0;            
     if(dat&0x80)  MOSI=1;
     else          MOSI=0;
     CLK=1;               
     dat<<=1;
  }
}

void display()
{
   unsigned char i;
   for(i=0;i<6;i++)
   {
                        write_164(Tab[DS_data
]);
                        P2=0x3f&(~(0x01<<i));     //êy&Acirc;&euml;1ü&Icirc;&raquo; 12ò&otilde;μíμ&ccedil;&AElig;&frac12;&Ntilde;&iexcl;&Ouml;Dseg1&para;&Ocirc;ó|P2.5 seg6&para;&Ocirc;ó|P2.0
                        delay1ms();
                        P2=0xff;        //êy&Acirc;&euml;1ü&Atilde;e
   }

}

main()
{
   separateData(654321);
   while(1)
   {
     display();
   }
}




#include<reg52.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int
//74HC164
sbit CLK=P1^0;        // 低电平到高电平边沿触发
sbit MOSI=P1^1;         //         数据输入

unsigned char code Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
                          0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};        //共阴数码管
unsigned char DS_data[6];
/*****************************************************
函数功能:数码管扫描延时子函数
函数功能:延时1ms

***************************************************/
void delay1ms()
{
   unsigned char i,j;        
         for(i=0;i<10;i++)
          for(j=0;j<33;j++)
           ;                 
}
void separateData(unsigned long dat)         // dat为6位数
{
   DS_data[0]=dat%10;
   DS_data[1]=dat/10%10;
   DS_data[2]=dat/100%10;
   DS_data[3]=dat/1000%10;
   DS_data[4]=dat/10000%10;
   DS_data[5]=dat/100000%10;
}
void write_164(unsigned char dat)
{
   unsigned char i;
   for(i=0;i<8;i++)
   {
     CLK=0;            
     if(dat&0x80)  MOSI=1;
     else          MOSI=0;
     CLK=1;               
     dat<<=1;
  }
}

void display()
{
   unsigned char i;
   for(i=0;i<6;i++)
   {
                        write_164(Tab[DS_data]);
                        P2=0x3f&(~(0x01<<i));     //数码管位 共阴低电平选中seg1对应P2.5 seg6对应P2.0
                        delay1ms();
                        P2=0xff;        //数码管灭
   }

}

main()
{
   separateData(654321);
   while(1)
   {
     display();
   }
}

  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
好的,我来回答你的问题。首先,74HC164是一个8位移位寄存器,可以实现串行输入并行输出的功能,适合驱动数码管等显示器件。而在51单片机中,我们可以通过串口通信来控制74HC164。 下面是一个简单的代码示例,可以实现通过串口控制74HC164驱动数码显示数字: ```c #include <reg51.h> // 74HC164控制引脚定义 sbit HC164_CLK = P1^0; sbit HC164_SER = P1^1; sbit HC164_RCLK = P1^2; // 数码显示码表 unsigned char code LED_Table[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f }; // 串口初始化 void UART_Init() { TMOD |= 0x20; // 设置定时器1为模式2 TH1 = 0xfd; // 波特率设置为9600 TL1 = 0xfd; TR1 = 1; // 启动定时器1 SCON = 0x50; // 设置串口为模式1 ES = 1; // 允许串口中断 EA = 1; // 允许总中断 } // 串口发送数据 void UART_SendByte(unsigned char dat) { SBUF = dat; while (!TI); // 等待发送完成 TI = 0; // 清除发送完成标志 } // 延时函数 void delay(unsigned int n) { unsigned int i, j; for (i = 0; i < n; i++) { for (j = 0; j < 50; j++); } } // 74HC164移位函数 void HC164_Shift(unsigned char dat) { unsigned char i; for (i = 0; i < 8; i++) { HC164_CLK = 0; HC164_SER = (dat & 0x80) ? 1 : 0; dat <<= 1; HC164_CLK = 1; } } // 74HC164输出函数 void HC164_Output() { HC164_RCLK = 0; HC164_RCLK = 1; } // 主函数 void main() { unsigned char num = 0; UART_Init(); // 初始化串口 while (1) { // 等待串口接收完成 while (!RI); num = SBUF; // 读取串口数据 RI = 0; // 清除接收完成标志 HC164_Shift(LED_Table[num]); // 移位 HC164_Output(); // 输出 } } ``` 在这个代码中,我们将串口通信设置为了9600波特率,当接收到一个字节的数据时,就将其作为数字0~9的索引,查表得到对应的数码显示码,然后通过HC164移位和输出函数控制74HC164驱动数码显示

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值