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

📄 dianzi.lst

📁 实验学习型电子钟包括红外线控制密码da控制led亮度ad转换语音转换闹铃
💻 LST
📖 第 1 页 / 共 4 页
字号:
 739   1      }
 740          /* 写数据进数据Flash存储器(EEPROM), 只在同一个扇区内写,保留同一扇区中不需修改的数据    */
 741          /* begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源                  */
 742          uchar Write_flash(uint begin_addr, uint counter, uchar array[])
 743          {          uint       i=0;
 744   1                 uint       in_sector_begin_addr=0;
 745   1                 uint       sector_addr           =0;
 746   1                 uint       byte_addr=0;
 747   1      
 748   1                 /* 判是否是有效范围,此函数不允许跨扇区操作 */
 749   1                 if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
 750   1                            return ERROR;
 751   1                 in_sector_begin_addr=begin_addr & 0x01ff;         /* 0000,0001,1111,1111 */
 752   1                 /* 假定从扇区的第0个字节开始,到USED_BYTE_QTY_IN_ONE_SECTOR-1个字节结束,后面部分不用,程序易编写    */
 753   1                 if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )
 754   1                            return ERROR;
 755   1      
 756   1                 /* 将该扇区数据 0 - (USED_BYTE_QTY_IN_ONE_SECTOR-1) 字节数据读入缓冲区保护 */
 757   1                 sector_addr                      =          (begin_addr & 0xfe00);           /* 1111,1110,0000,0000; 取扇区地址                     */
 758   1                 byte_addr             =   sector_addr;                            /* 扇区地址为扇区首字节地址                                       */
 759   1      
 760   1                 ISP_IAP_enable();
 761   1                 for(i = 0; i < USED_BYTE_QTY_IN_ONE_SECTOR; i++)
 762   1                 {
 763   2                            ISP_ADDRH  =          (uchar)(byte_addr >> 8);
 764   2                            ISP_ADDRL  =          (uchar)(byte_addr & 0x00ff);
 765   2      
 766   2                            ISP_CMD               =          ISP_CMD    &          0xf8;        /* 1111,1000 *///读FLASH
 767   2                            ISP_CMD               =          ISP_CMD    |          READ_Command;         /* 0000,0001 */
 768   2      
 769   2                            ISP_TRIG   =          0x46;
 770   2                            ISP_TRIG   =          0xb9;
 771   2                            _nop_();
 772   2      
 773   2                            protect_buffer[i]     =          ISP_DATA;
 774   2                            byte_addr++;
 775   2                 }
 776   1      
 777   1                 /* 将要写入的数据写入保护缓冲区的相应区域,其余部分保留 */
 778   1                 for(i = 0; i < counter; i++)
 779   1                 {
 780   2                            protect_buffer[in_sector_begin_addr] = array[i];
 781   2                            in_sector_begin_addr++;
 782   2                 }
 783   1      
 784   1                 /* 擦除 要修改/写入 的扇区 */
 785   1                 ISP_ADDRH  =          (uchar)(sector_addr >> 8);
 786   1                 ISP_ADDRL  =          0x00;
 787   1                 ISP_CMD               =          ISP_CMD    &          0xf8;        /* 1111,1000 */
 788   1                 ISP_CMD               =          ISP_CMD    |          ERASE_Command;        /* 0000,0011 */
 789   1      
 790   1                 ISP_TRIG   =          0x46;        /* 触发ISP_IAP命令 */
 791   1                 ISP_TRIG   =          0xb9;        /* 触发ISP_IAP命令 */
 792   1                 _nop_();
 793   1      
 794   1                 /* 将保护缓冲区的数据写入 Data Flash, EEPROM */
 795   1                 byte_addr  =   sector_addr;                            /* 扇区地址为扇区首字节地址      */
 796   1                 for(i = 0; i< USED_BYTE_QTY_IN_ONE_SECTOR; i++)
 797   1                 {
 798   2                            /* 写一个字节 */
 799   2                            ISP_ADDRH  =          (uchar)(byte_addr >> 8);
C51 COMPILER V7.06   DIANZI                                                                08/21/2008 22:03:20 PAGE 14  

 800   2                            ISP_ADDRL  =          (uchar)(byte_addr & 0x00ff);
 801   2                            ISP_DATA   =          protect_buffer[i];
 802   2                            ISP_CMD               =          ISP_CMD    &          0xf8;        /* 1111,1000 */
 803   2                            ISP_CMD               =          ISP_CMD    |          PROGRAM_Command;                 /* 0000,0010 */
 804   2      
 805   2                            ISP_TRIG   =          0x46;        /* 触发ISP_IAP命令 */
 806   2                            ISP_TRIG   =          0xb9;        /* 触发ISP_IAP命令 */
 807   2                            _nop_();
 808   2      
 809   2                            /* 读回来 */
 810   2                            ISP_DATA   =          0x00;
 811   2      
 812   2                            ISP_CMD               =          ISP_CMD    &          0xf8;        /* 1111,1000 */
 813   2                            ISP_CMD               =          ISP_CMD    |          READ_Command;         /* 0000,0001 */
 814   2      
 815   2                            ISP_TRIG   =          0x46;        /* 触发ISP_IAP命令 */
 816   2                            ISP_TRIG   =          0xb9;        /* 触发ISP_IAP命令 */
 817   2                            _nop_();
 818   2      
 819   2                            /*  比较对错 */
 820   2                            if(ISP_DATA != protect_buffer[i])
 821   2                            {
 822   3                                       ISP_IAP_disable();
 823   3                                       return ERROR;
 824   3              }
 825   2              byte_addr++;
 826   2                 }
 827   1                 ISP_IAP_disable();
 828   1                 return OK;
 829   1      }
 830          uchar Read_flash(uint begin_addr, uint counter, uchar array[])  //读FLASH
 831          {
 832   1                 uint       i=0;
 833   1          uint  in_sector_begin_addr=0;
 834   1      
 835   1                 /* 判是否是有效范围,此函数不允许跨扇区操作 */
 836   1                 if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
 837   1                            return     ERROR;
 838   1                 in_sector_begin_addr=begin_addr & 0x01ff;         /* 0000,0001,1111,1111 */
 839   1                 /* 假定从扇区的第0个字节开始,到USED_BYTE_QTY_IN_ONE_SECTOR-1个字节结束,后面部分不用*/
 840   1                 if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )  //不允许跨扇区
 841   1                            return ERROR;
 842   1          
 843   1                 ISP_IAP_enable();
 844   1                 for(i = 0; i< counter; i++)
 845   1                 {
 846   2                            ISP_ADDRH  =          (uchar)(begin_addr >> 8);
 847   2                            ISP_ADDRL  =          (uchar)(begin_addr & 0x00ff);  //传地址
 848   2                            ISP_DATA   =          0x00;
 849   2      
 850   2                            ISP_CMD               =          ISP_CMD    &          0xf8;      /* 1111,1000 */
 851   2                            ISP_CMD     =         ISP_CMD    |          READ_Command;         /* 0000,0001 */
 852   2      
 853   2                            ISP_TRIG   =          0x46;      /* 触发ISP_IAP命令 */
 854   2                            ISP_TRIG   =          0xb9;      /* 触发ISP_IAP命令 */
 855   2                            _nop_();
 856   2      
 857   2                            array[i]=ISP_DATA;   //读数据
 858   2                            
 859   2              begin_addr++;
 860   2                 }
 861   1                 ISP_IAP_disable();
