📄 _rb_read.lst
字号:
C51 COMPILER V7.07 _RB_READ 04/12/2005 10:43:32 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE _RB_READ
OBJECT MODULE PLACED IN _RB_Read.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE _RB_Read.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <REG51.h>
2 #include "__24C16.h"
3
4 //-----------------------------------------------------------------------------------------
5 const unsigned long XTAL = 11059200;
6 const unsigned long baudrate = 9600;
7
8 const unsigned char Ins_Read_RomToPC = 0x55;
9 const unsigned char Ins_Write_PCToRom = 0x5A;
10 const unsigned char Ins_OK = 0x33;
11 const unsigned char Ins_NotOK = 0x26;
12 const unsigned char Ins_Start = 0xAA;
13 const unsigned char Ins_Stop = 0xDC;
14
15 void com_initialize(void);
16 void DataOut(unsigned char);
17 unsigned char DataIn(void);
18 void DelayX100ms(unsigned int);
19 unsigned char CheckSum(unsigned char*, int);
20 Bool RecPCData(unsigned char*, int);
21 void SendPCData(unsigned char*, int);
22 void ChangeAddr(unsigned char*, unsigned char*, unsigned char);
23 //-----------------------------------------------------------------------------------------
24 void main(void){
25 1 Byte PCIns[6]; //Instruction Form Length is 6; 1st is Ins, 2nd is DeviceAddress.
26 1 // 3rd is StartAddress.
27 1 // 4th is the times of work; 5th is the mount of each work.
28 1 // 6th is CheckSum.
29 1 // But in this program, the 2nd, 3rd and 4th, We do not use.
30 1 Byte PCInsC = 0x00;
31 1 Byte RomData[17]; // array size is for read or write data size; (Rom page size)
32 1
33 1 Byte DataSum = 0x00; // check sum
34 1 Byte DataAddr = 0x00; // Data Address
35 1 Byte DevAddr = 0x00; // Device Address
36 1 Byte Page = 0x00; // Device page
37 1 Byte Pgsize = 0x00; // Each page size in each Device
38 1
39 1 Bool PCIns_Flag = 0; // 1 is ok, 0 is wrong;
40 1 int i = 0;
41 1 com_initialize();
42 1 P0=0x00;
43 1 while(1){
44 2 PCIns_Flag = RecPCData(&PCIns,6);
45 2 if(~PCIns_Flag){
46 3 DataOut(Ins_NotOK);
47 3 P0=Ins_NotOK;
48 3 }
49 2 if(PCIns_Flag){
50 3 DataOut(Ins_OK);
51 3 P0=Ins_OK;//
52 3 DataAddr = 0x00;
53 3 DevAddr = 0xA0;
54 3 Page = 128;
55 3 Pgsize = 16;
C51 COMPILER V7.07 _RB_READ 04/12/2005 10:43:32 PAGE 2
56 3 }
57 2 while(PCIns_Flag){ // when Flag = 1, it means that we have many work to do befor
58 3 // next RecPCIns. it usually has write or read many data, so
59 3 // we use "while", not use "if".
60 3 PCInsC = 0x00;
61 3 PCInsC = DataIn();
62 3 if(PCInsC == Ins_Stop){
63 4 PCIns_Flag = 0;
64 4 break; // To avoid infinite loop
65 4 }
66 3 if((PCIns[0] == Ins_Read_RomToPC)&&(PCInsC == Ins_Start)){
67 4 I2cByteRead(DevAddr,DataAddr,Pgsize,&RomData); // read 16 data in each read action
68 4 for (i=0;i<16;i++){//
69 5 P0 = ~RomData[i];
70 5 DelayX100ms(1);
71 5 }
72 4 SendPCData(&RomData,Pgsize);
73 4 ChangeAddr(&DevAddr,&DataAddr,Pgsize);
74 4 }
75 3 if((PCIns[0] == Ins_Write_PCToRom)&&(PCInsC == Ins_Start)){
76 4 RecPCData(&RomData,17);
77 4 for (i=0;i<16;i++){//
78 5 P0 = ~RomData[i];
79 5 DelayX100ms(1);
80 5 }
81 4 I2cByteWrite(DevAddr, DataAddr, Pgsize, &RomData);
82 4 ChangeAddr(&DevAddr,&DataAddr,Pgsize);
83 4 }
84 3 }
85 2 }
86 1 }
87 //-----------------------------------------------------------------------------------------
88 void ChangeAddr(unsigned char* pDevAddr, unsigned char* pDataAddr, unsigned char Pgsize){
89 1 int DataWord = 0x0000;
90 1 DataWord = (int)(*pDataAddr);
91 1 DataWord += (int)Pgsize;
92 1 *pDevAddr &=0x0F;
93 1 if(DataWord >= 256){
94 2 *pDevAddr = *pDevAddr + 2;
95 2 }
96 1 *pDevAddr &=0x0F;
97 1 *pDevAddr |=0xA0;
98 1 *pDataAddr = (unsigned char)DataWord;
99 1 }
100 void SendPCData(unsigned char* pData, int DataLen){ // Send total Data length is DataLen+1
101 1 int i;
102 1 Byte Sum;
103 1 Sum = CheckSum(pData, DataLen);
104 1 for(i=0;i<DataLen;i++){
105 2 DataOut(*(pData+i));
106 2 }
107 1 DataOut(Sum);
108 1 }
109 Bool RecPCData(unsigned char* pData, int DataLen){ // Receive total Data length is DataLen
110 1 int i; // the lastest Data is checksum
111 1 Byte Sum;
112 1 for(i=0;i<DataLen;i++){
113 2 *(pData+i) = DataIn();
114 2 }
115 1 Sum = CheckSum(pData,DataLen-1);
116 1 if (*(pData+DataLen-1) == Sum)
117 1 return 1;
C51 COMPILER V7.07 _RB_READ 04/12/2005 10:43:32 PAGE 3
118 1 else
119 1 return 0;
120 1 }
121 unsigned char CheckSum(unsigned char* pData, int Num){
122 1 int i;
123 1 int Sum = 0x00; // integer Sum
124 1 Byte ReSum = 0x00; // return Sum for unsigned char (8 bits)
125 1
126 1 for(i=0;i<Num;i++){
127 2 Sum += (int)(*(pData+i));
128 2 }
129 1 ReSum = (unsigned char)Sum;
130 1 return ReSum;
131 1 }
132 void DelayX100ms(unsigned int count){
133 1 unsigned char i,j,k;
134 1 for (i=0;i<count;i++)
135 1 for(j=0;j<100;j++)
136 1 for(k=0;k<250;k++)
137 1 ;
138 1 }
139 unsigned char DataIn(void){
140 1 do{
141 2 }while(!RI);
142 1 RI=0;
143 1 return(SBUF);
144 1 }
145 void DataOut(unsigned char c){
146 1 do{
147 2 }while(!TI);
148 1 TI = 0; //Before transmit next data, must clear TI;
149 1 SBUF = c;
150 1 }
151 void com_initialize(void){
152 1 SCON = 0x52; // choose mode 1 serial interrupt, and no read state. Set TI = 1;
153 1 PCON = 0x00; // power control, PCON.1 is SMOD which is choose baudrate double or not.
154 1
155 1 IE = 0x00; // Set on interrupt.
156 1 IP = 0x10; // Set on Serial interrupt priority.
157 1
158 1 TMOD = 0x20;// Set Time control in Timer1 work on model 2.
159 1 TH1 = (unsigned char)(256-(XTAL/((unsigned long)384*baudrate)));
160 1 TR1 = 1; // Timer1 start.
161 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1116 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 14 79
IDATA SIZE = ---- ----
BIT SIZE = ---- 3
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -