PT16312VFD驱动C程序
扫描二维码
随时随地手机看文章
PT16312驱动C程序
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlong
#definecm1co1.co1
#definecm2co2.co2
#definecm3co3.co3
#definecm4co4.co4
#include
#include
#definecmdd0
#definedatt1
sbitdat=P1^3;
sbitclk=P1^2;
sbitstb=P1^1;
union
{
uchardat;
struct
{
uchardms:3;//选择显示屏硬件的栅和段的位数
uchardnc:3;//数据空位
ucharad1:2;//此命令的地址值固定为0X00
}co1;
}co1;
union
{
uchardat;
struct
{
ucharfru:2;//功能选择:00:WRITEDATATODISRAM01:WRITEDATATOLED02:READDATAFROMKEY03:READDATAFROMSW
ucharmad:1;//0递增1指定地址
ucharmst:1;//0正常1测试模式
uchardnc:2;//数据空位
ucharad2:2;//此命令的地址值固定为0X01
}co2;
}co2;
union
{
uchardat;
struct
{
ucharadd:5;//16312内部DISRAM地址选择
uchardnc:1;//数据空位
ucharad3:2;//此命令的地址值固定为0X03
}co3;
}co3;
union
{
uchardat;
struct
{
ucharPWM:3;//输出点亮时间选择(可以调节亮度)
uchardis:1;//0显示关闭
uchardnc:2;//数据空位
ucharad4:2;//此命令的地址值固定为0X02
}co4;
}co4;
voidwrd(uchardisno,bitlei)//写一个字节的命令或者数据(由LEI控制是写数据还是写命令)
{
uchara;
if(lei)
gotos;
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;
}
}
voidiniVFD(void)
{
cm1.dms=0x01;//设置为5区16段
cm1.ad1=0x00;
cm2.mad=0x01;//地址模式为指定地址
cm2.mst=0x00;//取消测试
cm2.ad2=0x01;
cm3.ad3=0x03;
cm4.pwm=0x07;//亮度为最亮
cm4.dis=0x01;//打开显示
cm4.ad4=0x02;
}
/////////////////////////////************以下为主程序*************************//////////////////////
voidwrvfd(ucharaddr,uchardat)//向VFD指定地址写数据
{
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;
}
voidwrled(ucharleddata)//控制16312的四个输出口数据存放在LEDDATA的低四位
{
inivfd();
cm2.fru=0x01;
wrd(co2.dat,cmdd);
wrd(leddata,datt);
stb=1;
}
ulongrdkey()//读键盘
{ulongkey=0;
uchari;
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);
}
return(key);
}
main()//测试程序
{
uchari;
ulongk;
for(i=0;i<16;i++)
wrvfd(i,0xff);//点亮VFD荧光屏上所有的数据段
wrled(0x0f);//使16312上的输出口置高电平
while(1)
k=rdkey();//读键盘实验,实际应用中应参照数据手册取值(如按下某一个按键应读读几次,其中只有一次是正确的其他几次做为消抖处理)
}