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

📄 led595.lst

📁 智能数字电流表。双CPU工作
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.01  LED595                                                                 05/17/2004 17:50:55 PAGE 1   


C51 COMPILER V7.01, COMPILATION OF MODULE LED595
OBJECT MODULE PLACED IN LED595.OBJ
COMPILER INVOKED BY: C:\Keil\C51\Bin\c51.exe LED595.C DB SB OE ROM(SMALL) SMALL OT(6,SPEED) WL(2) RB(0)

stmt level    source

   1          /******************************************************************
   2           程序名:LED595
   3           功能:接收主机发来的数据,在LED上显示数据。
   4           创建时间:2004-3-29
   5           作者:华明 
   6           ******************************************************************/
   7          
   8          //#include <stdio.h>
   9          #include <reg51.h>
  10          
  11          #define uchar unsigned char
  12          #define uint unsigned int
  13          #define byte uchar
  14          #define word uint
  15          
  16          //定义输出引脚
  17          sbit SER  = P3^4;   //输入的数据
  18          sbit SCLK = P3^5;   //串行输入,上升延有效
  19          sbit RCLK = P3^7;   //送锁存器信号,上升延有效
  20          sbit TRG  = P3^2;
  21          sbit CLK =  P3^1;
  22          sbit DATA = P3^0;
  23          sbit SMG5 = P1^7;   
  24          sbit SMG4 = P1^6;
  25          sbit SMG3 = P1^5;
  26          sbit SMG2 = P1^4;
  27          sbit SMG1 = P1^3;
  28          
  29          typedef struct _LEDNODE
  30          {
  31                  uint utime;    //改LED点亮的延时
  32                  uint utime2;
  33                  uchar uCode;   //段码
  34                  uchar uSelect; //段选
  35          }LEDNODE, *PLEDNODE;
  36          
  37          //段码0,1,2,3,4,5,6,7,8,9
  38          uchar code uLEDChar[] = {0x3f, 0x06, 0x9b, 0x8f, 0xa6, 0xad, 0xbd, 0x07, 0xbf, 0xaf};
  39          
  40          //段选择码,分别为1、2、3、4、5
  41          uchar code uSelChar[] = {0x7F, 0xBF, 0xDF,0xEF, 0xF7};
  42          
  43          //uchar bGetData[5];   //读取的显示数据
  44          LEDNODE LedNode[5] = {{1, 1000, 0x3f, 0x7F},
  45                                {1, 1000, 0x3f, 0xBF}, 
  46                                {1, 1000, 0x7f, 0xDF}, 
  47                                {1, 1000, 0x3f, 0xEF}, 
  48                                {1, 1000, 0x3f, 0xF7}};
  49          
  50          uchar sparkle = 10;  //闪烁控制
  51          uchar uCmd = 'N';    //显示控制命令
  52          uchar uSelIndex, uDataIndex;
  53          
  54          //延时
  55          void Delay(uint utime, uint utime2)
C51 COMPILER V7.01  LED595                                                                 05/17/2004 17:50:55 PAGE 2   

  56          { 
  57   1              uint utimein;
  58   1              while (utime --)
  59   1              {
  60   2                       utimein = utime2;
  61   2                    while(utimein --);
  62   2              }
  63   1      }
  64          
  65          //接收主机发来的数据
  66          byte I_Receive(void)
  67          {
  68   1               byte uData = 0;
  69   1               register byte i;
  70   1               for (i = 0; i<8; i++)
  71   1               {
  72   2                      while (!CLK);    //等待,阻塞
  73   2                      uData *= 2;
  74   2                      if (DATA)  
  75   2                          uData ++;
  76   2           }
  77   1           return uData;      
  78   1      }
  79          
  80          
  81          //接受主机发来的数据中断函数
  82          /************************************
  83           通信协议:
  84           1.静态显示
  85             命令:'N'要求静态显示; 
  86           2.指定片闪烁
  87             命令:'S'要求某一片闪烁; 
  88             数据:(1)片选下标(0-4), 如果超过了4,
  89                     表示主机不再发送短码,
  90                             并将片选下标减去4,
  91                         表示当前要求闪烁的LED片;
  92                          (2)若下标在0-4之间,则发送段码过来; 
  93           3.全部闪烁
  94             命令:'A'要求全部闪烁, sparkle = 10; 
  95           4.传输连续5片段码
  96             命令:'T'要求传送5个段码的编号;
  97           5.设置小数点
  98             命令:'P'要求在指定位置上加小数点
  99             数据:指定位置下标     
 100           ************************************/
 101           
 102          void ReadData(void) interrupt 0 
 103          {
 104   1           
 105   1           uchar bData, i;
 106   1               //禁止中断
 107   1               EA = 0; 
 108   1               
 109   1               //读取命令
 110   1               bData = I_Receive();
 111   1               //分析命令
 112   1               switch (bData)
 113   1               {
 114   2               case 'N':
 115   2                       LedNode[uSelIndex].uSelect = uSelChar[uSelIndex];  //恢复当前片为静止显示
 116   2                   uCmd = bData;
 117   2                       break;
C51 COMPILER V7.01  LED595                                                                 05/17/2004 17:50:55 PAGE 3   

 118   2               case 'S':
 119   2               {
 120   3                       LedNode[uSelIndex].uSelect = uSelChar[uSelIndex];  //恢复当前片为静止显示
 121   3                       uSelIndex = I_Receive();    //得到位码 
 122   3                       if (uSelIndex > 4)   //超过了位数,表示不要求传送数据
 123   3                              uSelIndex = uSelIndex - 4;
 124   3                   else
 125   3                      LedNode[uSelIndex].uCode = I_Receive();  //得到段码
 126   3                       uCmd = bData;
 127   3               }
 128   2                       break;
 129   2               case 'A':
 130   2                       LedNode[uSelIndex].uSelect = uSelChar[uSelIndex];  //恢复当前片为静止显示
 131   2                   sparkle = 10;
 132   2                       uCmd = bData;
 133   2                       break;
 134   2               case 'T':
 135   2               {
 136   3                       for (i=0; i<5; i++)
 137   3                        LedNode[4-i].uCode = I_Receive();      
 138   3           }          
 139   2                       break;
 140   2               case 'P':
 141   2                   uSelIndex = I_Receive();    //得到位码
 142   2                   for (i=0; i<5; i++)
 143   2                        LedNode[i].uCode &= 0xBF;    //取消小数点
 144   2                       LedNode[uSelIndex].uCode |= 0x40;    //设置小数点 
 145   2                       break;
 146   2               }
 147   1               //开中断
 148   1               EA = 1;
 149   1           return;
 150   1      }
 151          
 152          //显示一片LED
 153          void DisplayData(PLEDNODE pNode)
 154          {
 155   1              uchar i, uData, utime, utime2;
 156   1              uData = pNode->uCode;
 157   1              P1 = 0xff; //消隐
 158   1              for (i=0; i<8; i++)
 159   1              {
 160   2                       SER = uData & 0x80;
 161   2                       uData = uData << 1;        //左移1位
 162   2                       SCLK = 0;
 163   2                       SCLK = 1;
 164   2              }
 165   1              RCLK = 0;
 166   1              RCLK = 1;
 167   1              P1 = pNode->uSelect;

⌨️ 快捷键说明

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