我给你来个程序试试
- /*
- 51单片机74HC164串口控制数码管显示
- 一般数码管需要接7个脚才能显示,如果用单片机本身的I/O口,虽然可以但是浪费宝贵的i/O口资源。本例用移位寄存器74HC164作为数码管驱动进行控制。
- 74HC164特性 是一种8位串转并口的控制芯片,用于数码管和液晶显示等.
- 工作电压2--6V
- 管脚定义:
- 1) A,B管脚:与门数据输入引脚。
- 2)QA---QH 数据并口输出引脚
- 3) CLR 低电平时,数据清零,不能输入
- 4) CLK 数据输入时钟,上升沿读取串口数据
-
- 本51单片机用的是12MHZ晶振,每条指令最小执行时间1uS》》1ns ,可以根据时序图随便使用.
- 原理图:
- */
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- //74HC164 MR Pin9 接5V
- sbit CLK=P1^0; // 低电平到高电平边沿触发 接74HC164 CLK
- sbit MOSI=P1^1; // 数据输入 接74HC164 A、B,
- 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();
- }
- }
复制代码 |