Разберающиеся в асм и си проверте плиз
Код
// C
#define LCDE = 0;
#define LCDDATA = 1;
#define LCDCLK = 2;
void init_lcd_2wire();
void send_lcd_reg_2wire(unsigned char send_data);
void init_lcd_2wire()
{
PORTB.0 = 0;
PORTB.1 = 0;
PORTB.2 = 0;
delay_ms(400); // для правильного функционирования
delay_ms(15);
send_lcd_reg_2wire(0x30); //
delay_ms(5);
send_lcd_reg_2wire(0x30); //
delay_us(255);
send_lcd_reg_2wire(0x30); //
delay_us(255);
send_lcd_reg_2wire(0x38); // 8 проводной интерфейс, 2 строки, размер символа 5Х7.
delay_us(255);
send_lcd_reg_2wire(0x08); // дисплей выкл, курсор выкл, мерцание выкл.
delay_us(255);
send_lcd_reg_2wire(0x01); // очистка дисплея
delay_us(255);
send_lcd_reg_2wire(0x06); // Increment cursor to the right when writing, don't shift screen
delay_us(255);
send_lcd_reg_2wire(0x0C); // дисплей вкл, курсор выкл, мерцание выкл.
delay_us(255);
}
void send_lcd_reg_2wire(unsigned char send_data)
{
unsigned int i;
PORTB.1 = 0;
PORTB.2 = 0;
PORTB.0 = 1;
for (i=0; i<8; i++)
{
if ((send_data & 0x08) != 0)
PORTB.1 = 0;
else
PORTB.1 = 1;
PORTB.2 = 1;
PORTB.2 = 0;
send_data = send_data << 1;
}
PORTB.1 = 0;
PORTB.0 = 1;
PORTB.0 = 0;
}
Код
// ASM
;**********************************************
;* Setup *
;* Initialize the timer, LCD port and LCD *
;**********************************************
Setup:
;** Timer setup **
ldi AReg,TCK64
sts ClkDiv,AReg
ldi AReg,TSTOP ;Timer 0 off (just in case)
out TCCR0,AReg ;Stop timer
ldi AReg,0b00000010;Enable Timer 0 interrupt
out TIMSK,AReg
sei ;enable interrupts
;** LCD port setup and HD44780 LCD setup **
sbi DDRB,LCDE ;DDRB bit 5 = 1 = output
sbi DDRB,LCDDat;DDRB bit 6 = 1 = output
sbi DDRB,LCDClk;DDRB bit 7 = 1 = output
cbi PORTB,LCDE ;set E low
cbi PORTB,LCDDat ;set Data bit low
cbi PORTB,LCDClk ;set Clk low
ldi BReg,TCK1024 ;switch to a 1024 clock divisor
sts ClkDiv,BReg
ldi DelayVal,d15ms;15ms delay
rcall Delay
ldi AReg,$30
rcall LCDCmd
ldi DelayVal,d4x1ms;4.1ms countdown
rcall Delay
ldi AReg,$30
rcall LCDCmd
ldi BReg,TCK64 ;switch to a 64 clock divisor
sts ClkDiv,BReg
ldi DelayVal,d100us
rcall Delay
ldi AReg,$30
rcall LCDCmd
ldi BReg,TCK1024 ;switch to a 1024 clock divisor
sts ClkDiv,BReg
ldi DelayVal,d4x1ms
rcall Delay
ldi AReg,$38 ;RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
rcall LCDCmd ;0 0 0 1 1 1 0 x x
;8-bit operation, 1/16 duty cycle
;5x8 dot matrix
ldi BReg,TCK64 ;switch to a 64 clock divisor
sts ClkDiv,BReg
ldi DelayVal,d40us
rcall Delay
ldi AReg,$08 ;RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
rcall LCDCmd ;0 0 0 0 0 1 0 0 0
;Display off, cursor off, blink off
ldi DelayVal,d40us
rcall Delay
ldi AReg,$01 ;RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
rcall LCDcmd ;0 0 0 0 0 0 0 0 1
;Clear screen, cursor home
ldi DelayVal,d1ms
rcall Delay
rcall Delay
ldi AReg,$06 ;RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
rcall LCDCmd ;0 0 0 0 0 0 1 1 0
;Increment cursor to the right when writing, don't shift screen
ldi DelayVal,d40us
rcall Delay
ldi AReg,$0c ;RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
rcall LCDCmd ;0 0 0 0 0 0 1 1 0
;Display on, cursor off, blink off
ldi DelayVal,d40us
rcall Delay
ret
;**********************************************
;* Write byte to LCD bus *
;**********************************************
;**********************************************
;* PutByte clock byte into 74hc164. *
;* Data is in AReg *
;* BReg is used as acounter *
;**********************************************
PutByte:
ldi BReg,8 ;bit counter
ShiftB:
cbi PORTB,LCDDat ;set LCD Data bit to 0
lsl AReg ;shift bits in AReg into carry
brcc CLKBit ;if zero, clock it out
sbi PORTB,LCDDat ;if 1, set LCD Data bit to 1
CLKBit:
sbi PORTB,LCDClk ;bit clocks on rising edge
cbi PORTB,LCDClk ;bring clock back to 0
NextB:
dec BReg ;shift out 8 bits
brne ShiftB
ret
;**********************************************
;* LCDCmd - Send a command to the LCD *
;* data in AReg *
;**********************************************
LCDCmd:
rcall PutByte
cbi PORTB,LCDDat ;set RS low
sbi PORTB,LCDE ;set E High
cbi PORTB,LCDE ;set E low
ret
;**********************************************
;* LCDChr - Display a character on the LCD *
;* data in AReg *
;**********************************************
LCDChr:
rcall PutByte
sbi PORTB,LCDDat ;set RS High
sbi PORTB,LCDE ;set E High
cbi PORTB,LCDE ;set E low
ret