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

📄 5045_spi_c.lst

📁 对x5045的c语言读写操作
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.50   5045_SPI_C                                                            05/10/2009 09:56:48 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE 5045_SPI_C
OBJECT MODULE PLACED IN 5045_SPI_C.OBJ
COMPILER INVOKED BY: D:\学习资料\单片机开发软件\C51\BIN\C51.EXE 5045_SPI_C.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*用C语言编的5045程序
   2          K1键:加一键。实验板上闪烁的字符加一,前两位是地址值,后两位是数据值。
   3          K2键:减一键。实验板上闪烁的字符减一,前两位是地址值,后两位是数据值。
   4          K3键:读写交换键。P1^0亮,表示读指示;P1^1亮,表示写指示。
   5          K4键:多功能键。按一下,控制P^4的点亮或熄灭,亮,表示K1和K2改写的是地址,同时地址值闪烁;
   6                连按两下控制P1^5的点亮,表示执行(K1,K2,K3或K4任意键按一下,P1^5都会熄灭)。
   7          */
   8          #include<reg51.h>
   9          #include<intrins.h>
  10          
  11          void initial(void);                     //函数声明
  12          void kscan(void);
  13          void SPISendByte(unsigned char ch);
  14          unsigned char SPIreceiveByte();
  15          void ChangeAdr(unsigned char Adr);
  16          void ChangeData(unsigned char Data);
  17          void Display(void);
  18          void mDelay(unsigned char Delay);
  19          unsigned char ReadStatus(void);
  20          void WriteStatus(void);
  21          unsigned char ReadEEP(void);
  22          void WriteEEP(void);
  23          //bit CheakWrite(void);
  24          
  25          #define T0INIT_H (65536-2000)/16
  26          #define T0INIT_L (65536-2000)%16
  27          #define uchar unsigned char
  28          #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  29          //5045命令定义
  30          #define WREN 0x06        //读允许命令,Enable Write Operation
  31          #define WRDI 0x04        //读禁止命令,Disable Write Operation
  32          #define RDSR 0x05        //读状态寄存器,Read Status Register
  33          #define WRSR 0x01        //写状态寄存器,Write Status Register
  34          #define READ_L 0x03       //读低256字节EEProm
  35          #define READ_H 0x0b       //读高256字节EEProm
  36          #define WRITE_L 0x02      //写低256字节EEProm
  37          #define WRITE_H 0x0a      //写高256字节EEProm
  38          
  39          uchar bdata flag;
  40          sbit flag_k=flag^0;          //有键按下标志
  41          sbit flag_k12_first=flag^1;     //键1和键2第一次按下标志
  42          sbit flag_k3_first=flag^2;      //K3第一次按键标志
  43          sbit flag_k_enter=flag^3;       //有键按下标志,为的是减少硬件是用次数
  44          sbit flag_addr_data=flag^4;     //地址或数据加减标志
  45          sbit K4_func1=flag^5;    //k4功能键标志
  46          sbit K4_func2=flag^6;
  47          sbit DorW=flag^7;
  48          sbit P1_0=P1^0;
  49          sbit P1_1=P1^1;
  50          
  51          sbit P1_2=P1^2;    //K1键显示
  52          sbit P1_3=P1^3;    //K2键显示
  53          sbit P1_4=P1^4;    //K4功能1显示,亮,地址调节;灭,数据调节
  54          sbit P1_5=P1^5;    //K4功能2显示
  55          //bit bdata P12=1,P13=1,P14=1,P15=1;    //写这一句的时候代码是380多,不加的话是250左右
