⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vfd.c

📁 usb接口应用文件供参考 usb接口应用文件供参考
💻 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 <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; //选择显示屏硬件的栅和段的位数
   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);
  }
  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进制转换成10进制显示
	
	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);	   //根据供应商提供的VFD资料来写正确显示的算法,否则显示错乱!
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -