pt16312vfd.lst

来自「一个车载音响控制程序,包括高保真立体收部分,VFD驱动显示,4路音频电子切换, 」· LST 代码 · 共 167 行

LST
167
字号
C51 COMPILER V6.12  PT16312VFD                                                             11/23/2005 14:06:51 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE PT16312VFD
OBJECT MODULE PLACED IN .\PT16312VFD.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\..\..\PT16312VFD\PT16312VFD.C DEBUG OBJECTEXTEND PRINT(.\PT16312VFD.lst)
                    - OBJECT(.\PT16312VFD.obj) 

stmt level    source

   1          #define uchar unsigned char
   2          #define uint  unsigned int
   3          #define ulong unsigned long
   4          #define cm1 co1.co1
   5          #define cm2 co2.co2
   6          #define cm3 co3.co3
   7          #define cm4 co4.co4
   8          #include <reg52.h>
   9          #include <mylib.h>
  10          #define cmdd 0
  11          #define datt 1
  12          sbit dat=P1^0;
  13          sbit clk=P1^1;
  14          sbit stb=P1^2;
  15          uchar code dx58[3] _at_ 0x3b;
  16          union
  17          {
  18            uchar dat;
  19            struct
  20           {
  21             uchar dms: 3; //选择显示屏硬件的栅和段的位数
  22             uchar dnc: 3; //数据空位
  23             uchar ad1: 2; //此命令的地址值固定为0X00
  24           }co1;
  25          }co1;
  26          union 
  27          {
  28            uchar dat;
  29            struct
  30           {
  31            uchar fru: 2; //功能选择:00:WRITE DATA TO DISRAM 01:WRITE DATA TO LED 02:READ DATA FROM KEY 03:READ
             - DATA FROM SW
  32            uchar mad: 1; //0递增 1指定地址
  33            uchar mst: 1; //0正常 1测试模式
  34            uchar dnc: 2; //数据空位
  35            uchar ad2: 2; //此命令的地址值固定为0X01
  36           }co2;
  37          }co2;
  38          union
  39          {
  40            uchar dat;
  41            struct
  42           {
  43            uchar add: 5; //16312内部DISRAM地址选择
  44            uchar dnc: 1; //数据空位
  45            uchar ad3: 2; //此命令的地址值固定为0X03
  46           }co3;
  47          }co3;
  48          union
  49          {
  50            uchar dat;
  51            struct
  52           {
  53             uchar pwm: 3; //输出点亮时间选择(可以调节亮度)
C51 COMPILER V6.12  PT16312VFD                                                             11/23/2005 14:06:51 PAGE 2   

  54             uchar dis: 1; //0显示关闭
  55             uchar dnc: 2; //数据空位
  56             uchar ad4: 2; //此命令的地址值固定为0X02
  57           }co4;
  58          }co4;
  59          
  60          void wrd(uchar disno,bit lei)  //写一个字节的命令或者数据(由LEI控制是写数据还是写命令)
  61          {
  62   1        uchar a;
  63   1        if(lei)
  64   1        goto s;
  65   1        stb=1;
  66   1        stb=1;
  67   1        stb=0;
  68   1       s:  for(a=0;a<8;a++)
  69   1          {
  70   2           clk=1;
  71   2           clk=1;
  72   2      	 clk=0;
  73   2           clk=0;
  74   2            if(disno&0x01)
  75   2              dat=1;
  76   2            else
  77   2              dat=0;
  78   2              disno=disno>>1;
  79   2              clk=1;
  80   2              clk=1;
  81   2      		clk=1;
  82   2              clk=1;
  83   2           }
  84   1      }
  85          void inivfd(void)
  86           {
  87   1        cm1.dms=0x01;//设置为5区 16段
  88   1        cm1.ad1=0x00;
  89   1        cm2.mad=0x01;//地址模式为指定地址
  90   1        cm2.mst=0x00;//取消测试
  91   1        cm2.ad2=0x01;
  92   1        cm3.ad3=0x03;
  93   1        cm4.pwm=0x07;//亮度为最亮
  94   1        cm4.dis=0x01;//打开显示
  95   1        cm4.ad4=0x02;
  96   1       }
  97           /////////////////////////////************以下为主程序*************************//////////////////////
  98          void wrvfd(uchar addr,uchar dat) //向VFD指定地址写数据
  99            {
 100   1        inivfd();
 101   1        wrd(co1.dat,cmdd);
 102   1        stb=1;
 103   1        cm2.fru=0x00;
 104   1        wrd(co2.dat,cmdd);
 105   1        stb=1;
 106   1        cm3.add=addr;
 107   1        wrd(co3.dat,cmdd);
 108   1        wrd(dat,datt);
 109   1        stb=1;
 110   1        wrd(co4.dat,cmdd);
 111   1        stb=1;
 112   1        }
 113          void wrled(uchar leddata) //控制16312的四个输出口数据存放在LEDDATA的低四位
 114          {
 115   1        inivfd();
C51 COMPILER V6.12  PT16312VFD                                                             11/23/2005 14:06:51 PAGE 3   

 116   1        cm2.fru=0x01;
 117   1        wrd(co2.dat,cmdd);
 118   1        wrd(leddata,datt);
 119   1        stb=1;
 120   1      }						 
 121          ulong rdkey()			//读键盘
 122          { ulong key=0;
 123   1        uchar i;
 124   1        inivfd();
 125   1        cm2.fru=0x02;
 126   1        wrd(co2.dat,cmdd);
 127   1        for(i=0;i<24;i++)
 128   1        {
 129   2         clk=1;
 130   2         clk=1;
 131   2         clk=0;
 132   2         clk=0;
 133   2         clk=0;
 134   2         clk=1;
 135   2         dat=1;
 136   2         if(dat==1)
 137   2         key=(key<<1)+1;
 138   2         else
 139   2         key=(key<<1);
 140   2        }
 141   1        return(key);
 142   1      }
 143          
 144          main()//                         测试程序
 145          {
 146   1      uchar i;
 147   1      ulong k;
 148   1      for(i=0;i<16;i++)
 149   1      wrvfd(i,0xff);	   //点亮VFD荧光屏上所有的数据段
 150   1      wrled(0x0f);       //使16312上的输出口置高电平
 151   1      while(1)
 152   1      k=rdkey();		   //读键盘实验,实际应用中应参照数据手册取值(如按下某一个按键应读读几次,其中只有一次是正确

⌨️ 快捷键说明

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