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

📄 vfdtask.lst

📁 一个带收音的功放程序, VFD显示驱动用一个非常实用的方法, 稍加修改即可换成不同的VFD, 功放芯片用M61538
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.20   VFDTASK                                                               06/30/2005 14:02:58 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE VFDTASK
OBJECT MODULE PLACED IN vfdtask.OBJ
COMPILER INVOKED BY: C:\Keil51\C51\BIN\c51.exe vfdtask.c DB OE SMALL ROM(LARGE)

line level    source

   1          #include "reg52.h"
   2          #include "intrins.h"
   3          #include "..\..\inc\globedef.h"
   4          #include "..\..\inc\delay.h"
   5          #include "..\..\inc\keyproc.h"
   6          #include "..\..\inc\vfddef.h"
   7          #include "..\..\inc\Tuner.h"
   8          
   9          /*===========================================
  10                 将输入的数转换成VFD显示字符输出
  11          ===========================================*/
  12          code WORD NUMBER_DISPLAY[10] = 
  13          {
  14                  CHAR_0,CHAR_1,CHAR_2,CHAR_3,CHAR_4,
  15                  CHAR_5,CHAR_6,CHAR_7,CHAR_8,CHAR_9
  16          };
  17          
  18          /*===========================================
  19                 将输入的字母转换成VFD显示字符输出
  20          ===========================================*/
  21          code WORD LETTER_DISPLAY[26] = 
  22          {
  23                  CHAR_A,CHAR_B,CHAR_C,CHAR_D,CHAR_E,
  24                  CHAR_F,CHAR_G,CHAR_H,CHAR_I,CHAR_J,
  25                  CHAR_K,CHAR_L,CHAR_M,CHAR_N,CHAR_O,
  26                  CHAR_P,CHAR_Q,CHAR_R,CHAR_S,CHAR_T,
  27                  CHAR_U,CHAR_V,CHAR_W,CHAR_X,CHAR_Y,
  28                  CHAR_Z
  29          };
  30          
  31          /*===============================================
  32          描述:    从PT16312读取一个字节的数据
  33          参数:    无
  34          返回:    从VFD芯片读到的数据
  35          ================================================*/
  36          BYTE    VFD_ReadByte(void)
  37          {
  38   1              BYTE i;
  39   1              BYTE ReceiveData = 0;
  40   1              for (i = 0;i <8;i++)
  41   1              {
  42   2                      ReceiveData >>= 1;
  43   2                      CLEAR_VFD_CLK;
  44   2                  Delay5US();
  45   2                      SET_VFD_CLK;
  46   2                      Delay5US();
  47   2                      if (VFD_DATA_HIGH)
  48   2                              ReceiveData |= 0x80;
  49   2              }
  50   1              TRISTATE_DATA;
  51   1              return ReceiveData;
  52   1      }
  53          /*===============================================
  54          描述:    向PT16312发送一个字节的数据
  55          参数:    向VFD芯片发送的数据字节
C51 COMPILER V7.20   VFDTASK                                                               06/30/2005 14:02:58 PAGE 2   

  56          返回:    无
  57          ================================================*/
  58          void    VFD_SendByte(BYTE VFD_SendByte)
  59          {
  60   1              BYTE i;
  61   1              CLEAR_VFD_DATA;
  62   1              Delay5US();
  63   1              for (i = 0;i <8;i++)
  64   1              {
  65   2                      CLEAR_VFD_CLK;
  66   2                      _nop_();        
  67   2                  if (VFD_SendByte & 0x01) {
  68   3                      SET_VFD_DATA;
  69   3                  }
  70   2                  else
  71   2                      {
  72   3                      CLEAR_VFD_DATA;
  73   3                  }
  74   2                  _nop_();
  75   2                       SET_VFD_CLK;
  76   2                  VFD_SendByte >>= 1;
  77   2                      _nop_();        
  78   2              }
  79   1              TRISTATE_DATA;
  80   1      }
  81          /*===============================================
  82          描述:    向PT16312发送命令
  83          参数:    向VFD芯片发送的数据字节
  84          返回:    无
  85          ================================================*/
  86          void    VFD_SendCmd(BYTE VFD_Byte)
  87          {
  88   1              DelayX1ms(1);
  89   1              CLEAR_VFD_CS;
  90   1              Delay5US();
  91   1              Delay5US();
  92   1              VFD_SendByte(VFD_Byte);
  93   1              Delay5US();
  94   1              Delay5US();
  95   1              SET_VFD_CS;
  96   1              DelayX1ms(2);
  97   1      }
  98          
  99          /*===============================================
 100          描述:    向VFD显示芯片发送一系列数据
 101          参数:    length,向VFD芯片发送的数据字节的长度,
 102                           *str, 指向数据的指针
 103          返回:    无
 104          ================================================*/
 105          
 106          /*===============================================
 107          描述:    向VFD显示芯片发送一系列数据
 108          参数:    length,向VFD芯片发送的数据字节的长度,
 109                           *str, 指向数据的指针
 110          返回:    无
 111          ================================================*/
 112          //void    VFD_Display(BYTE  G_Connect, BYTE P_Connect, BYTE *str, BYTE str_Start, 
 113          //                                      DWORD Number, BYTE                              )
 114          void    VFD_DisplayString(BYTE *str, BYTE length)
 115          {
 116   1              BYTE i;
 117   1              BYTE i_temp;
C51 COMPILER V7.20   VFDTASK                                                               06/30/2005 14:02:58 PAGE 3   

 118   1              VFD_SendCmd(VFD_ADDRESS_INC);
 119   1              CLEAR_VFD_CS;
 120   1              Delay5US();
 121   1          Delay5US();
 122   1              VFD_SendByte(VFD_ADDRESS_MASK + 2);
 123   1      
 124   1              for(i=0; i < length; i++)
 125   1              {
 126   2                      i_temp = length - i - 1;
 127   2                      if((str[i] >= '0') && (str[i] <= '9'))
 128   2                              VFD_RAMData[i_temp] = NUMBER_DISPLAY[str[i] - '0'];
 129   2                      else if((str[i] >= 'A') && (str[i] <= 'Z'))
 130   2                              VFD_RAMData[i_temp] = LETTER_DISPLAY[str[i] - 'A'];     
 131   2                      else if(str[i] == ' ')
 132   2                              VFD_RAMData[i_temp] = CHAR_;
 133   2                      else if(str[i] == '+')
 134   2                              VFD_RAMData[i_temp] = CHAR_PLUS;
 135   2                      else if(str[i] == '-')  
 136   2                              VFD_RAMData[i_temp] = CHAR_MINUS;
 137   2              }
 138   1              for(i=0; i < length; i++)
 139   1              {               
 140   2                      VFD_SendByte(LowByte(VFD_RAMData[i]));
 141   2                  VFD_SendByte(HighByte(VFD_RAMData[i]));                                     
 142   2              }
 143   1              Delay5US();
 144   1              Delay5US();
 145   1              SET_VFD_CS;
 146   1              
 147   1      }
 148          
 149          WORD    Idempotent(BYTE n)
 150          {
 151   1              if(n > 4)
 152   1                      return 1;
 153   1              else
 154   1              {
 155   2                      switch (n)
 156   2                      {
 157   3                              case 4:
 158   3                                              return 10000;
 159   3                                       break;
 160   3                                       
 161   3                              case 3:
 162   3                                              return 1000;
 163   3                                       break;
 164   3                                       
 165   3                              case 2:
 166   3                                              return 100;
 167   3                                       break;
 168   3      
 169   3                              case 1:
 170   3                                              return 10;
 171   3                                       break;
 172   3                              case 0:
 173   3                                              return 1;
 174   3                                       break;
 175   3                      }
 176   2              }
 177   1      }
 178          void    VFD_DisplayNumber(WORD Number, BYTE Need_Dot_On, BYTE Other_to_Zero)
 179          {
C51 COMPILER V7.20   VFDTASK                                                               06/30/2005 14:02:58 PAGE 4   

 180   1              BYTE i;
 181   1              BYTE i_temp;
 182   1              BYTE Number_temp;
 183   1              BYTE Zero_Display;
 184   1              BYTE length;
 185   1      
 186   1              if(Number >= 10000)
 187   1                      length = 5;
 188   1              else if(Number >= 1000)
 189   1                      length = 4;
 190   1              else if(Number >= 100)
 191   1                      length = 3;
 192   1              else if(Number >= 10)
 193   1                      length = 2;
 194   1              else
 195   1                      length = 1;
 196   1              Zero_Display = 0;
 197   1              VFD_SendCmd(VFD_ADDRESS_INC);
 198   1              CLEAR_VFD_CS;
 199   1              Delay5US();       
 200   1              VFD_SendByte(VFD_ADDRESS_MASK + 2);
 201   1              
 202   1              if(Number < 10)
 203   1                      Zero_Display = 1;
 204   1              
 205   1              for(i=0; i < length; i++)
 206   1              {
 207   2                      i_temp = length -1 - i;
 208   2                      Number_temp = Number/Idempotent(i_temp);
 209   2                      if(Number_temp > 0)
 210   2                              Zero_Display = 1;
 211   2                      Number %= Idempotent(i_temp);
 212   2                      if(( Number_temp > 0) && ( Number_temp <= 9))
 213   2                              VFD_RAMData[i_temp] = NUMBER_DISPLAY[Number_temp];
 214   2                      else
 215   2                      {
 216   3                              if(Zero_Display == 1)
 217   3                                      VFD_RAMData[i_temp] = NUMBER_DISPLAY[0];
 218   3                              else
 219   3                                      VFD_RAMData[i_temp] = CHAR_;
 220   3                      }
 221   2              }
 222   1              for(i=0; i < length; i++)
 223   1              {
 224   2                      if((length > 1) && (i == 1))            
 225   2                      {
 226   3                              if(Need_Dot_On == 1)
 227   3                                      VFD_RAMData[i] |= 0x8000;
 228   3                                      
 229   3                      }
 230   2                      VFD_SendByte(LowByte(VFD_RAMData[i]));
 231   2                  VFD_SendByte(HighByte(VFD_RAMData[i]));
 232   2                      
 233   2                              
 234   2              }
 235   1              if( Other_to_Zero == 1)
 236   1              {
 237   2                      for(i=length; i < 5; i++)
 238   2                      {
 239   3                              VFD_SendByte(0);
 240   3                          VFD_SendByte(0);
 241   3                      }
C51 COMPILER V7.20   VFDTASK                                                               06/30/2005 14:02:58 PAGE 5   

 242   2              }
 243   1              Delay5US();
 244   1              SET_VFD_CS;
 245   1              
 246   1      }
 247          
 248          /*===================================================================
 249          描述:    将要显示的内容拷贝到BUFFER中, 内容长度=Grid_Size
 250          参数:    VFD_MSG *msg, 指向VFD_MSG结构常量的指针,包括长度和消息字符
 251          返回:    无
 252          ===================================================================*/
 253          void   VFD_WriteLedPort(BYTE LedPort)
 254          {
 255   1              CLEAR_VFD_CS;
 256   1              Delay5US();
 257   1          Delay5US();
 258   1              VFD_SendByte(VFD_WRITE_LED);
 259   1              VFD_SendByte(LedPort);
 260   1              Delay5US();
 261   1          Delay5US();

⌨️ 快捷键说明

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