C51 COMPILER V7.50   5045_SPI_C                                                            05/10/2009 09:56:48 PAGE 2   

  56          uchar bdata dictation;
  57          sbit P12=dictation^0;sbit P13=dictation^1;sbit P14=dictation^2;sbit P15=dictation^3;
  58          sbit flag_k4_first=dictation^4;   //作为k4键的第一次设置标志
  59          uchar Addr,Data,QdorYsh,K4_Delay,K4_Count;         //用到的字节定义
  60          uchar ds;    //显示位选择
  61          uchar code GYshjzh[16]={0xC0,0xF9,0xA4,0xB0,     //共阳十进制值,十位数字转换字节存放区0---F
  62                                    0x99,0x92,0x82,0xF8,
  63                                                            0x80,0x90,0x88,0x83,
  64                                                            0xC6,0xA1,0x86,0x8E};
  65          uchar  code DisBit[6]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};   //显示位字节存放区,中间两个是消隐码
  66          uchar  idata DisData[12]={0xc0,0xc0,0xff,0xff,0xc0,0xc0,
  67                                    0xff,0xff,0xff,0xff,0xc0,0xc0};   //显示数据字节存放区,0xff是消隐码,地址消隐
  68          //uchar  AdrH,AdrL,Hidden,Hidden,DataH,DataL;
  69          //uchar  idata *DisPoi[6];  //定义指针数组,指示显示的每位的数字
  70          //-----------------------函数声明,变量定义--------------------------------------------------------
  71          sbit SCK=P3^6;                           // 将p3.6口模拟时钟输出
  72          sbit MOSI=P3^7;                          // 将p3.7口模拟主机输出
  73          sbit MISO=P3^7;                          // 将p3.7口模拟主机输入
  74          sbit CS=P2^1;                           // 将p2.1口模拟片选
  75          sbit WP=P2^0;                                                   //写保护
  76          /**********主函数***************************/
  77          void main()
  78          {
  79   1          initial();
  80   1          while(1)
  81   1              { Display();
  82   2                if(K4_func1==1)
  83   2                  { 
  84   3                        P14=~P14;
  85   3                        P1_4=P14;
  86   3                        flag_addr_data=~flag_addr_data;
  87   3                        if(flag_addr_data==1)   //数据闪烁,表明修改的内容是数据
  88   3                        {
  89   4                          DisData[6]=DisData[0];
  90   4                              DisData[7]=DisData[1];
  91   4                              DisData[10]=0xff;
  92   4                              DisData[11]=0xff;
  93   4                        }
  94   3                        else                      //地址闪烁,表明修改的内容是地址
  95   3                        {
  96   4                          DisData[6]=0xff;
  97   4                              DisData[7]=0xff;
  98   4                              DisData[10]=DisData[4];
  99   4                              DisData[11]=DisData[5];
 100   4                        }
 101   3                        K4_func1=0;
 102   3                      }
 103   2                if(K4_func2==1)
 104   2                  { //P1_5=0;       //P1_5LED点亮,表示读写执行
 105   3      //                P15=~P15;
 106   3      //                P1_5=P15;
 107   3                        if(DorW==1)     //读命令
 108   3                         {Data=ReadEEP();
 109   4                              ChangeData(Data);
 110   4                              if(flag_addr_data==1)     //数据闪烁,表明修改的内容是数据
 111   4                            {
 112   5                             DisData[6]=DisData[0];
 113   5                                 DisData[7]=DisData[1];
 114   5                                 DisData[10]=0xff;
 115   5                                 DisData[11]=0xff;
 116   5                            }
 117   4                          else                      //地址闪烁,表明修改的内容是地址
C51 COMPILER V7.50   5045_SPI_C                                                            05/10/2009 09:56:48 PAGE 3   

 118   4                           {
 119   5                             DisData[6]=0xff;
 120   5                                 DisData[7]=0xff;
 121   5                                 DisData[10]=DisData[4];
 122   5                                 DisData[11]=DisData[5];
 123   5                           }
 124   4                         }
 125   3                        else
 126   3                         {
 127   4                              WriteEEP();
 128   4      //          CheakWrite(void);                   //5045状态检查操作
 129   4                         } 
 130   3                        K4_func2=0;
 131   3                        P1_5=0;       //P1_5LED点亮,表示读写执行
 132   3                       // P1_5=1;       //P1_5LED熄灭
 133   3                      }
 134   2              }
 135   1      }
 136          void initial(void)
 137          {
 138   1         TMOD=0x01;     //定时器0工作于方式1
 139   1         TH0=T0INIT_H;
 140   1         TL0=T0INIT_L;
 141   1         TR0=1;         //定时器0开始运行
 142   1         EA=1;
 143   1         ET0=1;
 144   1         DorW=1;        //设置为读显示
 145   1         P1_0=0;                //读显示灯亮
 146   1         P12=1;
 147   1         P13=1;
 148   1         P14=1;
 149   1         P15=1;
 150   1         WriteStatus();
 151   1      }
 152          /*************T0中断程序*********************
 153                  键盘扫描程序
 154          ******************/
 155          void T0int(void) interrupt 1 using 1
 156          {  //P1_0=0;
 157   1         TH0=T0INIT_H;
 158   1         TL0=T0INIT_L;
 159   1         if(K4_Delay!=0)
 160   1            {
 161   2                  K4_Delay--;
 162   2                      if(K4_Delay==0)
 163   2                       {if(K4_Count!=1)
 164   3                         {
 165   4                          K4_func2=1;
 166   4                          K4_Count=0;    //计数器复位
 167   4                         }
 168   3                       else
 169   3                         { 
 170   4                           K4_func1=1;
 171   4                           K4_Count=0;   //计数器复位
 172   4                               P1_5=1;       //再一次有键按下,P1_5LED熄灭
 173   4                         }
 174   3                         flag_k4_first=0;    //取消标志位,可以下次再用
 175   3                       }
 176   2            }
 177   1      //      else
 178   1      //        ;
 179   1         if(flag_k==1)
C51 COMPILER V7.50   5045_SPI_C                                                            05/10/2009 09:56:48 PAGE 4   

 180   1          {   QdorYsh--;
 181   2                if(QdorYsh!=0)
 182   2      //           QdorYsh--;
 183   2                         ;
 184   2                else
 185   2                  kscan();
 186   2          }
 187   1         else
 188   1           kscan();
 189   1      }
 190          /*****************键盘扫描程序*****************/
 191          void kscan(void)
 192          {                uchar j;
 193   1              j=P3&0x3c;
 194   1            if(j!=0x3c)    //我加上括号就是259个code,不加的话是132个code
 195   1                      {
 196   2                        if(flag_k==1)
 197   2                          {
 198   3                                switch(P3&0x3c)
 199   3                                 { 
 200   4                                   case 0x38: //K1键处理程序
 201   4      //                                  P12=~P12;
 202   4      //                                  P1_2=P12;
 203   4                    P1_5=1;       //再一次有键按下,P1_5LED熄灭
 204   4                                if(flag_addr_data==0)
 205   4                                         {if(flag_k12_first==1)
 206   5                                           {
 207   6                                                 Addr++;
 208   6                                                 ChangeAdr(Addr);
 209   6                                                 QdorYsh=20;
 210   6                                               }
 211   5                                         else
 212   5                                           {
 213   6                                                 Addr++;
 214   6                                                 ChangeAdr(Addr);
 215   6                                                 flag_k12_first=1;
 216   6                                                 QdorYsh=200;
 217   6                                               }
 218   5                                              }
 219   4                                    else
 220   4                                        {if(flag_k12_first==1)
 221   5                                           {
 222   6                                                 Data++;
 223   6                                                 ChangeData(Data);
 224   6                                                 QdorYsh=20;
 225   6                                               }
 226   5                                         else
 227   5                                           {
 228   6                                                 Data++;
 229   6                                                 ChangeData(Data);
 230   6                                                 flag_k12_first=1;
 231   6                                                 QdorYsh=200;
 232   6                                               }
 233   5                                              }
 234   4                                                 flag_k=0;
 235   4                                                break;
 236   4                                        case 0x34: //K2键处理程序
 237   4      //                                 P13=~P13;
 238   4      //                                 P1_3=P13;
 239   4                         P1_5=1;       //再一次有键按下,P1_5LED熄灭
 240   4                                         if(flag_addr_data==0)

⌨️ 快捷键说明

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