⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 485.lst

📁 485多机通讯
💻 LST
📖 第 1 页 / 共 3 页
字号:
(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 + -