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

📄 5045.lst

📁 单片及c语言轻松入门的随书光盘
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.06   5045                                                                  02/28/2006 10:27:15 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE 5045
OBJECT MODULE PLACED IN 5045.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE 5045.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /**************************************************
   2          ;    平凡单片机工作室
   3          ;  HTTP://WWW.MCUSTUDIO.COM
   4          ;   (C) COPYRIGHT 2003 PINGFAN'S MCUSTUDIO
   5          ;    ALL RIGHTS RESERVED
   6          ;5045.c
   7          ;作者:周坚   
   8          ;功能描述:
   9          ;开机后在每1、2位数码管显示00,D8点亮表示目前处于调整地址的状态
  10          ;此时按S1和S2,第1、2位数码管的数据从00~FF变化
  11          ;此时若按下S4键,则读出1、2位所示数据作为地址的EEPROM中的值,显示在第5、6位上
  12          ;按下S3键,D7点亮,表示进入调整数据状态,此时第5、6位数码管点亮显示值与第1、2位同
  13          ;按下S1和S2,第5、6位上的数据从00~FF变化
  14          ;此时若按下S4键,则将5、6位上的数据写入第1、2位指定的地址单元中
  15          **************************************************/
  16                  #define uchar unsigned char
  17                  #define uint  unsigned int
  18                  #include "reg52.h"
  19                  #include "intrins.h"
  20          
  21          
  22                  sbit    CS=P2^1;
  23                  sbit    SI=P3^7;
  24                  sbit    Sck=P3^6;
  25                  sbit    SO=P3^7;
  26                  sbit    WP=P2^0;
  27          
  28                  sbit    D1Led=P1^0;
  29                  sbit    D2Led=P1^1;
  30                  sbit    D8Led=P1^7;
  31          
  32                  bit             KFirst;         //第一次
  33                  bit             KFunc;          //代表两种功能
  34                  bit             KEnter;         //代表执行S4键的操作
  35          
  36                  uchar   AddrCount=0;    //地址计数值
  37                  uchar   NumCount=0;             //数据计数值
  38          
  39          #define Wdt200  0x90            //WD1 WD0=01
  40          #define Wdt600  0xa0            //WD1 WD0=10
  41          #define Wdt1400 0x80            //如果最高位是1代表设置看门狗WD1 WD0 =00
  42          #define NoWdt   0xb0            //WD1 WD0=11
  43          #define ProQtr  0x04            //BL1 BL0=01保护区域为高128字节
  44          #define ProHalf 0x08            //BL1 BL0=10写保护区域为高256字节
  45          #define ProAll  0x0c            //BL1 BL0=11写保护区域为整个存储器
  46          #define NoPro   0x00            //BL1 BL0=00不写保护
  47          
  48          #define nop2()  _nop_();_nop_()
  49          #define WREN_INST       0x06    // 写允许命令字(WREN)
  50          #define WRDI_INST       0x04    // 写禁止命令字(WRDI)
  51          #define WRSR_INST       0x01    // 写状态寄存器命令字(WRSR)
  52          #define RDSR_INST       0x05    // 读状态寄存器命令字(RDSR)
  53          #define WRITE_INST      0x02    // 写存储器命令字 (WRITE)
  54          #define READ_INST       0x03    // 读存储器命令字 (READ)
  55          #define MAX_POLL        0x99    //测试的最大次数
