📄 485.lst
字号:
FILE: D:\mojinpan\485\485_master\usart.h
(0001) #define BAUDRATE 9600 //波特率
(0002) #define F_CPU 8000000
(0003)
(0004)
(0005) //波特率9600/9个数据位/1个停止位/奇校验/收发开启/接收中断
(0006) void usart_init(void)
(0007) {
(0008) UCSR1A=0x01;//多机通讯模式(MPCM=1)
_usart_init:
012D E081 LDI R24,1
012E 9380009B STS 0x9B,R24
(0009) UCSR1B=0x9C;
0130 E98C LDI R24,0x9C
0131 9380009A STS 0x9A,R24
(0010) UCSR1C=0x36;
0133 E386 LDI R24,0x36
0134 9380009D STS 0x9D,R24
(0011) UBRR1L= (F_CPU/BAUDRATE/16-1)%256;
0136 E383 LDI R24,0x33
0137 93800099 STS 0x99,R24
(0012) UBRR1H= (F_CPU/BAUDRATE/16-1)/256;
0139 2422 CLR R2
013A 92200098 STS 0x98,R2
(0013) PORTE&=~0x80; //MAX485平时工作在接收状态
013C 981F CBI 0x03,7
(0014) DDRE|=0x80;
013D 9A17 SBI 0x02,7
013E 9508 RET
_usart_out:
i --> R20
n --> R18
datas --> R16
013F 940E035F CALL push_gset1
(0015) }
(0016)
(0017) //-----------------------------------------------------------
(0018) //从数组datas[]的首地址开始发送amount个数据,其中第0个数据是地址帧,其他是数据帧
(0019) void usart_out(unsigned char *datas,unsigned char n)
(0020) {
(0021) unsigned char i=0;
0141 2744 CLR R20
(0022) PORTE|=0x80; //使MAX485处于发送状态
0142 9A1F SBI 0x03,7
0143 C01E RJMP 0x0162
(0023)
(0024) while(i<n )//一共发送amount个数据
(0025) {
(0026) if(i==0) UCSR1B|=0x01;
0144 2344 TST R20
0145 F431 BNE 0x014C
0146 9180009A LDS R24,0x9A
0148 6081 ORI R24,1
0149 9380009A STS 0x9A,R24
014B C005 RJMP 0x0151
(0027) else UCSR1B&=0xfe;
014C 9180009A LDS R24,0x9A
014E 7F8E ANDI R24,0xFE
014F 9380009A STS 0x9A,R24
(0028) UDR1=*(datas+i); //装载数据开始发送
0151 2FE4 MOV R30,R20
0152 27FF CLR R31
0153 0FE0 ADD R30,R16
0154 1FF1 ADC R31,R17
0155 8020 LDD R2,Z+0
0156 9220009C STS 0x9C,R2
(0029) while((UCSR1A&0x40)==0); //等待发送结束
0158 9020009B LDS R2,0x9B
015A FE26 SBRS R2,6
015B CFFC RJMP 0x0158
(0030) UCSR1A|=0x40; //清除发送结束标志
015C 9180009B LDS R24,0x9B
015E 6480 ORI R24,0x40
015F 9380009B STS 0x9B,R24
(0031) i++; //发送次数统计
0161 9543 INC R20
0162 1742 CP R20,R18
0163 F300 BCS 0x0144
(0032) //delay_nus(100);//每次发送必须有间隔,这个是最小值,实际情况可能还要加大
(0033) }
(0034)
(0035) PORTE&=~0x80; //使MAX485处于接收状态
0164 981F CBI 0x03,7
0165 940E0362 CALL pop_gset1
0167 9508 RET
_crc8:
crc --> R20
i --> R22
len --> R18
ptr --> R16
0168 940E035D CALL push_gset2
FILE: D:\mojinpan\485\485_master\crc8.h
(0001) //---------------------------------------------------------------------------------
(0002) //crc8校验程序
(0003) //---------------------------------------------------------------------------------
(0004) unsigned char crc8(unsigned char *ptr, unsigned char len)
(0005) {
(0006) unsigned char i;
(0007) unsigned char crc=0;
016A 2744 CLR R20
016B C020 RJMP 0x018C
(0008) while(len--!=0)
(0009) {
(0010) for(i=1; i!=0; i*=2)
016C E061 LDI R22,1
016D C01A RJMP 0x0188
(0011) {
(0012) if((crc&1)!=0) {crc/=2; crc^=0x8C;}
016E FF40 SBRS R20,0
016F C009 RJMP 0x0179
0170 9546 LSR R20
0171 E88C LDI R24,0x8C
0172 E090 LDI R25,0
0173 2E24 MOV R2,R20
0174 2433 CLR R3
0175 2628 EOR R2,R24
0176 2639 EOR R3,R25
0177 2D42 MOV R20,R2
0178 C001 RJMP 0x017A
(0013) else crc/=2;
0179 9546 LSR R20
(0014) if((*ptr&i)!=0) crc^=0x8C;
017A 01F8 MOVW R30,R16
017B 8020 LDD R2,Z+0
017C 2226 AND R2,R22
017D F039 BEQ 0x0185
017E E88C LDI R24,0x8C
017F E090 LDI R25,0
0180 2E24 MOV R2,R20
0181 2433 CLR R3
0182 2628 EOR R2,R24
0183 2639 EOR R3,R25
0184 2D42 MOV R20,R2
0185 E082 LDI R24,2
0186 9F86 MUL R24,R22
0187 2D60 MOV R22,R0
0188 2366 TST R22
0189 F721 BNE 0x016E
(0015) }
(0016) ptr++;
018A 5F0F SUBI R16,0xFF
018B 4F1F SBCI R17,0xFF
018C 2E22 MOV R2,R18
018D 2433 CLR R3
018E 5021 SUBI R18,1
018F 2022 TST R2
0190 F6D9 BNE 0x016C
(0017) }
(0018) return(crc);
0191 2F04 MOV R16,R20
0192 940E0351 CALL pop_gset2
0194 9508 RET
_key_read:
i --> R20
0195 940E035F CALL push_gset1
FILE: D:\mojinpan\485\485_master\key.h
(0001) //函数说明
(0002) //--------------------------------
(0003) unsigned char get_key(void);
(0004) //--------------------------------
(0005) #include "delay.h"
(0006) unsigned char key_read(void)
(0007) {
(0008) unsigned char i;
(0009) /*获取列地址*/
(0010) DDRB=0xf0; //高4位输出,低4位输入
0197 EF80 LDI R24,0xF0
0198 BB87 OUT 0x17,R24
(0011) PORTB=0x0f;//高4位输出0,低4位带上拉输入
0199 E08F LDI R24,0xF
019A BB88 OUT 0x18,R24
(0012) delay_nms(1);
019B E001 LDI R16,1
019C E010 LDI R17,0
019D DEF7 RCALL _delay_nms
(0013)
(0014) i=PINB&0x0f;
019E B346 IN R20,0x16
019F 704F ANDI R20,0xF
(0015)
(0016) /*获取行地址*/
(0017) DDRB=0x0f;//高4位输入,低4位输出
01A0 E08F LDI R24,0xF
01A1 BB87 OUT 0x17,R24
(0018) PORTB=0xf0;//低4位输出0,高4位带上拉输入
01A2 EF80 LDI R24,0xF0
01A3 BB88 OUT 0x18,R24
(0019) delay_nms(1);
01A4 E001 LDI R16,1
01A5 E010 LDI R17,0
01A6 DEEE RCALL _delay_nms
(0020)
(0021) i|=PINB&0xf0;
01A7 B386 IN R24,0x16
01A8 7F80 ANDI R24,0xF0
01A9 2B48 OR R20,R24
(0022)
(0023) switch(i)
01AA 2755 CLR R21
01AB 3D47 CPI R20,0xD7
01AC E0E0 LDI R30,0
01AD 075E CPC R21,R30
01AE F409 BNE 0x01B0
01AF C075 RJMP 0x0225
01B0 3D4B CPI R20,0xDB
01B1 E0E0 LDI R30,0
01B2 075E CPC R21,R30
01B3 F409 BNE 0x01B5
01B4 C068 RJMP 0x021D
01B5 3D4D CPI R20,0xDD
01B6 E0E0 LDI R30,0
01B7 075E CPC R21,R30
01B8 F409 BNE 0x01BA
01B9 C05B RJMP 0x0215
01BA 3D4E CPI R20,0xDE
01BB E0E0 LDI R30,0
01BC 075E CPC R21,R30
01BD F409 BNE 0x01BF
01BE C04E RJMP 0x020D
01BF ED8E LDI R24,0xDE
01C0 E090 LDI R25,0
01C1 1784 CP R24,R20
01C2 0795 CPC R25,R21
01C3 F164 BLT 0x01F0
01C4 3747 CPI R20,0x77
01C5 E0E0 LDI R30,0
01C6 075E CPC R21,R30
01C7 F409 BNE 0x01C9
01C8 C060 RJMP 0x0229
01C9 374B CPI R20,0x7B
01CA E0E0 LDI R30,0
01CB 075E CPC R21,R30
01CC F409 BNE 0x01CE
01CD C053 RJMP 0x0221
01CE 374D CPI R20,0x7D
01CF E0E0 LDI R30,0
01D0 075E CPC R21,R30
01D1 F409 BNE 0x01D3
01D2 C046 RJMP 0x0219
01D3 374E CPI R20,0x7E
01D4 E0E0 LDI R30,0
01D5 075E CPC R21,R30
01D6 F409 BNE 0x01D8
01D7 C039 RJMP 0x0211
01D8 3747 CPI R20,0x77
01D9 E0E0 LDI R30,0
01DA 075E CPC R21,R30
01DB F40C BGE 0x01DD
01DC C04E RJMP 0x022B
01DD 3B47 CPI R20,0xB7
01DE E0E0 LDI R30,0
01DF 075E CPC R21,R30
01E0 F409 BNE 0x01E2
01E1 C045 RJMP 0x0227
01E2 3B4B CPI R20,0xBB
01E3 E0E0 LDI R30,0
01E4 075E CPC R21,R30
01E5 F409 BNE 0x01E7
01E6 C038 RJMP 0x021F
01E7 3B4D CPI R20,0xBD
01E8 E0E0 LDI R30,0
01E9 075E CPC R21,R30
01EA F161 BEQ 0x0217
01EB 3B4E CPI R20,0xBE
01EC E0E0 LDI R30,0
01ED 075E CPC R21,R30
01EE F101 BEQ 0x020F
01EF C03B RJMP 0x022B
01F0 3E47 CPI R20,0xE7
01F1 E0E0 LDI R30,0
01F2 075E CPC R21,R30
01F3 F179 BEQ 0x0223
01F4 3E4B CPI R20,0xEB
01F5 E0E0 LDI R30,0
01F6 075E CPC R21,R30
01F7 F119 BEQ 0x021B
01F8 3E4D CPI R20,0xED
01F9 E0E0 LDI R30,0
01FA 075E CPC R21,R30
01FB F0B9 BEQ 0x0213
01FC 3E4E CPI R20,0xEE
01FD E0E0 LDI R30,0
01FE 075E CPC R21,R30
01FF F059 BEQ 0x020B
0200 3E47 CPI R20,0xE7
0201 E0E0 LDI R30,0
0202 075E CPC R21,R30
0203 F13C BLT 0x022B
0204 3F4F CPI R20,0xFF
0205 E0E0 LDI R30,0
0206 075E CPC R21,R30
0207 F009 BEQ 0x0209
0208 C022 RJMP 0x022B
(0024) {
(0025) case 0xff:return 0x00;
0209 2700 CLR R16
020A C021 RJMP 0x022C
(0026) case 0xee:return 'D';
020B E404 LDI R16,0x44
020C C01F RJMP 0x022C
(0027) case 0xde:return '#';
020D E203 LDI R16,0x23
020E C01D RJMP 0x022C
(0028) case 0xbe:return '0';
020F E300 LDI R16,0x30
0210 C01B RJMP 0x022C
(0029) case 0x7e:return '*';
0211 E20A LDI R16,0x2A
0212 C019 RJMP 0x022C
(0030) case 0xed:return 'C';
0213 E403 LDI R16,0x43
0214 C017 RJMP 0x022C
(0031) case 0xdd:return '9';
0215 E309 LDI R16,0x39
0216 C015 RJMP 0x022C
(0032) case 0xbd:return '8';
0217 E308 LDI R16,0x38
0218 C013 RJMP 0x022C
(0033) case 0x7d:return '7';
0219 E307 LDI R16,0x37
021A C011 RJMP 0x022C
(0034) case 0xeb:return 'B';
021B E402 LDI R16,0x42
021C C00F RJMP 0x022C
(0035) case 0xdb:return '6';
021D E306 LDI R16,0x36
021E C00D RJMP 0x022C
(0036) case 0xbb:return '5';
021F E305 LDI R16,0x35
0220 C00B RJMP 0x022C
(0037) case 0x7b:return '4';
0221 E304 LDI R16,0x34
0222 C009 RJMP 0x022C
(0038) case 0xe7:return 'A';
0223 E401 LDI R16,0x41
0224 C007 RJMP 0x022C
(0039) case 0xd7:return '3';
0225 E303 LDI R16,0x33
0226 C005 RJMP 0x022C
(0040) case 0xb7:return '2';
0227 E302 LDI R16,0x32
0228 C003 RJMP 0x022C
(0041) case 0x77:return '1';
0229 E301 LDI R16,0x31
022A C001 RJMP 0x022C
(0042) default:return 0x00;
022B 2700 CLR R16
022C 940E0362 CALL pop_gset1
022E 9508 RET
_get_key:
i --> R20
022F 940E035F CALL push_gset1
(0043) }
(0044) }
(0045)
(0046) unsigned char get_key(void)
(0047) {unsigned char i;
(0048) static unsigned char j;//按键记录
(0049) i = key_read();
0231 DF63 RCALL _key_read
0232 2F40 MOV R20,R16
(0050) if (i == 0x00)//无有效按键按下
0233 2300 TST R16
0234 F429 BNE 0x023A
(0051) {
(0052) j = 0x00;//清除按键记录
0235 2422 CLR R2
0236 92200125 STS j,R2
(0053) return 0x00;//程序退出
0238 2700 CLR R16
0239 C011 RJMP 0x024B
(0054) }
(0055) if (j == 0x00) //为新按键
023A 90200125 LDS R2,j
023C 2022 TST R2
023D F461 BNE 0x024A
(0056) {j = i;//保存本次采样结果
023E 93400125 STS j,R20
(0057) delay_nms(10);//去按键颤抖
0240 E00A LDI R16,0xA
0241 E010 LDI R17,0
0242 DE52 RCALL _delay_nms
(0058) i = key_read();
0243 DF51 RCALL _key_read
0244 2F40 MOV R20,R16
(0059) if(i == j) {return i;}
0245 90200125 LDS R2,j
0247 1502 CP R16,R2
0248 F409 BNE 0x024A
0249 C001 RJMP 0x024B
(0060) }
(0061) return 0x00;
024A 2700 CLR R16
024B 940E0362 CALL pop_gset1
024D 9508 RET
_RXC_Int:
ERROR --> R16
024E 922A ST R2,-Y
024F 930A ST R16,-Y
0250 938A ST R24,-Y
0251 939A ST R25,-Y
0252 93EA ST R30,-Y
0253 93FA ST R31,-Y
0254 B62F IN R2,0x3F
0255 922A ST R2,-Y
FILE: D:\mojinpan\485\485_master\main.c
(0001) /*******************************************************************************
(0002) 485多机通讯
(0003) --------------------------------------------------------------------------------
(0004) 通讯规则:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -