?? vfd.c
字號(hào):
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define cm1 co1.co1
#define cm2 co2.co2
#define cm3 co3.co3
#define cm4 co4.co4
#include <reg52.h>
#include <mylib.h>
#define cmdd 0
#define datt 1
sbit dat=P1^3;
sbit clk=P1^2;
sbit stb=P1^1;
extern uchar remkey;
uchar code dis[10]={0xf7,0xa4,0xeb,0xed,0xbc,0xdd,0xdf,0xe4,0xff,0xfd};
union
{
uchar dat;
struct
{
uchar dms: 3; //選擇顯示屏硬件的柵和段的位數(shù)
uchar dnc: 3; //數(shù)據(jù)空位
uchar ad1: 2; //此命令的地址值固定為0X00
}co1;
}co1;
union
{
uchar dat;
struct
{
uchar fru: 2; //功能選擇:00:WRITE DATA TO DISRAM 01:WRITE DATA TO LED 02:READ DATA FROM KEY 03:READ DATA FROM SW
uchar mad: 1; //0遞增 1指定地址
uchar mst: 1; //0正常 1測(cè)試模式
uchar dnc: 2; //數(shù)據(jù)空位
uchar ad2: 2; //此命令的地址值固定為0X01
}co2;
}co2;
union
{
uchar dat;
struct
{
uchar add: 5; //16312內(nèi)部DISRAM地址選擇
uchar dnc: 1; //數(shù)據(jù)空位
uchar ad3: 2; //此命令的地址值固定為0X03
}co3;
}co3;
union
{
uchar dat;
struct
{
uchar pwm: 3; //輸出點(diǎn)亮?xí)r間選擇(可以調(diào)節(jié)亮度)
uchar dis: 1; //0顯示關(guān)閉
uchar dnc: 2; //數(shù)據(jù)空位
uchar ad4: 2; //此命令的地址值固定為0X02
}co4;
}co4;
void wrd(uchar disno,bit lei) //寫(xiě)一個(gè)字節(jié)的命令或者數(shù)據(jù)(由LEI控制是寫(xiě)數(shù)據(jù)還是寫(xiě)命令)
{
uchar a;
if(lei)
goto s;
stb=1;
stb=1;
stb=0;
s: for(a=0;a<8;a++)
{
clk=1;
clk=1;
clk=0;
clk=0;
if(disno&0x01)
dat=1;
else
dat=0;
disno=disno>>1;
clk=1;
clk=1;
clk=1;
clk=1;
}
}
void inivfd(void)
{
cm1.dms=0x01;//設(shè)置為5區(qū) 16段
cm1.ad1=0x00;
cm2.mad=0x01;//地址模式為指定地址
cm2.mst=0x00;//取消測(cè)試
cm2.ad2=0x01;
cm3.ad3=0x03;
cm4.pwm=0x07;//亮度為最亮
cm4.dis=0x01;//打開(kāi)顯示
cm4.ad4=0x02;
}
/////////////////////////////************以下為主程序*************************//////////////////////
void wrvfd(uchar addr,uchar dat) //向VFD指定地址寫(xiě)數(shù)據(jù)
{
inivfd();
wrd(co1.dat,cmdd);
stb=1;
cm2.fru=0x00;
wrd(co2.dat,cmdd);
stb=1;
cm3.add=addr;
wrd(co3.dat,cmdd);
wrd(dat,datt);
stb=1;
wrd(co4.dat,cmdd);
stb=1;
}
void wrled(uchar leddata) //控制16312的四個(gè)輸出口數(shù)據(jù)存放在LEDDATA的低四位
{
inivfd();
cm2.fru=0x01;
wrd(co2.dat,cmdd);
wrd(leddata,datt);
stb=1;
}
ulong rdkey() //讀鍵盤(pán)
{ulong key=0;
uchar i;
inivfd();
cm2.fru=0x02;
wrd(co2.dat,cmdd);
for(i=0;i<24;i++)
{
clk=1;
clk=1;
clk=0;
clk=0;
clk=0;
clk=1;
dat=1;
if(dat==1)
key=(key<<1)+1;
else
key=(key<<1);
}
switch(key)
{
case 0x00800000:remkey=0xc7;break;
case 0x00200000:remkey=0x47;break;
}
return(key);
}
vfddigit(ulong ch)
{
uchar h[5];
h[4]=(ch/10000);
h[3]=((ch%10000)/1000);
h[2]=((ch%1000)/100);
h[1]=((ch%100)/10);
h[0]=(ch%10); //將16進(jìn)制轉(zhuǎn)換成10進(jìn)制顯示
wrvfd(0x00,dis[h[0]]&((dis[h[1]]&0x01)?0xff:0x7f));
wrvfd(0x01,dis[h[1]]>>1);
wrvfd(0x02,dis[h[2]]&((dis[h[3]]&0x01)?0xff:0x7f));
if(h[3])
wrvfd(0x03,dis[h[3]]);
else
wrvfd(0x03,0x00); //根據(jù)供應(yīng)商提供的VFD資料來(lái)寫(xiě)正確顯示的算法,否則顯示錯(cuò)亂!
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -