;---------------------------------------; ; ; ; Подпрограмки, которые я успел наваять ; ; ; ;---------------------------------------; LSB (Least Significant Bit) - младший значащий бит, MSB (Most Significant Bit) - старший значащий бит. ; байты для вывода 0-9A-F на индикаторы, без точки, общий катод LEDnd: .DB 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 ; байты для вывода 0-9A-F на индикаторы, с точкой ledwd: .DB 0xf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1 "A" - 0x77 "b" - 0x7C "c" - 0x58, "C" - 0x39 "d" - 0x5E "E" - 0x79 "F" - 0x71 "r" - 0x50 "h" - 0x56, "H" - 0x76 "i" - 0x04, "I" - 0x06 "J" - 0x1E "L" - 0x38 "P" - 0x73 "u" - 0x1C, "U" - 0x3E "Y" - 0x6E ;******************************************************************* ; вывод в компорт байт в HEX-виде ; исходный байт а r17, портим r16 OUTHEX: push r17 andi r17,0b11110000 ; старший полубайт swap r17 rcall TOASCII mov r16,r17 rcall USART_TX ; выводим старший байт pop r17 andi r17,0b00001111 ; младший полубайт mov r16,r17 rcall TOASCII mov r16,r17 rcall USART_TX ; выводим младший байт ret ;******************************************************************* ; переводит младший полубайт в ASCII-код символа ; исходный и итоговый байт в r16 TOASCII: andi R16,0x0F ; очищаем ненужные биты cpi R16,0x0A brsh ADDA subi R16,-0x30 ; ASCII '0' ret ADDA: subi R16,-0x37 ; + 0x0A = ASCII 'A' ret ;******************************************************************* ; вывод байта в уарт (не моё, из мануала :-) USART_TX: sbis UCSRA,UDRE ; Wait for empty transmit buffer rjmp USART_TX out UDR,r16 ; Put data (r16) into buffer, sends the data ret ;******************************************************************* ; работа с EEPROM ;в ZH:ZL - адрес EEPROM куда писать ;в temp - записываемый байт WriteEEP: sbic EECR,EEWE ; ждем очистки бита rjmp WriteEEP ; разрешения записи EEWE cli ; запрещаем прерывания out EEARH,ZH ; старший байт адреса out EEARL,ZL ; младший байт адреса out EEDR,temp ; данные sbi EECR,EEMWE ; взводим предохранитель sbi EECR,EEWE ; записываем байт sei ; разрешаем прерывания ret ; (конец WriteEEP) ; в ZH:ZL - адрес откуда читать ; возврат temp - прочтенный байт ReadEEP: sbic EECR,EEWE ; ожидание очистки флага записи rjmp ReadEEP out EEARH,ZH ; старший адреса out EEARL,ZL ; младший адреса sbi EECR,EERE ; бит чтения in temp,EEDR ; чтение ret ; конец ReadEEP ;******************************************************************* ; sleep SPIM: ldi temp,(1< 0 -- будем спать, пока обработчик прерываний не доведёт ; счётчик до 0. по флагам можем вызывать разные подпрограммы ; минимальный шаг задержки == периоду таймера DISPATCHER: PUSHF sbrc flags,SADC ; сброшен - простой сон rcall MEASURE outi MCUCR,1<