×
单片机 > 单片机程序设计 > 详情

PT16312VFD驱动C程序

发布时间:2020-06-03 发布时间:
|

PT16312驱动C程序

#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  
#include  
#define cmdd 0 
#define datt 1 
sbit dat=P1^3; 
sbit clk=P1^2; 
sbit stb=P1^1; 
union 

  uchar dat; 
  struct 
 { 
   uchar dms: 3; //选择显示屏硬件的栅和段的位数 
   uchar dnc: 3; //数据空位 
   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测试模式 
  uchar dnc: 2; //数据空位 
  uchar ad2: 2; //此命令的地址值固定为0X01 
 }co2; 
}co2; 
union 

  uchar dat; 
  struct 
 { 
  uchar add: 5; //16312内部DISRAM地址选择 
  uchar dnc: 1; //数据空位 
  uchar ad3: 2; //此命令的地址值固定为0X03 
 }co3; 
}co3; 
union 

  uchar dat; 
  struct 
 { 
   uchar PWM: 3; //输出点亮时间选择(可以调节亮度) 
   uchar dis: 1; //0显示关闭 
   uchar dnc: 2; //数据空位 
   uchar ad4: 2; //此命令的地址值固定为0X02 
 }co4; 
}co4; 

void wrd(uchar disno,bit lei)  //写一个字节的命令或者数据(由LEI控制是写数据还是写命令) 

  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;//设置为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; 
 } 
 /////////////////////////////************以下为主程序*************************////////////////////// 
void wrvfd(uchar addr,uchar dat) //向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; 
  } 
void wrled(uchar leddata) //控制16312的四个输出口数据存放在LEDDATA的低四位 

  inivfd(); 
  cm2.fru=0x01; 
  wrd(co2.dat,cmdd); 
  wrd(leddata,datt); 
  stb=1; 
}                          
ulong rdkey()            //读键盘 
{ 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); 
  } 
  return(key); 


main()//                         测试程序 

uchar i; 
ulong k; 
for(i=0;i<16;i++) 
wrvfd(i,0xff);       //点亮VFD荧光屏上所有的数据段 
wrled(0x0f);       //使16312上的输出口置高电平 
while(1) 
k=rdkey();           //读键盘实验,实际应用中应参照数据手册取值(如按下某一个按键应读读几次,其中只有一次是正确的其他几次做为消抖处理) 



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会