我給你來個程序試試
- /*
- 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();
- }
- }
復制代碼 |