光柱的顯示原理其實和LED點陣差不多,只不過是把所有LED排列在一條直線上,形成一條光柱,驅動時按段、按線掃描點亮即可。
本程序使用的硬件見http://www.zg4o1577.cn/bbs/dpj-156818-1.html
單片機源程序如下:
- /* 104線光柱的顯示
- 硬件型號:UQK-H101型顯示儀表。
- P2為8條線的開關,P0低4位為13段的開關。
- */
- #include <at89x51.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define TIMER0 1000 //數碼管刷新率50Hz
- #define MAX_CNT 1000 //累計1秒的最大計數值
- #define TIMER0_HIGH (65536 - TIMER0)/256
- #define TIMER0_LOW (65536 - TIMER0)%256
- uchar bdata led; // 低4位為LED顯示狀態(定時器開關狀態)
- code uchar disp_seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
- code uchar disp_row[]={0xfc,0xfd,0xfb,0xfa,0xf9,0xf6,0xf8,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0};
- uchar disp_buf[4]; // bit7: 不顯示; bit4: 閃爍; bit3~0: 0~9,a,B,c,d,E,F
- uint tm_cnt; // 累計1秒的計數
- uchar disp_bar; // 0~100
- intr_t0() interrupt 1
- {
- uchar i, j, ch;
- tm_cnt++;
- TL0+=TIMER0_LOW;
- TH0=TIMER0_HIGH+(uchar)CY;
- if(tm_cnt>=MAX_CNT)
- tm_cnt=0;
- // LED、數碼管、光柱的顯示
- i=tm_cnt%20;
- if(i==4)
- {
- P0=0xff;
- P2=~led|0xf0;
- P0=0xfe; //打開陽極
- }
- else if(i<4)
- {
- ch=disp_buf[i];
- if(ch&0x80 || ch&0x10 && tm_cnt>=MAX_CNT/2)
- P0=0xff;
- else
- {
- if(i==0 && tm_cnt<MAX_CNT/2)
- j=0x7f; //顯示小數點
- else
- j=0xff;
- P0=0xff;
- P2=disp_seg[ch&0x0f]&j;
- P0=~(1<<i+4);
- }
- }
- else
- {
- i-=5;
- if(i<13)
- {
- if(disp_bar==0)
- j=14; //不顯示
- else
- j=(disp_bar-1)/8; //要顯示的段(0~j)
- ch=0xff;
- if(i<j && j<13)
- ch=0;
- else if(i==j)
- {
- j=(disp_bar-1)%8;
- do
- ch>>=1;
- while(j--!=0);
- }
- P0=0xff;
- P2=ch;
- P0=disp_row[i];
- }
- }
- }
- sbit SCLK=P1^1; //I/O時鐘
- sbit CS=P1^0; //片選
- sbit SDO=P1^2; //數據線
- uchar TLC549_ADC(void)
- {
- uchar i, dat=0;
- SCLK=0;
- CS=0;
- for(i=0;i<8;i++)
- {
- SCLK=1; // 上升沿讀數據
- dat<<=1;
- dat|=SDO;
- SCLK=0;
- }
- CS=1;
- return(dat);
- }
- void main()
- {
- uchar i;
- uint ii;
- TMOD=0x01;
- TH0=TIMER0_HIGH;
- TL0=TIMER0_LOW;
- PT0=1;
- ET0=1;
- EA=1;
- TR0=1;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
TLC549.rar
(1.24 KB, 下載次數: 9)
2019-4-23 16:46 上傳
點擊文件名下載附件
帶光柱顯示的電壓表 下載積分: 黑幣 -5
|