📄 485.lst
字号:
(0145) LCD_write_data( data);
010C 810C LDD R16,Y+4
010D DFB3 RCALL _LCD_write_data
010E 940E031D CALL pop_gset2
0110 9508 RET
FILE: D:\avr\+++精华+++\485\485_master\usart.h
(0001) #define BAUDRATE 9600 //波特率
(0002) #define F_CPU 7327800
(0003)
(0004)
(0005) //波特率9600/9个数据位/1个停止位/奇校验/收发开启/接收中断
(0006) void usart_init(void)
(0007) {
(0008) UCSRA=0x01;//多机通讯模式(MPCM=1)
_usart_init:
0111 E081 LDI R24,1
0112 B98B OUT 0x0B,R24
(0009) UCSRB=0x9C;
0113 E98C LDI R24,0x9C
0114 B98A OUT 0x0A,R24
(0010) UCSRC=0xB6;
0115 EB86 LDI R24,0xB6
0116 BD80 OUT 0x20,R24
(0011) UBRRL= (F_CPU/BAUDRATE/16-1)%256;
0117 E28E LDI R24,0x2E
0118 B989 OUT 0x09,R24
(0012) UBRRH= (F_CPU/BAUDRATE/16-1)/256;
0119 2422 CLR R2
011A BC20 OUT 0x20,R2
(0013) PORTD&=~0x08; //MAX485平时工作在接收状态
011B 9893 CBI 0x12,3
(0014) DDRD|=0x08;
011C 9A8B SBI 0x11,3
011D 9508 RET
_usart_out:
i --> R20
n --> R22
datas --> R10
011E 940E0327 CALL push_gset3
0120 2F62 MOV R22,R18
0121 0158 MOVW R10,R16
(0015) }
(0016)
(0017) //-----------------------------------------------------------
(0018) //从数组datas[]的首地址开始发送amount个数据,其中第0个数据是地址帧,其他是数据帧
(0019) void usart_out(unsigned char *datas,unsigned char n)
(0020) {
(0021) unsigned char i=0;
0122 2744 CLR R20
(0022) PORTD|=0x08; //使MAX485处于发送状态
0123 9A93 SBI 0x12,3
0124 C014 RJMP 0x0139
(0023)
(0024) while(i<n )//一共发送amount个数据
(0025) {
(0026) if(i==0) UCSRB|=0x01;
0125 2344 TST R20
0126 F411 BNE 0x0129
0127 9A50 SBI 0x0A,0
0128 C003 RJMP 0x012C
(0027) else UCSRB&=0xfe;
0129 B18A IN R24,0x0A
012A 7F8E ANDI R24,0xFE
012B B98A OUT 0x0A,R24
(0028) UDR=*(datas+i); //装载数据开始发送
012C 2FE4 MOV R30,R20
012D 27FF CLR R31
012E 0DEA ADD R30,R10
012F 1DFB ADC R31,R11
0130 8020 LDD R2,Z+0
0131 B82C OUT 0x0C,R2
(0029) while((UCSRA&0x40)==0); //等待发送结束
0132 9B5E SBIS 0x0B,6
0133 CFFE RJMP 0x0132
(0030) UCSRA|=0x40; //清除发送结束标志
0134 9A5E SBI 0x0B,6
(0031) i++; //发送次数统计
0135 9543 INC R20
(0032) delay_nus(100);//每次发送必须有间隔,这个是最小值,实际情况可能还要加大
0136 E604 LDI R16,0x64
0137 E010 LDI R17,0
0138 DF27 RCALL _delay_nus
0139 1746 CP R20,R22
013A F350 BCS 0x0125
(0033) }
(0034)
(0035) PORTD&=~0x08; //使MAX485处于接收状态
013B 9893 CBI 0x12,3
013C 940E0320 CALL pop_gset3
013E 9508 RET
_crc8:
crc --> R20
i --> R22
len --> R18
ptr --> R16
013F 940E0329 CALL push_gset2
FILE: D:\avr\+++精华+++\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;
0141 2744 CLR R20
0142 C020 RJMP 0x0163
(0008) while(len--!=0)
(0009) {
(0010) for(i=1; i!=0; i*=2)
0143 E061 LDI R22,1
0144 C01A RJMP 0x015F
(0011) {
(0012) if((crc&1)!=0) {crc/=2; crc^=0x8C;}
0145 FF40 SBRS R20,0
0146 C009 RJMP 0x0150
0147 9546 LSR R20
0148 E88C LDI R24,0x8C
0149 E090 LDI R25,0
014A 2E24 MOV R2,R20
014B 2433 CLR R3
014C 2628 EOR R2,R24
014D 2639 EOR R3,R25
014E 2D42 MOV R20,R2
014F C001 RJMP 0x0151
(0013) else crc/=2;
0150 9546 LSR R20
(0014) if((*ptr&i)!=0) crc^=0x8C;
0151 01F8 MOVW R30,R16
0152 8020 LDD R2,Z+0
0153 2226 AND R2,R22
0154 F039 BEQ 0x015C
0155 E88C LDI R24,0x8C
0156 E090 LDI R25,0
0157 2E24 MOV R2,R20
0158 2433 CLR R3
0159 2628 EOR R2,R24
015A 2639 EOR R3,R25
015B 2D42 MOV R20,R2
015C E082 LDI R24,2
015D 9F86 MUL R24,R22
015E 2D60 MOV R22,R0
015F 2366 TST R22
0160 F721 BNE 0x0145
(0015) }
(0016) ptr++;
0161 5F0F SUBI R16,0xFF
0162 4F1F SBCI R17,0xFF
0163 2E22 MOV R2,R18
0164 2433 CLR R3
0165 5021 SUBI R18,1
0166 2022 TST R2
0167 F6D9 BNE 0x0143
(0017) }
(0018) return(crc);
0168 2F04 MOV R16,R20
0169 940E031D CALL pop_gset2
016B 9508 RET
_key_read:
i --> R20
016C 940E032B CALL push_gset1
FILE: D:\avr\+++精华+++\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位输入
016E EF80 LDI R24,0xF0
016F BB87 OUT 0x17,R24
(0011) PORTB=0x0f;//高4位输出0,低4位带上拉输入
0170 E08F LDI R24,0xF
0171 BB88 OUT 0x18,R24
(0012) delay_nms(1);
0172 E001 LDI R16,1
0173 E010 LDI R17,0
0174 DF04 RCALL _delay_nms
(0013)
(0014) i=PINB&0x0f;
0175 B346 IN R20,0x16
0176 704F ANDI R20,0xF
(0015)
(0016) /*获取行地址*/
(0017) DDRB=0x0f;//高4位输入,低4位输出
0177 E08F LDI R24,0xF
0178 BB87 OUT 0x17,R24
(0018) PORTB=0xf0;//低4位输出0,高4位带上拉输入
0179 EF80 LDI R24,0xF0
017A BB88 OUT 0x18,R24
(0019) delay_nms(1);
017B E001 LDI R16,1
017C E010 LDI R17,0
017D DEFB RCALL _delay_nms
(0020)
(0021) i|=PINB&0xf0;
017E B386 IN R24,0x16
017F 7F80 ANDI R24,0xF0
0180 2B48 OR R20,R24
(0022)
(0023) switch(i)
0181 2755 CLR R21
0182 3D47 CPI R20,0xD7
0183 E0E0 LDI R30,0
0184 075E CPC R21,R30
0185 F409 BNE 0x0187
0186 C075 RJMP 0x01FC
0187 3D4B CPI R20,0xDB
0188 E0E0 LDI R30,0
0189 075E CPC R21,R30
018A F409 BNE 0x018C
018B C068 RJMP 0x01F4
018C 3D4D CPI R20,0xDD
018D E0E0 LDI R30,0
018E 075E CPC R21,R30
018F F409 BNE 0x0191
0190 C05B RJMP 0x01EC
0191 3D4E CPI R20,0xDE
0192 E0E0 LDI R30,0
0193 075E CPC R21,R30
0194 F409 BNE 0x0196
0195 C04E RJMP 0x01E4
0196 ED8E LDI R24,0xDE
0197 E090 LDI R25,0
0198 1784 CP R24,R20
0199 0795 CPC R25,R21
019A F164 BLT 0x01C7
019B 3747 CPI R20,0x77
019C E0E0 LDI R30,0
019D 075E CPC R21,R30
019E F409 BNE 0x01A0
019F C060 RJMP 0x0200
01A0 374B CPI R20,0x7B
01A1 E0E0 LDI R30,0
01A2 075E CPC R21,R30
01A3 F409 BNE 0x01A5
01A4 C053 RJMP 0x01F8
01A5 374D CPI R20,0x7D
01A6 E0E0 LDI R30,0
01A7 075E CPC R21,R30
01A8 F409 BNE 0x01AA
01A9 C046 RJMP 0x01F0
01AA 374E CPI R20,0x7E
01AB E0E0 LDI R30,0
01AC 075E CPC R21,R30
01AD F409 BNE 0x01AF
01AE C039 RJMP 0x01E8
01AF 3747 CPI R20,0x77
01B0 E0E0 LDI R30,0
01B1 075E CPC R21,R30
01B2 F40C BGE 0x01B4
01B3 C04E RJMP 0x0202
01B4 3B47 CPI R20,0xB7
01B5 E0E0 LDI R30,0
01B6 075E CPC R21,R30
01B7 F409 BNE 0x01B9
01B8 C045 RJMP 0x01FE
01B9 3B4B CPI R20,0xBB
01BA E0E0 LDI R30,0
01BB 075E CPC R21,R30
01BC F409 BNE 0x01BE
01BD C038 RJMP 0x01F6
01BE 3B4D CPI R20,0xBD
01BF E0E0 LDI R30,0
01C0 075E CPC R21,R30
01C1 F161 BEQ 0x01EE
01C2 3B4E CPI R20,0xBE
01C3 E0E0 LDI R30,0
01C4 075E CPC R21,R30
01C5 F101 BEQ 0x01E6
01C6 C03B RJMP 0x0202
01C7 3E47 CPI R20,0xE7
01C8 E0E0 LDI R30,0
01C9 075E CPC R21,R30
01CA F179 BEQ 0x01FA
01CB 3E4B CPI R20,0xEB
01CC E0E0 LDI R30,0
01CD 075E CPC R21,R30
01CE F119 BEQ 0x01F2
01CF 3E4D CPI R20,0xED
01D0 E0E0 LDI R30,0
01D1 075E CPC R21,R30
01D2 F0B9 BEQ 0x01EA
01D3 3E4E CPI R20,0xEE
01D4 E0E0 LDI R30,0
01D5 075E CPC R21,R30
01D6 F059 BEQ 0x01E2
01D7 3E47 CPI R20,0xE7
01D8 E0E0 LDI R30,0
01D9 075E CPC R21,R30
01DA F13C BLT 0x0202
01DB 3F4F CPI R20,0xFF
01DC E0E0 LDI R30,0
01DD 075E CPC R21,R30
01DE F009 BEQ 0x01E0
01DF C022 RJMP 0x0202
(0024) {
(0025) case 0xff:return 0x00;
01E0 2700 CLR R16
01E1 C021 RJMP 0x0203
(0026) case 0xee:return '7';
01E2 E307 LDI R16,0x37
01E3 C01F RJMP 0x0203
(0027) case 0xde:return '4';
01E4 E304 LDI R16,0x34
01E5 C01D RJMP 0x0203
(0028) case 0xbe:return '1';
01E6 E301 LDI R16,0x31
01E7 C01B RJMP 0x0203
(0029) case 0x7e:return 'C';
01E8 E403 LDI R16,0x43
01E9 C019 RJMP 0x0203
(0030) case 0xed:return '8';
01EA E308 LDI R16,0x38
01EB C017 RJMP 0x0203
(0031) case 0xdd:return '5';
01EC E305 LDI R16,0x35
01ED C015 RJMP 0x0203
(0032) case 0xbd:return '2';
01EE E302 LDI R16,0x32
01EF C013 RJMP 0x0203
(0033) case 0x7d:return '0';
01F0 E300 LDI R16,0x30
01F1 C011 RJMP 0x0203
(0034) case 0xeb:return '9';
01F2 E309 LDI R16,0x39
01F3 C00F RJMP 0x0203
(0035) case 0xdb:return '6';
01F4 E306 LDI R16,0x36
01F5 C00D RJMP 0x0203
(0036) case 0xbb:return '3';
01F6 E303 LDI R16,0x33
01F7 C00B RJMP 0x0203
(0037) case 0x7b:return '=';
01F8 E30D LDI R16,0x3D
01F9 C009 RJMP 0x0203
(0038) case 0xe7:return '-';
01FA E20D LDI R16,0x2D
01FB C007 RJMP 0x0203
(0039) case 0xd7:return '*';
01FC E20A LDI R16,0x2A
01FD C005 RJMP 0x0203
(0040) case 0xb7:return '-';
01FE E20D LDI R16,0x2D
01FF C003 RJMP 0x0203
(0041) case 0x77:return '+';
0200 E20B LDI R16,0x2B
0201 C001 RJMP 0x0203
(0042) default:return 0x00;
0202 2700 CLR R16
0203 940E032E CALL pop_gset1
0205 9508 RET
_get_key:
i --> R20
0206 940E032B 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();
0208 DF63 RCALL _key_read
0209 2F40 MOV R20,R16
(0050) if (i == 0x00)//无有效按键按下
020A 2300 TST R16
020B F429 BNE 0x0211
(0051) {
(0052) j = 0x00;//清除按键记录
020C 2422 CLR R2
020D 92200085 STS j,R2
(0053) return 0x00;//程序退出
020F 2700 CLR R16
0210 C011 RJMP 0x0222
(0054) }
(0055) if (j == 0x00) //为新按键
0211 90200085 LDS R2,j
0213 2022 TST R2
0214 F461 BNE 0x0221
(0056) {j = i;//保存本次采样结果
0215 93400085 STS j,R20
(0057) delay_nms(10);//去按键颤抖
0217 E00A LDI R16,0xA
0218 E010 LDI R17,0
0219 DE5F RCALL _delay_nms
(0058) i = key_read();
021A DF51 RCALL _key_read
021B 2F40 MOV R20,R16
(0059) if(i == j) {return i;}
021C 90200085 LDS R2,j
021E 1502 CP R16,R2
021F F409 BNE 0x0221
0220 C001 RJMP 0x0222
(0060) }
(0061) return 0x00;
0221 2700 CLR R16
0222 940E032E CALL pop_gset1
0224 9508 RET
_RXC_Int:
ERROR --> R16
0225 922A ST R2,-Y
0226 930A ST R16,-Y
0227 938A ST R24,-Y
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -