Код: Выделить всё
.include "m16def.inc"
.def temp = r16
.def razr1 = r17
.def razr2 = r18
.def razr3 = r19
.equ FREQ = 8000000 // Частота работы чипа 8 Мгц
.equ FreqSCL = 400000 // Максимальная частота работы I2C 400 КГц
.equ FreqTWBR = ((FREQ/FreqSCL)-16)/2 // В формуле учитывается Регистр TWPS == 0
///////////////////////////////// Уставки LCD
.equ LCD_PORT = PORTA // порт, на котором LCD
.equ LCD_RS = 0
.equ LCD_EN = 2
////////////// Назначение для BCD /////////////////
.def fbinL =r20 ;двоичное значение, младший байт
.def fbinH =r21 ;двоичное значение, старший байт
.def tBCD0 =r21 ;BCD значение, цифры 1 и 0 ( младший порядок )
.def tBCD1 =r22 ;BCD значение, цифры 3 и 2
.def tBCD2 =r23 ;BCD значение, цифра 4 ( стрший порядок )
.def temp1 =r27
.def data =r28
.dseg
Term:
.byte 5
.cseg
.org 0
jmp Reset
.org $022
jmp TWSI
Reset:
ldi temp,high(ramend)
out sph,temp
ldi temp,low(ramend)
out spl,temp
ldi temp,FreqTWBR
out TWBR,temp
sei
Prog:
rcall Delay
ldi temp,0b10100101 ///////// Старт
out TWCR,temp
rcall Delay
rcall Dat_1
rjmp Prog
TWSI:
cli
ldi temp,0b01111110
out TWDR,temp
ldi temp,0b10000100
out TWCR,temp
Wait1:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait1
in temp,TWSR
andi temp,0xF8
cpi temp,0x18
brne error
rcall Del_15ms
rcall Init_1 ///////// 1-я команда инициализации
rcall Del_5ms ///////// 2-я команда инициализации
rcall Init_1
rcall Del_100mks ///////// 3-я команда инициализации
rcall Init_1
rcall Del_100mks
rcall Init_4 ///////// 4-я команда инициализации
rcall Del_100mks
rcall Init_5 ///////// 5-я команда инициализации (Переход на 4-битный режим)
rcall Del_100mks ///////// 6-я команда инициализации
rcall Init_6
rcall Del_100mks ///////// 7-я команда инициализации
rcall Init_7
rcall Del_100mks ///////// 8-я команда инициализации (Последняя команда инициализации)
rcall Init_8
//////////////////////////////////////////////////
rcall Curs_1
rcall Stop
sei
reti
Error:
ldi zh,high(term+1)
ldi zl,low(term+1)
ldi temp,0xff
st z,temp
ret
Init_1: ///////////////////////////////////////// Это 1-полубайт отправка
ldi temp,0b00110100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait2:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait2
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
brne error
////////////////
ldi temp,0b00110000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait3:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait3
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
brne error
ret ////////// Конец Init_1
Init_4: //////////// Это 4-я команда инициализации
///////////////////////////////////////// Это 1-полубайт отправка
ldi temp,0b00100100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait6:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait6
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b00100000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait7:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait7
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
ret ////////// Конец Init_4
Init_5: //////////// Это 5-я команда инициализации
///////////////////////////////////////// Это 1-полубайт отправка
ldi temp,0b00100100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_a:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b00100000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_b:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт отправка
ldi temp,0b10000100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_c:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b10000000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_d:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
ret ////////// Конец Init_5
Init_6: //////////// Это 6-я команда инициализации
///////////////////////////////////////// Это 1-полубайт отправка
ldi temp,0b00000100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_a1:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a1
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b00000000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_b1:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b1
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт отправка
ldi temp,0b11100100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_c1:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c1
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b11100000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_d1:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d1
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
ret ////////// Конец Init_6
Init_7: //////////// Это 7-я команда инициализации
///////////////////////////////////////// Это 1-полубайт отправка
ldi temp,0b00000100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_a2:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a2
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b00000000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_b2:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b2
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт отправка
ldi temp,0b00010100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_c2:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c2
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b00010000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_d2:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d2
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
ret ////////// Конец Init_7
Init_8: //////////// Это 8-я команда инициализации
///////////////////////////////////////// Это 1-полубайт отправка
ldi temp,0b00000100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_a3:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a3
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b00000000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_b3:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b3
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт отправка
ldi temp,0b01100100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_c3:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c3
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b01100000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_d3:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d3
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
ret ////////// Конец Init_8
Curs_1: //////////// Первая буква
rcall Del_5ms
///////////////////////////////////////// Это 1-полубайт знакоместа
ldi temp,0b10000100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_a4:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a4
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b10000000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_b4:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b4
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт знакоместа
ldi temp,0b00110100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_c4:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c4
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b00110000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_d4:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d4
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////// Конец установки знакоместа буквы
///////////////////////////////////////// Это 1-полубайт записи первой буквы
ldi temp,0b01010101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_a5:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a5
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b01010001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_b5:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b5
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт записи первой буквы
ldi temp,0b01000101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_c5:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c5
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b01000001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_d5:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d5
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error ////////// Конец записи 1-й буквы
////////// Запись 2-й буквы
///////////////////////////////////////// Это 2-полубайт записи первой буквы
///////////////////////////////////////// Это 1-полубайт записи второй буквы
ldi temp,0b01100101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_a6:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a6
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b01100001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_b6:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b6
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт записи второй буквы
ldi temp,0b01010101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_c6:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c6
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b01010001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_d6:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d6
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error ////////// Конец записи 2-й буквы
///////////////////////////////////////// Это 1-полубайт записи третьей буквы
ldi temp,0b01100101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_a7:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a7
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b01100001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_b7:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b7
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт записи третьей буквы
ldi temp,0b11010101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_c7:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c7
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b11010001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_d7:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d7
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error ////////// Конец записи 4-й буквы
///////////////////////////////////////// Это 1-полубайт записи четвертой буквы
ldi temp,0b01110101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_a8:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a8
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b01110001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_b8:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b8
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт записи четвертой буквы
ldi temp,0b00000101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_c8:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c8
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b00000001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_d8:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d8
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error ////////// Конец записи 4-й буквы
///////////////////////////////////////// Это 1-полубайт записи двоеточия 1-й строки
ldi temp,0b00110101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_a9:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a9
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b00110001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_b9:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b9
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт записи двоеточия 1-й строки
ldi temp,0b10100101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_c9:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c9
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b10100001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_d9:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d9
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error ////////// Конец записи двоеточия 1-й строки
rcall Send_dat_temp3
rcall Send_dat_temp2
rcall Send_dat_temp1
///////////////////////////////////////// Это 1-полубайт знакоместа второй строки
ldi temp,0b11000100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_a41:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a41
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b11000000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_b41:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b41
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт знакоместа 2-й строки
ldi temp,0b00110100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_c41:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c41
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b00110000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_d41:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d41
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////// Конец установки знакоместа буквы 2-й строки
///////////////////////////////////////// Это 1-й полубайт 1-й буквы 2-й строки
ldi temp,0b01010101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_a91:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a91
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b01010001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_b91:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b91
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт 1-й буквы 2-й строки
ldi temp,0b01100101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_c91:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c91
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b01100001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_d91:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d91
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error ////////// Конец записи 1-й буквы 2-й строки
///////////////////////////////////////// Это 1-полубайт 2-й буквы 2-й строки
ldi temp,0b01100101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_a92:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a92
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b01100001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_b92:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b92
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
//////////////////////////////////
///////////////////////////////////////// Это 2-й полубайт 2-й буквы 2-й строки
ldi temp,0b11000101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_c92:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c92
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b11000001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_d92:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d92
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error ////////// Конец записи 2-й буквы 2-й строки
///////////////////////////////////////////////
ldi temp,0b11000100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_94:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_94
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b11000000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_95:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_95
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
///////////////////////////////////////// Это 2-й полубайт знакоместа 2-й строки
ldi temp,0b01110100
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_96:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_96
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b01110000
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_97:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_97
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
///////////////////////////////////////// Это 1-полубайт записи двоеточия 2-й строки
ldi temp,0b00110101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_a93:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a93
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b00110001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_b93:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b93
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
///////////////////////////////////////// Это 2-й полубайт записи двоеточия 2-й строки
ldi temp,0b10100101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_c93:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_c93
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
ldi temp,0b10100001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_d93:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_d93
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
ret
Stop:
ldi r16, 0b00010100
out TWCR, temp
ret
Delay:
ldi razr1, 255
ldi razr2, 255
ldi razr3, 20
PDelay:
dec razr1
brne PDelay
dec razr2
brne PDelay
dec razr3
brne PDelay
ret
Del_15ms:
ldi xh,high(FREQ/266)
ldi xl,low(FREQ/266)
PDelay1:
sbiw XH:XL, 1
brne PDelay1
ret
Del_5ms:
ldi xh,high(FREQ/800)
ldi xl,low(FREQ/800)
PDelay2:
sbiw XH:XL, 1
brne PDelay2
ret
Del_100mks:
ldi xh,high(FREQ/40000)
ldi xl,low(FREQ/40000)
PDelay3:
sbiw XH:XL, 1
brne PDelay3
ret
////////////////////////////////////////////////////////////////////
////////// Это часть датчика //////////////////
Dat_1:
rcall delay
CALL I2C_START ;Отправка Старт
LDI R27, 0b10011110 ;SLA(0b1001000) + W(0)
CALL I2C_WRITE ;Отправка SLAW
LDI R27, 0b00000000 ;Задание значения Pointer
CALL I2C_WRITE ;Отправка Pointer
CALL I2C_START ;Рестарт
LDI R27, 0b10011111 ;SLA(0b1001000) + R(0)
CALL I2C_WRITE ;Отправка SLAR
CALL Read_byte1 ;Запись первого байта
rcall delay
CALL Read_byte2 ;Запись второго байта (температуры)
rcall delay
CALL I2C_STOP ;Стоп
rcall delay
ret
;----------------------------I2C_INIT-----------------------------
I2C_INIT:
LDI R21, 0
OUT TWSR, R21
LDI R21, (1<<TWEN)
OUT TWCR, R21
RET
;----------------------------I2C_START-----------------------------
I2C_START:
LDI R21, (1<<TWINT)|1<<(TWSTA)|(1<<TWEN)
OUT TWCR, R21
WAIT11:
IN R21, TWCR
SBRS R21, TWINT
RJMP WAIT11
RET
;----------------------------I2C_WRITE -----------------------------
I2C_WRITE:
OUT TWDR, R27
LDI R21, (1<<TWINT)|(1<<TWEN)
OUT TWCR, R21
WAIT31:
IN R21, TWCR
SBRS R21, TWINT
RJMP WAIT31
RET
;----------------------------I2C_STOP------------------------------
I2C_STOP:
LDI R21, (1<<TWINT)|1<<(TWSTO)|(1<<TWEN)
OUT TWCR, R21
RET
Read_byte1:
ldi zh,high(term)
ldi zl,low(term)
in temp,TWDR
st z,temp
rcall TWI_ReciveAck
ret
Read_byte2:
ldi zh,high(term+1)
ldi zl,low(term+1)
in temp,TWDR
st z,temp
rcall TWI_ReciveNack
ret
TWI_ReciveAck:
ldi r16, 0b11000100
out TWCR, r16
ret
TWI_ReciveNack:
ldi r16, 0b10000100
out TWCR, r16
ret
///////////////////////////////////////////////////////////////////////////////////
///////////////////// Конвертация цифры температуры ///////////////////////
; Преобразование HEX в BCD
;Вход
;.def fbinL = r20 ;двоичное значение, младший байт
;.def fbinH = r21 ;двоичное значение, старший байт
;Выход
;.def tBCD0 = r21 ;BCD значение, цифры 1 и 0 ( младший порядок )
;.def tBCD1 = r22 ;BCD значение, цифры 3 и 2
;.def tBCD2 = r23 ;BCD значение, цифра 4 ( стрший порядок )
;Примечание: Переменные fbinH и tBCD0 должны размещаться в одном
;регистре.
;После преобразования числа 65535 в итоге будет.
/*
r17: 0b0011_0101 это 3 и 5
r18: 0b0101_0101 это 5 и 5
r19: 0b0000_0110 это 6
*/
bin16BCD5: ldi tBCD2,-1
b16BCD5_l1: inc tBCD2
;255
subi fbinL,low(10000) ;r17 0101_0101
sbci fbinH,high(10000) ;r18 0000_0010
;
brsh b16BCD5_l1 ;1500
;r17 0000_0000
subi fbinL,low(-10000) ;r18 0001_0101
sbci fbinH,high(-10000)
ldi tBCD1,-0x11
b16BCD5_l2: subi tBCD1,-0x10
subi fbinL,low(1000)
sbci fbinH,high(1000)
brsh b16BCD5_l2
subi fbinL,low(-1000)
sbci fbinH,high(-1000)
b16BCD5_l3: inc tBCD1
subi fbinL,low(100)
sbci fbinH,high(100)
brsh b16BCD5_l3
subi fbinL,-100
ldi tBCD0,-0x10
b16BCD5_l4: subi tBCD0,-0x10
subi fbinL,10
brsh b16BCD5_l4
subi fbinL,-10
add tBCD0,fbinL
ret
////////// HEX >>> BCD температуры ///////////
Send_dat_temp1:
clr r20
clr r21
rcall Vyv_temp
rcall bin16BCD5
mov data,tBCD0
lsl data
lsl data
lsl data
lsl data
ori data,0b00000011
rcall Send_data
RET
Send_dat_temp2:
clr r20
clr r21
rcall Vyv_temp
rcall bin16BCD5
mov data,tBCD0
lsr data
lsr data
lsr data
lsr data
swap data
ori data,0b00000011
rcall Send_data
RET
Send_dat_temp3:
clr r20
clr r21
rcall Vyv_temp
rcall bin16BCD5
mov data,tBCD1
lsl data
lsl data
lsl data
lsl data
ori data,0b00000011
rcall Send_data
RET
/////// Вывод значчения температуры /////////
Send_data: ///////// 1-й полубайт //////////
mov temp,data
lsl temp
lsl temp
lsl temp
lsl temp
ori temp,0b00000101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_a95:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a95
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
mov temp,data
mov temp,data
lsl temp
lsl temp
lsl temp
lsl temp
ori temp,0b00000001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_b94:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b94
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
///////// 2-й полубайт //////////
mov temp,data
lsr temp
lsr temp
lsr temp
lsr temp
swap temp
ori temp,0b00000101
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_a98:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_a98
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
////////////////
mov temp,data
lsr temp
lsr temp
lsr temp
lsr temp
swap temp
ori temp,0b00000001
out TWDR,temp
ldi temp,0b10000101
out TWCR,temp
Wait_b99:
in r16,TWCR
sbrs temp,TWINT
rjmp Wait_b99
in temp,TWSR
andi temp,0xF8
cpi temp,0x28
breq PC+2 ;
rjmp error
ret
////////////////////////////////
Vyv_temp:
ldi ZH,HIGH(Term)
ldi ZL,LOW(Term)
ldi temp,0
ldd temp1,z+1
mov fbinH,temp
mov fbinL,temp1
ret
; Задержка в 110 млс
Delay_Init3:
ldi XH, high(FREQ/72727)
ldi XL, low(FREQ/72727)
del_in3:
sbiw XH:XL, 1
brne del_in3
ret