?? dianzi.lst
字號:
739 1 }
740 /* 寫數(shù)據(jù)進數(shù)據(jù)Flash存儲器(EEPROM), 只在同一個扇區(qū)內(nèi)寫,保留同一扇區(qū)中不需修改的數(shù)據(jù) */
741 /* begin_addr,被寫數(shù)據(jù)Flash開始地址;counter,連續(xù)寫多少個字節(jié); array[],數(shù)據(jù)來源 */
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 /* 判是否是有效范圍,此函數(shù)不允許跨扇區(qū)操作 */
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 /* 假定從扇區(qū)的第0個字節(jié)開始,到USED_BYTE_QTY_IN_ONE_SECTOR-1個字節(jié)結束,后面部分不用,程序易編寫 */
753 1 if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )
754 1 return ERROR;
755 1
756 1 /* 將該扇區(qū)數(shù)據(jù) 0 - (USED_BYTE_QTY_IN_ONE_SECTOR-1) 字節(jié)數(shù)據(jù)讀入緩沖區(qū)保護 */
757 1 sector_addr = (begin_addr & 0xfe00); /* 1111,1110,0000,0000; 取扇區(qū)地址 */
758 1 byte_addr = sector_addr; /* 扇區(qū)地址為扇區(qū)首字節(jié)地址 */
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 /* 將要寫入的數(shù)據(jù)寫入保護緩沖區(qū)的相應區(qū)域,其余部分保留 */
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 /* 擦除 要修改/寫入 的扇區(qū) */
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; /* 觸發(fā)ISP_IAP命令 */
791 1 ISP_TRIG = 0xb9; /* 觸發(fā)ISP_IAP命令 */
792 1 _nop_();
793 1
794 1 /* 將保護緩沖區(qū)的數(shù)據(jù)寫入 Data Flash, EEPROM */
795 1 byte_addr = sector_addr; /* 扇區(qū)地址為扇區(qū)首字節(jié)地址 */
796 1 for(i = 0; i< USED_BYTE_QTY_IN_ONE_SECTOR; i++)
797 1 {
798 2 /* 寫一個字節(jié) */
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; /* 觸發(fā)ISP_IAP命令 */
806 2 ISP_TRIG = 0xb9; /* 觸發(fā)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; /* 觸發(fā)ISP_IAP命令 */
816 2 ISP_TRIG = 0xb9; /* 觸發(fā)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 /* 判是否是有效范圍,此函數(shù)不允許跨扇區(qū)操作 */
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 /* 假定從扇區(qū)的第0個字節(jié)開始,到USED_BYTE_QTY_IN_ONE_SECTOR-1個字節(jié)結束,后面部分不用*/
840 1 if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR ) //不允許跨扇區(qū)
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; /* 觸發(fā)ISP_IAP命令 */
854 2 ISP_TRIG = 0xb9; /* 觸發(fā)ISP_IAP命令 */
855 2 _nop_();
856 2
857 2 array[i]=ISP_DATA; //讀數(shù)據(jù)
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 + -