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

📄 hd7279.lst

📁 在51单片机上用7279芯片驱动键盘和数码管
💻 LST
字号:
C51 COMPILER V8.02   HD7279                                                                07/26/2008 10:59:22 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE HD7279
OBJECT MODULE PLACED IN hd7279.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE hd7279.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg52.h>
   2          
   3          void long_delay(void); 
   4          void short_delay(void); 
   5          void delay10ms(unsigned char); 
   6          void write7279(unsigned char, unsigned char);   // 写入HD7279
   7          unsigned char read7279(unsigned char);                  // 读HD7279
   8          void send_byte(unsigned char);                          //发送1个字节    
   9          unsigned char receive_byte(void);                       //接受1个字节
  10          unsigned char digit[5];                                 //变量即I/O口定义
  11          unsigned char key_number, j, k;
  12          unsigned int tmr;
  13          unsigned long wait_cnter;
  14          
  15          sbit cs=P2^0;   // 
  16          sbit clk=P2^1;  //
  17          sbit dat=P2^2;  //  
  18          sbit key=P2^3;  // 
  19          //****** HD7279A ******
  20          #define CMD_RESET 0xa4      //复位指令
  21          #define CMD_TEST 0xbf       //测试指令
  22          #define DECODE0 0x80        //方式0译码
  23          #define DECODE1 0xc8        //方式1译码
  24          #define CMD_READ 0x15       //读键盘指令
  25          #define UNDECODE 0x90       //不译码指令
  26          #define RTL_CYCLE 0xa3      //循环左移
  27          #define RTR_CYCLE 0xa2      //循环右移
  28          #define RTL_UNCYL 0xa1      //左移
  29          #define RTR_UNCYL 0xa0      //右移
  30          #define ACTCTL 0x98         //消隐
  31          #define SEGON 0xe0          //段电亮
  32          #define SEGOFF 0xc0         //闪烁控制
  33          #define BLINKCTL 0x88
  34          void main()
  35          {
  36   1      while (1)
  37   1       {
  38   2              //for (tmr=0;tmr<0x2000;tmr++); //上电延时
  39   2              //send_byte(CMD_RESET);         // HD7279A
  40   2              //******************************************
  41   2              // 闪烁及键盘借口测试
  42   2              //******************************************
  43   2              send_byte(CMD_TEST); //
  44   2              for (j=0;j<3;j++) // 3
  45   2                  {
  46   3                    delay10ms(100);
  47   3                   }
  48   2              send_byte(CMD_RESET); //消除显示
  49   2              //*********************************************
  50   2              //10S无键盘按下,顺序执行
  51   2              //**********************************************
  52   2              wait_cnter=0;
  53   2              key_number=0xff;
  54   2              write7279(BLINKCTL,0xfc);     // 1 2位为闪烁位
  55   2              write7279(UNDECODE,0X08);     // 1 '_'
C51 COMPILER V8.02   HD7279                                                                07/26/2008 10:59:22 PAGE 2   

  56   2              write7279(UNDECODE+1,0x08);   // 2 '_'
  57   2              do
  58   2              {
  59   3                 if (!key)                    //有键按下
  60   3                     {
  61   4                                      key_number=read7279(CMD_READ);//读出键码
  62   4                                      write7279(DECODE1+1,key_number/16);//第2位显示键码高8位
  63   4                                      write7279(DECODE1,key_number&0x0f);//第1位显示键码低 8位
  64   4                                      while (!key);                      //等待键码按下
  65   4                                      wait_cnter=0;
  66   4                      }
  67   3                 wait_cnter++;
  68   3              } while (key_number!=0 && wait_cnter<0x30000);
  69   2              //按键为0和超时进入下一步
  70   2              write7279(BLINKCTL,0xff);          // 消除闪烁       
  71   2              //快速计数
  72   2      
  73   2       //*************数码管显示
  74   2      
  75   2              for (j=0;j<5;j++) // 初始值00000        
  76   2                 {
  77   3                       digit[j]=0;
  78   3                       write7279(DECODE0+j,digit[j]);
  79   3                 }
  80   2              while (digit[4]<2) // 计数到20000就停止
  81   2              {
  82   3                                      digit[0]++;
  83   3                                      if (digit[0]>9)
  84   3                                      {
  85   4                                              digit[0]=0;
  86   4                                              digit[1]++;
  87   4                                              if (digit[1]>9)
  88   4                                              {
  89   5                                                digit[1]=0;
  90   5                                                digit[2]++;
  91   5                                                if (digit[2]>9)
  92   5                                                  {
  93   6                                                               digit[2]=0;
  94   6                                                               digit[3]++;
  95   6                                                               if (digit[3]>9)
  96   6                                                                {
  97   7                                                                        digit[3]=0;
  98   7                                                                        digit[4]++;
  99   7                                                                        if (digit[4]>9)
 100   7                                                                          {
 101   8                                                                           digit[4]=0;
 102   8                                                                          }
 103   7                                                                }
 104   6                                              }
 105   5                                           }
 106   4                              }
 107   3      
 108   3                      
 109   3                              write7279(DECODE0,digit[0]);
 110   3                              if (digit[0]==0)
 111   3                                 {
 112   4                                              write7279(DECODE0+1,digit[1]);
 113   4                                              if (digit[1]==0)
 114   4                                                 {
 115   5                                                              write7279(DECODE0+2,digit[2]);
 116   5                                                              if (digit[2]==0)
 117   5                                                                      {
C51 COMPILER V8.02   HD7279                                                                07/26/2008 10:59:22 PAGE 3   

 118   6                                                                        write7279(DECODE0+3,digit[3]);
 119   6                                                                        if (digit[3]==0)
 120   6                                                                            {
 121   7                                                                             write7279(DECODE0+4,digit[4]);
 122   7                                                                            }
 123   6                                                                      }
 124   5                                              }
 125   4                                  }
 126   3              }
 127   2              
 128   2              delay10ms(150);
 129   2              send_byte(CMD_RESET); //消除显示
 130   2              //************************
 131   2              //下载数据但不译码
 132   2              //***********************
 133   2              write7279(UNDECODE+7,0x49);
 134   2              delay10ms(80);
 135   2              //*************************************************
 136   2              //循环左右移动“三”左右移动23次
 137   2              //*************************************************
 138   2              for (j=0;j<23;j++)
 139   2                      {
 140   3                              send_byte(RTR_CYCLE); // 右移23次
 141   3                              delay10ms(12);
 142   3                      }
 143   2              for (j=0;j<23;j++)
 144   2                      {
 145   3                              send_byte(RTL_CYCLE); // 左移23
 146   3                              delay10ms(12);
 147   3                      }
 148   2              //*********************************************
 149   2              for (j=0;j<16;j++)
 150   2                      {
 151   3                              send_byte(RTL_UNCYL);           //不循环左移
 152   3                              write7279(DECODE0,j);           //译码方式0,显示在第一位
 153   3                              delay10ms(50);
 154   3                      }
 155   2              delay10ms(150);
 156   2              send_byte(CMD_RESET);
 157   2              //*********************************************
 158   2              for (j=0;j<16;j++)
 159   2              {
 160   3                 send_byte(RTR_UNCYL)   ;            //不循环右移
 161   3                 write7279(DECODE1+7,j) ;          //译码方式1,显示在第8位
 162   3                 delay10ms(50);
 163   3              }
 164   2              delay10ms(150);
 165   2              //*********************************************
 166   2              //消隐指令测试
 167   2              //*****************************
 168   2              k=0xff;
 169   2              for (j=0;j<6;j++)
 170   2                      {
 171   3                              k=k/2;
 172   3                              write7279(ACTCTL,k);            //每间隔1秒增加一个消隐位 
 173   3                              delay10ms(100);
 174   3                      }write7279(ACTCTL,0xff);        // 恢复8位显示
 175   2              delay10ms(100);
 176   2              send_byte(CMD_RESET);           //消除显示
 177   2              //**********************************************
 178   2              for (j=0;j<64;j++)
 179   2                      { 
C51 COMPILER V8.02   HD7279                                                                07/26/2008 10:59:22 PAGE 4   

 180   3                              write7279(SEGON,j); // 64个显示段逐个电亮
 181   3                              write7279(SEGOFF,j-1); //同时将前一个显示段关闭
 182   3                              delay10ms(20);
 183   3                      }
 184   2       }
 185   1      }
 186          //********************************************** 功能 子函数
 187          void write7279(unsigned char cmd, unsigned char dta)
 188          {
 189   1              send_byte (cmd);
 190   1              send_byte (dta);
 191   1      }
 192          
 193          unsigned char read7279(unsigned char command)
 194          {
 195   1              send_byte(command);
 196   1              return(receive_byte());
 197   1      }
 198          
 199          void send_byte( unsigned char out_byte)
 200          {
 201   1              unsigned char i;
 202   1              cs=0;
 203   1              long_delay();
 204   1              for (i=0;i<8;i++)
 205   1               {
 206   2                      if (out_byte&0x80)
 207   2                              {
 208   3                                 dat=1;
 209   3                              }
 210   2                      else
 211   2                              {
 212   3                                 dat=0;
 213   3                              
 214   3                              }
 215   2                      clk=1;
 216   2                      short_delay();
 217   2                      clk=0;
 218   2                      short_delay();
 219   2                      out_byte=out_byte*2;
 220   2              }
 221   1              dat=0;
 222   1      }
 223          unsigned char receive_byte(void)
 224            {
 225   1              unsigned char i, in_byte;
 226   1              dat=1;                                  //设为输入状态
 227   1              long_delay();
 228   1      
 229   1              for (i=0;i<8;i++)
 230   1              {
 231   2                      clk=1;
 232   2                      short_delay();
 233   2                      in_byte=in_byte*2;
 234   2                      if (dat)
 235   2                      {
 236   3                              in_byte=in_byte|0x01;
 237   3                      }
 238   2                      clk=0;
 239   2                      short_delay();
 240   2         }
 241   1              dat=0;
C51 COMPILER V8.02   HD7279                                                                07/26/2008 10:59:22 PAGE 5   

 242   1              return (in_byte);
 243   1       }
 244          
 245          void long_delay(void)
 246          {
 247   1              unsigned char i;
 248   1              for (i=0;i<0x30;i++);
 249   1              }
 250                      void short_delay(void)
 251                  {
 252   1              unsigned char i;
 253   1              for (i=0;i<8;i++);
 254   1      }
 255          // ********************* 延时n*10ms **********************
 256          void delay10ms(unsigned char time)
 257          {
 258   1          unsigned char i;
 259   1          unsigned int j;
 260   1           for (i=0;i<time;i++)
 261   1           {
 262   2            for(j=0;j<0x390;j++)
 263   2            {
 264   3            if (!key)
 265   3             {
 266   4              key_int();
*** WARNING C206 IN LINE 266 OF HD7279.C: 'key_int': missing function-prototype
 267   4             }
 268   3            }
 269   2           }
 270   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    703    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     14       9
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  1 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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