📄 main.lst
字号:
C51 COMPILER V7.06 MAIN 10/23/2006 20:52:15 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <stdio.h>
2 #include <absacc.h>
3 #include <intrins.h>
4 #include <./Atmel/at89x52.h>
5 #include "source.h"
6 extern uint bit_crc(uchar *ptr, uchar len);
7 extern uint byte_crc(uchar *ptr, uchar len);
8 extern uint halfbyte_crc(unsigned char* pData, uint nLength);
9 CRCREGS regs;
10 /* 8字节测试数据 */
11 uchar testdata[8]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88};
12 /* 主程序 */
13 void main()
14 {
15 1 uchar len;
16 1 uint crc_bit;
17 1 uint crc_byte;
18 1 uint crc_halfbyte;
19 1
20 1 len = 8;
21 1 crc_bit = bit_crc(testdata,len); // 调用按位求CRC子函数
22 1 crc_byte = byte_crc(testdata,len); // 调用按字节查表求CRC子函数
23 1 crc_halfbyte = halfbyte_crc(testdata,len); // 调用按半字节查表求CRC子函数
24 1
25 1 while(1);
26 1 }
27
28 uint byte_crc(uchar *ptr, uchar len)
29 {
30 1 uint crc;
31 1 uchar da;
32 1
33 1 /* CRC 余式表 */
34 1 uint xdata crc_ta[256]=
35 1 {
36 1 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
37 1 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
38 1 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
39 1 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
40 1 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
41 1 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
42 1 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
43 1 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
44 1 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
45 1 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
46 1 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
47 1 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
48 1 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
49 1 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
50 1 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
51 1 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
52 1 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
53 1 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
54 1 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
55 1 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
C51 COMPILER V7.06 MAIN 10/23/2006 20:52:15 PAGE 2
56 1 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
57 1 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
58 1 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
59 1 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
60 1 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
61 1 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
62 1 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
63 1 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
64 1 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
65 1 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
66 1 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
67 1 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
68 1 };
69 1 crc = 0;
70 1 while(len--!=0)
71 1 {
72 2 da=(uchar) (crc/256); // 以8位二进制数的形式暂存CRC的高8位
73 2 crc<<=8; // 左移8位,相当于CRC的低8位乘以2的8次方
74 2 crc^=crc_ta[da^*ptr]; /* 高8位和当前字节相加后再查表求CRC,再加上以前的CRC */
75 2 ptr++;
76 2 }
77 1 return(crc);
78 1 }
79
80 void crcInitRegisters()
81 {
82 1 regs.val = 0xffff;
83 1 }
84 // CRC输入一个bit
85 void crcInputBit(bit in)
86 {
87 1 bit a;
88 1 a = regs.bits.bit0 ^ in;
89 1 regs.bits.bit0 = regs.bits.bit1;
90 1 regs.bits.bit1 = regs.bits.bit2;
91 1 regs.bits.bit2 = regs.bits.bit3;
92 1 regs.bits.bit3 = regs.bits.bit4 ^ a;
93 1 regs.bits.bit4 = regs.bits.bit5;
94 1 regs.bits.bit5 = regs.bits.bit6;
95 1 regs.bits.bit6 = regs.bits.bit7;
96 1 regs.bits.bit7 = regs.bits.bit8;
97 1 regs.bits.bit8 = regs.bits.bit9;
98 1 regs.bits.bit9 = regs.bits.bit10;
99 1 regs.bits.bit10 = regs.bits.bit11 ^ a;
100 1 regs.bits.bit11 = regs.bits.bit12;
101 1 regs.bits.bit12 = regs.bits.bit13;
102 1 regs.bits.bit13 = regs.bits.bit14;
103 1 regs.bits.bit14 = regs.bits.bit15;
104 1 regs.bits.bit15 = a;
105 1 }
106 // 输出CRC码(寄存器组的值)
107 uint crcGetRegisters( )
108 {
109 1 return regs.val;
110 1 }
111 uint bit_crc(uchar *ptr, uchar len){
112 1 uint ret;
113 1 uchar i,j,temp;
114 1 crcInitRegisters();
115 1 for(i=0;i<len;i++){
116 2 temp=*(ptr+i);
117 2 for(j=0;j<8;j++){
C51 COMPILER V7.06 MAIN 10/23/2006 20:52:15 PAGE 3
118 3 if(temp&0x80) crcInputBit(1);
119 3 else crcInputBit(0);
120 3 temp <<=1;
121 3 }
122 2 }
123 1 ret=crcGetRegisters();
124 1 return ret;
125 1 }
126
127 code uint crctab16[] =
128 {
129 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
130 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
131 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
132 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
133 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
134 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
135 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
136 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
137 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
138 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
139 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
140 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
141 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
142 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
143 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
144 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
145 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
146 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
147 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
148 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
149 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
150 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
151 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
152 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
153 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
154 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
155 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
156 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
157 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
158 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
159 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
160 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78,
161 };
162
163 uint halfbyte_crc(unsigned char* pData, uint nLength)
164 {
165 1 uint fcs = 0xffff; // 初始化
166 1 while(nLength>0)
167 1 {
168 2 fcs = (fcs >> 8) ^ crctab16[(fcs ^ *pData) & 0xff];
169 2 nLength--;
170 2 pData++;
171 2 }
172 1 return ~fcs; // 取反
173 1 }
174
175
176
177
178
C51 COMPILER V7.06 MAIN 10/23/2006 20:52:15 PAGE 4
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 822 ----
CONSTANT SIZE = 1024 ----
XDATA SIZE = ---- 512
PDATA SIZE = ---- ----
DATA SIZE = 10 22
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -