|
用CD4094來驅(qū)動(dòng)數(shù)碼管可以解放更多的I/O口,同時(shí)也能提高數(shù)碼管的驅(qū)動(dòng)電流。只需要三個(gè)I/O就能驅(qū)動(dòng)多位數(shù)碼管。
我這里用的是四位數(shù)碼管,里面包含了共陰極數(shù)碼管的驅(qū)動(dòng)和共陽極數(shù)碼管的驅(qū)動(dòng),讓初學(xué)者更容易上手。
下圖所示的是共陰極的四位數(shù)碼管
11.jpg (118.02 KB, 下載次數(shù): 162)
下載附件
2016-8-4 15:40 上傳
22.jpg (9.29 KB, 下載次數(shù): 161)
下載附件
2016-8-4 15:40 上傳
33.jpg (28.93 KB, 下載次數(shù): 141)
下載附件
2016-8-4 15:40 上傳
- #include<reg51.h>
- sbit KEY = P3^2; // 定義按鍵使用的 I/O 口 P3.2
- sbit STR4094=P1^0; //鎖存器移位使能端,H 使能
- sbit D4094=P1^1; //串行數(shù)據(jù)輸出端,H 使能
- sbit CLK4094=P1^2; //串行時(shí)鐘輸出端,H 使能輸出狀態(tài)使能端,H 使能
- //sbit E4094=P1^3; //輸出狀態(tài)使能端,H 使能,直接接高電平
- #define HOWMANY4094 2 //定義 4094 個(gè)數(shù)
- unsigned char bdata P4,P5;//定義模擬 I/O 口 P4, P5 口
- //unsigned char code TABLE[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};
- unsigned char code TABLE[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
- //數(shù)字顯示編碼表: 0 1 2 3 4 5 6 7 8 9 A b C d E F 空
- //當(dāng) P4 輸出相應(yīng)的數(shù)值時(shí),數(shù)碼管就會(huì)按照上面的數(shù)字進(jìn)行顯示。例如:P4=0xB0,數(shù)碼管就顯示"3"
- //以上編碼可以使用附贈(zèng)目錄下的 數(shù)碼管段位計(jì)算小程序計(jì)算。方便又快捷。
- void update4094()
- {
- unsigned char i,j,tt;
- STR4094=0;
- for (j=HOWMANY4094;j>0;j--)
- {
- tt=*(&P4+j-1);
- for(i=0;i<8;i++)
- {
- D4094=(tt&0x80)>0;//數(shù)據(jù)腳
- CLK4094=0;
- CLK4094=1;
- tt<<=1;
- }
- }
- STR4094=1;
- }
- void delay_ms(unsigned short ms)
- {
- unsigned short i;
- unsigned char j;
- for(i=0;i<ms;i++)
- {
- for(j=0;j<200;j++);
- for(j=0;j<102;j++);
- } //for(i=0;i<ms;i++)
- }
- /*
- void delay_us(unsigned short us)
- {
- while(us--);
- }
- */
- void disp(unsigned char *p) //數(shù)碼管按位顯示函數(shù),
- {
- unsigned char i,x=1;
- for(i=0;i<4;i++)
- {
- P5=~x; //選擇一位數(shù)碼管
- P4=TABLE[p[i]]; //查表顯示一個(gè)數(shù)字。
- update4094(); //顯示數(shù)字。
- delay_ms(5);
- x<<=1; //數(shù)碼管選擇位左移 1 位
- }
- }
- //將一個(gè)短整型數(shù),個(gè),十,百,千位分別填入一個(gè) 4 位數(shù)組,用于數(shù)碼管顯示
- void deal_value(unsigned short input,unsigned char *p) //數(shù)據(jù)處理函數(shù)
- {
- //unsigned short kk;
- unsigned char ge,shi,bai,qian; //定義輸入的整型變量的個(gè),十,百,千位 數(shù)值
- qian= input%10000/1000;
- bai = input%1000/100;
- shi = input%100/10;
- ge = input%10;
-
- p[0]=qian; //千位
- p[1]=bai; //百位
- p[2]=shi; //十位
- p[3]=ge; //個(gè)位
- }
- void main(void)
- {
- unsigned short kk=0; //聲明一個(gè)短整型變量,作為數(shù)碼管顯示的數(shù)字
- unsigned char dis_buff[4];
- unsigned char i;
- bit last_key,this_key;
- while(1)
- {
- if(++i>=50) //循環(huán)增加 50 次,大約 1 秒鐘
- {
- i=0;
- kk++; //大約 1 秒鐘時(shí),顯示值增加 1。
- if(kk>9999) kk=0;
- deal_value(kk,&dis_buff); //將 kk 值分解為個(gè)位,十位,百位,千位,裝入緩沖區(qū)
- }
- disp(dis_buff); //用數(shù)碼管顯示 kk 每一個(gè)顯示過程大概 20ms
- last_key=this_key;
- this_key=KEY;
- if((last_key==1)&&(this_key==0)) //如果按鍵被按下,從 0 開始重新顯示
- {
- kk=0;
- deal_value(kk,&dis_buff); //將 kk 值分解為個(gè)位,十位,百位,千位,裝入緩沖區(qū)
- }
- }
- }
復(fù)制代碼
打開的keil的時(shí)候如果提示你sub4094.C什么什么的話請(qǐng)忽略,或是自己在重新建立一個(gè)工程,將我的程序復(fù)制進(jìn)去。解釋一下為什么會(huì)出現(xiàn)這個(gè)問題,是因?yàn)槲业某绦蚋夸浵掠幸粋€(gè)sub4094.c的文件,但是主函數(shù)中沒有調(diào)用,keil提示未啟用,所以請(qǐng)個(gè)位放心。
寫這個(gè)程序的時(shí)候本想是分段展開的,結(jié)果后來都匯總到一個(gè).C里了,所以就多了那么一個(gè)文件。
|
-
-
CD4094 四位數(shù)碼管.zip
2016-8-4 15:45 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
150.5 KB, 下載次數(shù): 111, 下載積分: 黑幣 -5
評(píng)分
-
查看全部評(píng)分
|