C51 COMPILER V7.06   DIANZI                                                                08/21/2008 22:03:20 PAGE 15  

 862   1                 return     OK;
 863   1      }
 864          void ProcessPlay()
 865          {
 866   1        uchar Play_temp;
 867   1         if( (DispBuf[0]*16 + DispBuf[1])<0x06 ) //零晨
 868   1                     { 
 869   2                      temp[1] = 15;
 870   2                     } //零晨
 871   1         else 
 872   1           {
 873   2                               if((DispBuf[0]*16 + DispBuf[1])<0x12)  //上午
 874   2                           {
 875   3                            temp[1]=16;  //上午
 876   3                                          }
 877   2                               else 
 878   2                                 {
 879   3                                          if((DispBuf[0]*16 + DispBuf[1])<0x18)  //下午
 880   3                                    temp[1]=18; //下午
 881   3                            else temp[1]=17; //晚上                     
 882   3                                         }
 883   2                  }
 884   1      
 885   1      Play_temp = 2;
 886   1      
 887   1                 if((DispBuf[0]*16 + DispBuf[1])<0x10)
 888   1                  {
 889   2                    temp[Play_temp++] = DispBuf[1];
 890   2                  }
 891   1                 else
 892   1            {
 893   2                     if((DispBuf[0]*16 + DispBuf[1])==0x10)
 894   2                             {
 895   3                               temp[Play_temp++] = 10;
 896   3                             }    //十
 897   2      
 898   2                        else
 899   2                          {
 900   3                                           if((DispBuf[0]*16 + DispBuf[1])<0x20)
 901   3                                             {
 902   4                                                      temp[Play_temp++] = 10;    //十 
 903   4                                                             temp[Play_temp++] = DispBuf[1];    //几点 
 904   4                                                    }
 905   3                                                  else
 906   3                                                    {
 907   4                                                      if((DispBuf[0]*16 + DispBuf[1])==0x20)
 908   4                                                              {
 909   5                                                                temp[Play_temp++] = DispBuf[0];    //二
 910   5                                                         temp[Play_temp++] = 10;    //十                                                   
 911   5                                                              }
 912   4                          else
 913   4                                                             {
 914   5                                                                temp[Play_temp++] = DispBuf[0];    //二
 915   5                             temp[Play_temp++] = 10;    //十            
 916   5                                                                temp[Play_temp++] = DispBuf[1];    //几点 
 917   5                                                             }           
 918   4                                                                                                                    
 919   4                                                     }
 920   3                                                    
 921   3                                         }
 922   2                    }
 923   1      
C51 COMPILER V7.06   DIANZI                                                                08/21/2008 22:03:20 PAGE 16  

 924   1           temp[Play_temp++] = 11;   //点 
 925   1      //          if(flag_baoshi==1){goto exit;}
 926   1          if((DispBuf[2]*16 + DispBuf[3])<0x10)
 927   1            {
 928   2                      temp[Play_temp++] = DispBuf[2];
 929   2               temp[Play_temp++] = DispBuf[3];
 930   2                             temp[Play_temp++] = 12;    //分   
 931   2                   }
 932   1                  else
 933   1                   {
 934   2                       if(DispBuf[3]==0)
 935   2                                {
 936   3                                           if(DispBuf[2]==1)
 937   3                                             {
 938   4                                                              temp[Play_temp++] = 10;    //十 
 939   4                                                              temp[Play_temp++] = 12;    //分                                  
 940   4                                                    }                   
 941   3                                           else
 942   3                                                      {
 943   4                                                                           temp[Play_temp++] = DispBuf[2];    //几十
 944   4                                                                           temp[Play_temp++] = 10;            //十 
 945   4                                                                           temp[Play_temp++] = 12;            //分                                   
 946   4                                                      }
 947   3                                }
 948   2                               else
 949   2                                 {
 950   3                                    if(DispBuf[2]==1)
 951   3                                             {
 952   4                                                      temp[Play_temp++] = 10;    //
 953   4                                                             temp[Play_temp++] = DispBuf[3];
 954   4                                                             temp[Play_temp++] = 12;    //分                                     
 955   4                                                    }
 956   3                                                  else
 957   3                                                             {
 958   4                                                                        temp[Play_temp++] = DispBuf[2];
 959   4                                                                        temp[Play_temp++] = 10;
 960   4                                                                        temp[Play_temp++] = DispBuf[3];    
 961   4                                                                        temp[Play_temp++] = 12;    //分  
 962   4                                                             }
 963   3                                        
 964   3                                        }
 965   2                   
 966   2                   }          
 967   1       //exit:;
 968   1       Play_num = Play_temp+1;
 969   1       TR1 = 1;
 970   1      
 971   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   3245    ----
   CONSTANT SIZE    =     38    ----
   XDATA SIZE       =    128    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     74      37
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      4    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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