.def TempU1 = r17 .def TempU2 = r18 .def TempU3 = r19 ;Commands .equ LCD_MODE = 0x00 ;Mode Control .equ LCD_CP = 0x01 ;Character Pitch .equ LCD_NC = 0x02 ;Number of Characters .equ LCD_TDN = 0x03 ;Time Division Number .equ LCD_CURSP = 0x04 ;Curor Position .equ LCD_DISPSL = 0x08 ;Display Start Lower Address .equ LCD_DISPSH = 0x09 ;Display Start Upper Address .equ LCD_CURSAL = 0x0A ;Cursor Lower Address .equ LCD_CURSAH = 0x0B ;Cursor Upper Address .equ LCD_WRITED = 0x0C ;Write Data .equ LCD_READD = 0x0D ;Read Data .equ LCD_CLRBIT = 0x0E ;Bit clear .equ LCD_SETBIT = 0x0F ;Bit set .equ LCD_Busy = 7 ;****************************************** LCD_EN: ;EN Pulse senden sbi DispMODE_PORT,DispEN_BIT nop nop nop cbi DispMODE_PORT,DispEN_BIT nop nop nop ret LCD_Write: ;Kommando schreiben ;tempu1 -> Instruction ;tempu2 -> Data rcall LCD_Wait sbi DispMODE_PORT,DispRS_BIT ;RS=1 cbi DispMODE_PORT,DispRW_BIT ;RW=0 push tempu2 ldi tempu2,0xff out DispDATA_DIR,tempu2 ;Ausgang pop tempu2 out DispDATA_PORT,tempu1 ;Instr. rcall LCD_EN cbi DispMODE_PORT,DispRS_BIT ;RS=0 out DispDATA_PORT,tempu2 ;Data rcall LCD_EN ; ret ; rjmp LCD_Wait LCD_Wait: ;wait of Display push tempu1 out DispDATA_DIR,isnull ;Eingang sbi DispMODE_PORT,DispRW_BIT ;RW=1 sbi DispMODE_PORT,DispRS_BIT ;RS=1 nop sbi DispMODE_PORT,DispEN_BIT nop nop nop nop LCD_w_l0: sbic DispDATA_IPORT,LCD_Busy rjmp LCD_w_l0 nop nop nop cbi DispMODE_PORT,DispEN_BIT pop tempu1 ret LCD_Read: ;Byte vom Display einlesen ;-> tempu1 Daten push tempu2 sbi DispMODE_PORT,DispRS_BIT ;RS=1 cbi DispMODE_PORT,DispRW_BIT ;RW=0 ldi tempu2,0xff out DispDATA_DIR,tempu2 ;Ausgang ldi tempu2,LCD_READD out DispDATA_PORT,tempu2 ;Instr. rcall LCD_EN out DispDATA_DIR,isnull ;Eingang sbi DispMODE_PORT,DispRW_BIT ;RW=1 cbi DispMODE_PORT,DispRS_BIT ;RS=0 nop nop sbi DispMODE_PORT,DispEN_BIT nop nop nop nop nop nop in tempu1,DispDATA_IPORT ;Einlesen cbi DispMODE_PORT,DispEN_BIT pop tempu2 rjmp LCD_Wait LCD_INIT: ;Display initialisieren cbi DispSel_PORT,DispRST_BIT ;RES=0 sbi DispSel_PORT,DispCS_BIT ;CS=1 cbi DispMODE_PORT,DispEN_BIT ;EN=0 cbi DispMODE_PORT,DispRW_BIT ;RW=0 ldi tempu2,255 rcall Hpause_n100us ;25ms sbi DispSEL_PORT,DispRST_BIT ;RES=1 rcall Hpause_n100us ;25ms rcall Hpause_n100us ;25ms cbi DispSel_PORT,DispCS_BIT ;CS=0 bleibt aktiv ldi tempu1,LCD_MODE ldi tempu2,0x32 ;Grafik rcall LCD_Write ldi tempu1,LCD_CP ldi tempu2,0x07 ;8Bit pro Byte rcall LCD_Write ldi tempu1,LCD_NC ldi tempu2,0x1F ;32Byte pro Line (einfachere Berechnung) rcall LCD_Write ;20 würden auch reichen ldi tempu1,LCD_TDN ldi tempu2,0x4F ;Helligkeit/Modulation rcall LCD_Write ldi tempu1,LCD_DISPSL ;Start Low clr tempu2 rcall LCD_Write ldi tempu1,LCD_DISPSH ;Start Hight rcall LCD_Write rjmp LCD_CLS Display_CLS: pushX push tempu1 push tempu2 push tempu3 ldiw X,0 ldi tempu2,80 LCD_cls_l0: push tempu2 ldi tempu1,LCD_CURSAL mov tempu2,XL rcall LCD_Write inc tempu1 mov tempu2,XH rcall LCD_Write ;Cursoradresse adiw X,32 ;nächste Zeile ldi tempu3,20 ;Byte pro Zeile mov tempu2,isnull ldi tempu1,LCD_WRITED LCD_cls_l1: rcall LCD_Write dec tempu3 brne LCD_cls_l1 pop tempu2 dec tempu2 brne LCD_cls_l0 ldiw X,0 rcall Display_POS pop tempu3 pop tempu2 pop tempu1 popX ret Display_SetDot: ;Pixel setzen ;XL -> xpos (0..159) ;XH -> ypos (0..79) ldi tempu1,LCD_SETBIT rjmp Disp_SD_m Display_ClrDot: ;Pixel löschen ;XL -> xpos (0..159) ;XH -> ypos (0..79) ldi tempu1,LCD_CLRBIT Disp_SD_m: push tempu2 rcall Display_POS mov tempu2,XL andi tempu2,7 ;nur Pixel im Byte rcall LCD_Write pop tempu2 ret