C51 COMPILER V7.06   5045                                                                  02/28/2006 10:27:15 PAGE 2   

  56          
  57          #define Hidden 0x10;    //消隐字符在字形码表中的位置
  58          uchar code BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};
  59          uchar code DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF
             -};
  60          uchar DispBuf[6];       //6字节的显示缓冲区
  61          
  62          uchar code TH0Val=63266/256;
  63          uchar code TL0Val=63266%256;//当晶振为11.0592时,定时2.5ms的定时器初值
  64          
  65          
  66          /*******************************************************************************************
  67          ;名称: OutByte
  68          ;描述:将一个字节送到EEPROM
  69          ;功能:移位送出一个字节,从最高位开始送EEPROM
  70          *******************************************************************************************/
  71          void OutByte(uchar Data)
  72          {   uchar  Counter=8;
  73   1          for(;Counter>0;Counter--)
  74   1          {
  75   2              Sck=0;
  76   2              if((Data&0x80)==0)  //最高位是0
  77   2                  SI=0;
  78   2              else 
  79   2                  SI=1;
  80   2              Sck=1;
  81   2              Data=Data<<1;
  82   2          }
  83   1          SI=0;
  84   1      }
  85          /*******************************************************************************************
  86          ;名称: InByte
  87          ;描述:从EEPROM中接收数据
  88          ;功能:从EEPROM中接收数据,高位在先
  89          *******************************************************************************************/
  90          uchar InByte(void)
  91          {   uchar result=0;
  92   1          uchar Counter=8;
  93   1          for(;Counter>0;Counter--)
  94   1          {
  95   2              Sck=1;
  96   2              nop2();
  97   2              Sck=0;
  98   2              result=result<<1;
  99   2              if(SO)          //如果输入线是高电平
 100   2                  result|=0x01;
 101   2           }
 102   1               return (result);
 103   1      }
 104          /*******************************************************************************************
 105          ;名称:RdsrCmd
 106          ;描述:读状态寄存器
 107          ;功能:送命令用以读状态寄存器
 108          *******************************************************************************************/
 109          uchar RdsrCmd()
 110          {       uchar result;
 111   1              Sck=0;
 112   1              CS=0;
 113   1              OutByte(RDSR_INST);
 114   1              result=InByte();        //读状态寄存器
 115   1              Sck=0;
 116   1              CS=1;
C51 COMPILER V7.06   5045                                                                  02/28/2006 10:27:15 PAGE 3   

 117   1              return(result);
 118   1      }       
 119          /*******************************************************************************************
 120          ;名称:WipPoll
 121          ;描述:器件内部编程检查
 122          ;功能:通过检查WIP位来确定X5045内部编程是否结束
 123          *******************************************************************************************/
 124          void WipPoll()
 125          {   uchar tmp;
 126   1          uchar i;
 127   1          for(i=0;i<MAX_POLL;i++)
 128   1          {   
 129   2              tmp=RdsrCmd();
 130   2              if((tmp&0x01)==0)
 131   2                  break;
 132   2          }
 133   1      }
 134          /*******************************************************************************************
 135          ;名称:WrenCmd
 136          ;描述:写允许
 137          ;功能:这段程序发送命令允许写存储器单元和状态寄存器
 138          *******************************************************************************************/
 139          void WrenCmd()
 140          {       Sck=0;                  //将SCK拉低
 141   1              CS=0;                   //将 /CS 拉低
 142   1              OutByte(WREN_INST);
 143   1              Sck=0;                  //将SCK拉低
 144   1              CS=1;                   // 将 /CS 升高
 145   1      }
 146          
 147          #define Wdt200  0x90            //WD1 WD0=01
 148          #define Wdt600  0xa0            //WD1 WD0=10
 149          #define Wdt1400 0x80            //如果最高位是1代表设置看门狗WD1 WD0 =00
 150          #define NoWdt   0xb0            //WD1 WD0=11
 151          #define ProQtr  0x04            //BL1 BL0=01保护区域为高128字节
 152          #define ProHalf 0x08            //BL1 BL0=10写保护区域为高256字节
 153          #define ProAll  0x0c            //BL1 BL0=11写保护区域为整个存储器
 154          #define NoPro   0x00            //BL1 BL0=00不写保护
 155          /*******************************************************************************************
 156          ;名称;WrsrCmd
 157          ;描述:写状态寄存器
 158          ;功能:将WD0、WD1、BP0、BP1的状态写入状态寄存器
 159          *******************************************************************************************/
 160          void WrsrCmd(uchar RegCode)
 161          {       uchar   tmp;
 162   1              Sck=0;                          //将SCK拉低
 163   1              CS=0;                           //将 /CS 拉低
 164   1              tmp=RdsrCmd();          //读出当前寄存器状态
 165   1              if((RegCode&0x7f)!=0)   //RegCode与0x7f(01111111)相与不等于0,说明MSB=1,即设置看门狗的命令
 166   1              {       tmp&=0x0f;                      //首先将读到的数的高4位清零
 167   2                      tmp|=RegCode;           
 168   2              }
 169   1              else
 170   1              {       tmp&=0xf0;              //否则是写保护类指令,清除低4位
 171   2                      tmp|=RegCode;
 172   2              }
 173   1              OutByte(WRSR_INST);     //写指令
 174   1              OutByte(tmp);
 175   1              Sck=0;
 176   1              CS=1;
 177   1              OutByte(WRSR_INST);     //写指令
 178   1              WipPoll() ;                     //测试是否已器件内部是否写完
C51 COMPILER V7.06   5045                                                                  02/28/2006 10:27:15 PAGE 4   

 179   1      }
 180          /*******************************************************************************************
 181          ;名称:WrdiCmd
 182          ;描述:写禁止
 183          ;功能:禁止对存储单元和状态寄存器写
 184          *******************************************************************************************/
 185          /*void WrdiCmd()
 186          {       Sck=0;                  //将SCK拉低
 187                  CS=0;                   //将 /CS 拉低
 188                  OutByte(WRDI_INST);
 189                  Sck=0;                  //将SCK拉低
 190                  CS=1;                   // 将 /CS 升高
 191          }                                       本程序中用不到这个函数,故注释掉,以免编译警告,需要用时将注释去掉即可*/        
 192          
 193          /*******************************************************************************************
 194          ;名称:ByteWrite
 195          ;描述:单字节写
 196          ;功能:本程序用于单字节写入EEPROM
 197          *******************************************************************************************/
 198          void ByteWrite(uint Address,uchar Data)
 199          {       uchar tmp;
 200   1              Sck=0;
 201   1              CS=0;
 202   1              tmp=WRITE_INST;
 203   1              if(Address>255)
 204   1                      tmp|=0x08;
 205   1              OutByte(tmp);
 206   1              tmp=(uchar)(Address&0x00ff);
 207   1              OutByte(tmp);
 208   1              OutByte(Data);
 209   1              Sck=0;
 210   1              CS=1;
 211   1              WipPoll();
 212   1      }
 213          /*******************************************************************************************
 214          ;名称:ByteRead
 215          ;描述:单字节读
 216          ;功能:本程序从EEPROM中读出一个字节
 217          *******************************************************************************************/
 218          uchar ByteRead(uint Address)

⌨️ 快捷键说明

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