以下程序是一款名0693的一塊VFD顯示屏的時鐘顯示驅(qū)動程序,該顯示屏用于硬盤錄像機,現(xiàn)已出口歐洲。 #i nclude "reg51.h" #i nclude "stdio.h"sbit STB = P1^2; sbit CLK = P1^0; sbit DIN = P1^1; void vfd_cmd (unsigned char vfd_cmd0); /* 寫命令*/ void vfd_wrdata (unsigned char vfd_wrdata0); /* 寫數(shù)據(jù) */ void vfd_init (void); /* PT6311初始化 */unsigned char vfdbuf[]={0,0,0,0,21,8}; code unsigned char vfdmap[]={0xf7, 0xa4, 0xeb, 0xed, 0xbc, 0xdd, 0xdf, 0xe4, 0xff, 0xfd}; unsigned char g11[]={0x64,0x89,0x32,0x64,0xa9,0x32,0x64,0xa9,0x32}; unsigned char g12[]={0x26,0x48,0x91,0x26,0x48,0x01,0x02,0x00,0x91}; //unsigned char g21[]={0xff,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x00}; //unsigned char g22[]={0xff,0x40,0x00,0x00,0x80,0x00,0x00,0x00,0x00}; //unsigned char g31[]={0xff,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x00}; //unsigned char g32[]={0xff,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x10}; //unsigned char g41[]={0xff,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x00}; //unsigned char g42[]={0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //unsigned char g51[]={0xff,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x00}; //unsigned char g52[]={0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; unsigned char g61[]={0xff,0x02,0x04,0x08,0x10,0x00,0x00,0x00,0x00}; unsigned char g62[]={0xff,0x00,0x00,0x00,0x00,0x10,0x20,0x40,0x80}; void delay(unsigned char cnt) { unsigned char i; while(cnt--!=0) for(i=100;i!=0;i--); } #define tick 7554 #define T100us (256-134) unsigned char hour, minute, second; unsigned int c100us; void vfd_cmd ( unsigned char vfd_cmd0 ) /* 寫控制命令子程序 */ { unsigned char i; STB=1; CLK=1; for ( i=0;i<8;i++ ) { STB=0; CLK=0; DIN = vfd_cmd0&0x01; CLK=1; vfd_cmd0>>=1; } STB=1; CLK=1; } void vfd_wrdata ( unsigned char vfd_wrdata0 ) /* 寫數(shù)據(jù)子程序 */ { unsigned char i; for(i=0;i<8;i++) { CLK=1; STB=0; CLK=0; DIN=vfd_wrdata0&0x01; CLK=1; vfd_wrdata0>>=1; } STB=0; CLK=1; }void vfd_init(void) { vfd_cmd ( 0x3a ); /* 6digits,16segments顯示模式 */ vfd_cmd ( 0x70 ); /* 顯示正常模式,數(shù)據(jù)地址遞增 */ vfd_wrdata ( 0xc0 ); /* 設(shè)置地址從00H開始 */ } void timer0() interrupt 1 { c100us--; if(c100us==0) { c100us=tick; second++; if(second==60) { second=0; minute++; if(minute==60); { minute=0; hour++; if(hour==24) {hour=0;} } } } }void vfd_wrtime () {unsigned int i; vfdbuf[0]=vfdmap[hour/10]; vfdbuf[1]=vfdmap[hour%10]; vfdbuf[2]=vfdmap[minute/10]; vfdbuf[3]=vfdmap[minute%10]; vfdbuf[4]=vfdmap[second/10]; vfdbuf[5]=vfdmap[second%10]; vfd_init( ); i=0; vfd_wrdata ( g11[i] ); vfd_wrdata ( g12[i] ); vfd_wrdata ( vfdbuf[0] ); //2G 分的十位 vfd_wrdata ( 0x00 ); vfd_wrdata ( vfdbuf[1] ); //3G 分的個位 vfd_wrdata ( 0x00 ); vfd_wrdata ( vfdbuf[4] ); //4G 秒的十位 vfd_wrdata ( 0x00 ); vfd_wrdata ( vfdbuf[5] ); //5G 秒的個位 vfd_wrdata ( 0x00 ); vfd_wrdata ( g61[i] ); //6G vfd_wrdata ( g62[i] ); i++; STB=1; delay(1000); vfd_cmd ( 0x8f ); /* 顯示開,14/16脈寬 */} void main() { EA=1;ET0=1; TMOD=0x02; TH0=T100us; TL0=T100us; hour=0; second=0; c100us=tick; TR0=1; while(1) {vfd_wrtime(); delay(1); } } |
|