;**********************************************************TST_GLCD*********************************************************** ; Author : R Raghunathan / 04 August 2003. ; Assembler : Pinnacle 52 ;TST_GLCD is for testing out the functions of a 128 x 64 Graphic LCD module with Driver KS0108B from ; Samsung. The complete module has two such drivers - one for the left half of the display and the other ; for the right half - and the total columns add up to 128. The data sheet for the driver is silent on the ; memory map of the pixel - hence I have (tried to !) describe it below. ; A short description on the memory map of the pixels : ( A sketch would have been better - but then it ; cannot opened in a notepad !! So lets manage with a description) ; The following apply to the left half of the display and is the same for the right half. (To select the right half ; the CS1 bit is set and to select the left half the CS2 bit is set.) ; Each driver KS0108B controls a 64 column by 64 row pixel array. The 64 pixel row arrays are further ; grouped into 8 pages - and each page is 8 bits or 1 Byte tall. Thus when you write a Byte, based on the ; Page address and Column address, this "8 bit tall" area is filled up . The LSB bit of the data byte ; is at the top and the MSB bit is at the bottom. ; The first top most Page address is 0x0b8 and the lowermost page is 0x0c0. Likewise the left most column ; has an address of 0x040 and the rightmost column is at 0x080. ; Whenever you write or read data into the display RAM, the column address alone is incremented ; automatically by one. And when the increment happens after the last column (0x080), your code should ; should change the Column address to proceed as per need - else it rolls over and overwrites on the first ; column in the current page ! ; For rest of the read / write instructions please refer to the data sheet of KS0108B ; In the coding X_Address refers to the page and Y_Address refers to the column and depending on whether ; CS1 or CS2 is set the write will happen either in the left or right column respectively. ; I have not used the write instructions with the busy bit checking. I found that this was unreliable in ; many occasions - maybe my code had a bug - so just introduced a 10micro delay before each write. There has ; been no problems on account of this. ; ; Timings suitable for 80c51RD2 running with 6MHz crystal in 6 Clock mode . ( Each Machine cycle = 1 microsecond ) ; The module has the following routines for check out : ; FillChar ;To fill screen with same character ; HorLines ;To fill screen with 1 pixel wide Horizontal lines ; Box ; To draw a 2 pixel wide box margin ; User_Strng ; To display a user defined string ; FillDots ; To demonstrate the way Bytes are written in sequence and finally display a ; THANKS ! ; port 0 is used for data lines ( each line has a 10k pull up ) ; port 1 is used for control lines as listed below ; P1.0 ---RS ; P1.1 ---R / W ; P1.2 ---E ; P1.3 ---CS1 ; P1.4 ---CS2 ; The #RESET pin of the display is connected to +5V. In case you need to Reset the module without switching off ; power then allocate a port pin for this. Select BIT 00H ; to select cs1 of cs2 (0\1) SameChar BIT 01H ; to fill display with same character InvertDis BIT 02H ; To invert display string - not used now ORG 30H X_Addr DS 1 ; can be used to pass page address in User_Strng routine ( not used now ) Y_Addr DS 1 ; can be used to pass column address in User_Strng routine ( not used now ) ORG 0000h Normal: mov sp, #60h ; Define stack start point mov p0, #00h ; clear port0 mov p1, #00h ; clear port1 mov r1, #5 Del: call Dly150mS djnz r1, Del ; 150mS delay call Clr_Disp ; Clear the screen ; After this you have calls to the 5 Demo routines - each demo except FillDots, lasts about 3 secs roughly.. call BMP_IMAG jmp $ setb SameChar mov r1, #39 ;Load the ASCII number of character to be displayed here call FillChar ;To fill screen with above character call LDelay call Clr_Disp call HorLines ;To fill with Horizontal lines call LDelay call Clr_Disp call Box ; To draw a box call LDelay call Clr_Disp call User_Strng ; Display the user defined String call LDelay call Clr_Disp call FillDots ; Fill screen and then display THANKS jmp $ LDelay: mov r1, #20 ; General purpose delay routine Del1: call Dly150mS djnz r1, Del1 ; 150 x 20 mS delay = 3 Secs ret VarDelay: mov r7, #20h ; General purpose delay routine DV: mov r0, #0ffh djnz r0, $ djnz r0, $ djnz r7, DV ; Delay = r7 value x 1536 micros ret Clr_Disp: clr Select ; for selection of cs1 call Init_Lcd ; Initialise cs1 call Page_Sel ; clears all pages of cs1 setb Select ; for selection of cs2 call Init_Lcd ; Initialise cs2 call Page_Sel ; clears all pages of cs2 clr Select ret Page_Sel: mov r5, #0b8h ; X address counter at First Page pag_sel1: mov a, r5 call Write_Instr mov a, #40h ; Y address counter at First Column call Write_Instr mov a, #00h ; To be cleared mov r1, #64 next: call Write_Data dec r1 cjne r1, #00,next ; Clear all columns in one page inc r5 cjne r5,#0c0h, pag_sel1 ; Loop for clearing all pages ret ;========================================================================= ; Routine to fill the display with a particular character FillChar: mov r5, #0b8h ; X address counter at First Page LupFill: clr Select ; for selection of cs1 call Write_XY call CharLup ; fill left half / right half with same character setb Select ; for selection of cs2 call Write_XY inc r5 ; for all 8 pages cjne r5, #0c0h, LupFill ret Write_XY: mov a, #40h ; Y address counter at First Column call Write_Instr mov a, r5 ; X address counter at 00h call Write_Instr call CharLup ret CharLup: mov r3, #00h LupAgn: mov a, #00h call Write_Data mov dptr, #Font_Table call Write_Char mov a, #00h call Write_Data mov a, #00h call Write_Data jb SameChar, SameR1 call Dly150mS inc r1 ;Load next character for display SameR1: inc r3 cjne r1, #5fh, NxtChar mov r1, #00h NxtChar: cjne r3, #8, LupAgn ret ;=========================================================================== FillDots: clr Select mov r3, #0b8h ; First page NextPage: mov a, r3 ; page counter call Write_Instr mov a, #040h ; First column.. call Write_Instr mov r4, #0 ; CS1 column counter mov r6, #0 ; Total coulmn counter PagLup: call VarDelay ; So that you can see the filling... mov a, #0ffh call Write_Data call Sel_Cs2 inc r6 cjne r6, #128, PagLup clr Select inc r3 cjne r3, #0c0h, NextPage call Clr_Disp ; Now clear the screen call Box ; Draw the box margin... call User_Strng ; display THANKS! in the middle before returning Over: ret Sel_Cs2: inc r4 ; To automatically switch to CS2 cjne r4, #40h, NoCs2 setb Select ; change to right half... mov a, r3 ; without this it writes to last page of CS2 call Write_Instr mov a, #040h call Write_Instr NoCs2: ret ;=========================================================================== ;Routine to draw horzontal lines in full screen HorLines: mov r5, #0b8h ; Page counter mov r3, #0 ; Column counter clr Select ; Left half display selected NxtPat: nop Sect2: mov a, #40h call Write_Instr ; Y start address mov a, r5 call Write_Instr ; X start address PLoop: mov a, #55h ; Horizontal hatching whole screen call Write_Data inc r3 cjne r3, #64, PLoop mov r3, #0 ; Init column counter for next page inc r5 cjne r5, #0c0h, NxtPat ; One page over. Do next jnb Select, SetCs2 jb Select, Exit ; Second half also over - exit SetCs2: setb Select mov r5, #0b8h mov r3, #0 jmp Sect2 Exit: ret ;======================================================================== ;Routine to draw converted BMP images BMP_IMAG: mov dptr, #BMPDATA1-1 clr Select mov r3, #0b8h ; First page NexPage: mov a, r3 ; page counter call Write_Instr mov a, #040h ; First column.. call Write_Instr mov r4, #0 ; column counter mov r6, #0 ; Total column counter PageLup: inc dptr mov a, #00H movc a, @a+dptr call Write_Data ;call VarDelay ; So that you can see the filling... call Sel_CS2 inc r6 cjne r6, #128, PageLup clr Select inc r3 cjne r3, #0c0h, NexPage IMGOVER: ret Sel_CS2: inc r4 ; To automatically switch to CS2 cjne r4, #40h, NoCS2 setb Select ; change to right half... mov a, r3 ; without this it writes to last page of CS2 call Write_Instr mov a, #040h call Write_Instr NoCS2: ret ;============================================================================ ;Routine to draw a box that is 2 pixel wide on the periphary of the display area. Box: clr Select BoxCs2: mov r3, #0 mov a, #0b8h call Write_Instr mov a, #40h call Write_Instr ;First page first column CS1 (and then CS2) TLineLup: mov a, #03h ;Horizontal line - 2 pixel wide.. call Write_Data inc r3 cjne r3, #64, TLineLup jb Select, BLine setb Select jmp BoxCs2 BLine: clr Select BlnCs2: mov r3, #0 mov a, #0bfh ; Last page call Write_Instr mov a, #40h call Write_Instr ;Last page first column CS1 (and then CS2) BLineLup: mov a, #0C0h ;Horizontal line - 2 pixel wide.. call Write_Data inc r3 cjne r3, #64, BLineLup jb Select, RVerLine setb Select jmp BlnCs2 RVerLine: setb Select ;Already set. Just for comparing with LVerLine mov r3, #0b8h VerLup: mov a, r3 call Write_Instr mov a, #7eh ;63rd column CS2 call Write_Instr mov a, #0ffh call Write_Data mov a, #0ffh call Write_Data inc r3 cjne r3, #0c0h, VerLup LVerLine: clr Select mov r3, #0b8h VerLup1: mov a, r3 call Write_Instr mov a, #40h ;1st Column CS1. Always write column address AFTER page address call Write_Instr mov a, #0ffh call Write_Data mov a, #0ffh call Write_Data inc r3 cjne r3, #0c0h, VerLup1 ret ;================================================================== ; TIP : For demo, a fixed X and Y address is used. To make it universal you can pass these references ; via X_Addr and Y_Addr and InvertDis ram locations. And modify this code to handle them. User_Strng: clr Select ; Display the user defined string... mov a, #0b8h ; Start X address call Write_Instr mov r4, #70h ; Start Y address mov a, r4 call Write_Instr mov r5, #0 mov r3, #0 NextCh: mov dptr, #UserMssg mov a, r3 movc a, @a+dptr ;Get the ASCII of Character cjne a, #30h, ChkSpace ;check for "0" and if yes return jmp EofString ChkSpace: cjne a, #20h, Proceed ;check for Space jmp Space Proceed: clr c subb a, #33 ;adjust the begining of the table mov dptr, #Font_Table mov b, #05h ;Offset for 5 columns for each character mul ab clr c add a,dpl ;LSB in acc mov dpl,a mov a,b ;MSB in B addc a, dph mov dph, a ;DPTR now contains pointer to first data byte NxtByte: mov a, #0 movc a, @a+dptr ;cpl a ; for inverted display call Write_Data call Swt_Cs2 inc dptr inc r5 cjne r5, #5, NxtByte mov a, #0 ;cpl a ; for inverted display call Write_Data ; 1 Pixel gap between characters call Swt_Cs2 mov r5, #0 jmp NoSpace Space: mov a, #0 ;cpl a ; for inverted display call Write_Data ; For 2 pixel space call Swt_Cs2 mov a, #0 ;cpl a ; for inverted display call Write_Data call Swt_Cs2 NoSpace: inc r3 jmp NextCh EofString: ret Swt_Cs2: inc r4 ; To automatically switch to CS2 cjne r4, #80h, NoSwt ; Last column = 80h setb Select nop nop mov a, #0b8h ; without this it writes to last page of CS2 call Write_Instr mov a, #40h call Write_Instr NoSwt: ret UserMssg: db 'THANKS ! 0 ' ; Message to display .Must terminate with a "0" ;=============================================================================== Init_Lcd: mov a, #3eh ; Display off call Write_Instr mov r7, 0ffh djnz r7, $ mov a, #3fh ; Display on call Write_Instr mov r7, #0ffh djnz r7, $ mov a, #0c0h call Write_Instr mov a, #40h ; Y address counter at First column call Write_Instr mov a, #0b8h ; X address counter at Starting point call Write_Instr ret Write_Char: clr c push dph push dpl mov r2, #00h mov a, r1 ;Get the ASCII of Character mov b, #05h ;Offset for 5 columns for each character mul ab clr c add a,dpl ;LSB in acc mov dpl,a mov a,b ;MSB in B addc a, dph mov dph, a ;DPTR now contains pointer to first data byte Send_Next: mov a, #00h add a, r2 movc a, @a+dptr call Write_Data inc r2 cjne r2, #05h, Send_Next ;Loop till all 5 data bytes are sent for the character pop dpl pop dph ret Write_Instr: jb Select, Cs_2 clr p1.4 setb p1.3 ;Chip select cs1 enabled jmp WInstr Cs_2: clr p1.3 setb p1.4 ;Chip select cs2 enabled WInstr: nop mov r0, #10 djnz r0, $ clr p1.1 ;Write mode selected clr p1.0 ;Instruction mode selected mov p0, acc ;Place Instruction on bus setb p1.2 ;Enable High nop clr p1.2 ;Enable Low nop clr p1.3 ;put cs1 in non select mode clr p1.4 ;put cs2 in non select mode ret Write_Data: jb Select,Cs_2a clr p1.4 setb p1.3 ;Chip select cs1 enabled jmp WData Cs_2a: clr p1.3 setb p1.4 ;Chip select cs2 enabled WData: nop mov r0, #10 djnz r0, $ clr p1.1 ;Write mode selected setb p1.0 ;Data mode selected mov p0,a ;Place data on bus setb p1.2 ;Enable High nop clr p1.2 ;Enable Low nop clr p1.3 ;put cs1 in non select mode clr p1.4 ;put cs2 in non select mode ret Dly150mS: mov r7, #60h d1: mov r0, #0ffh djnz r0, $ djnz r0, $ djnz r7, d1 ret BMPDATA1: db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00 db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00 db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00 db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00 db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00 db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00 db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00 db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00 db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00 db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00 db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00 db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00 db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00 db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00 db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00 db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00 db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE db &hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE, db &hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&h00,&h00,&h00,&h00,&h00,&h00, db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00, db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h02,&h06,&h0E,&hFE,&hFE,&hFE, db &hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE, db &hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE,&hFE, db &hFE,&hFE,&hFE,&h3E,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00, db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF, db &hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF, db &hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&h00,&h00,&h00,&h00,&h00,&h00, db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h80,&h80,&h80, db &h80,&hC0,&hC0,&hC0,&hC0,&hE0,&hE0,&hF0,&hF0,&hF8,&hF8,&hFC,&hFE,&hFF,&hFF,&hFF, db &hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF, db &hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&h7F,&h7F,&h3F,&h3F,&h1F,&h1F,&h0F,&h07, db &h03,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00, db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF, db &hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF, db &hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&h02,&h02,&h02,&h02,&h02,&h02, db &h02,&h02,&h02,&h02,&h02,&h03,&h03,&h03,&h07,&h07,&h07,&h07,&h07,&h07,&h0F,&h0F, db &h0F,&h0F,&h1F,&h1F,&h1F,&h3F,&h3F,&h3F,&h7F,&h7F,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF, db &hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF, db &hFB,&hF9,&hF9,&hF1,&hF1,&hF0,&hE0,&hE0,&hE0,&hC0,&hC0,&h80,&h80,&h00,&h00,&h00, db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00, db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF, db &hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF, db &hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&h00,&h00,&h00,&h00,&h00,&h00, db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00, db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h03,&hFF,&hFF, db &hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF, db &hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFF,&hFE,&hFE, db &hFC,&hF0,&hE0,&h80,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00, db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h03,&h03,&h03,&h03,&h03,&h03, db &h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03, db &h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h00,&h00,&h00,&h00,&h00,&h00, db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00, db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h02,&h02,&h03,&h03,&h03,&h03, db &h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03, db &h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03,&h03, db &h03,&h03,&h03,&h03,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00, db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00, db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00, db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00, db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00, db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00, db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00, db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00, db &h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00,&h00 Font_Table: db 00h, 00h, 4fh, 00h, 00h ; '!' db 00h, 07h, 00h, 07h, 00h ; '"' db 14h, 7fh, 14h, 7fh, 14h ; '#' db 24h, 2ah, 7fh, 2ah, 12h ; '$' db 23h, 13h, 08h, 64h, 62h ; ' ' db 36h, 49h, 55h, 22h, 50h ; '&' db 00h, 05h, 03h, 00h, 00h ; ''' db 00h, 1ch, 22h, 41h, 00h ; '(' db 00h, 41h, 22h, 1ch, 00h ; ')' db 14h, 08h, 3eh, 08h, 14h ; '*' db 08h, 08h, 3eh, 08h, 08h ; '+' db 00h, 50h, 30h, 00h, 00h ; ',' db 08h, 08h, 08h, 08h, 08h ; '-' db 00h, 60h, 60h, 00h, 00h ; '.' db 20h, 10h, 08h, 04h, 02h ; '/' db 3eh, 51h, 49h, 45h, 3eh ; '0' db 00h, 42h, 7fh, 40h, 00h ; '1' db 42h, 61h, 51h, 49h, 46h ; '2' db 21h, 41h, 45h, 4bh, 31h ; '3' db 18h, 14h, 12h, 7fh, 10h ; '4' db 27h, 45h, 45h, 45h, 39h ; '5' db 3ch, 4ah, 49h, 49h, 30h ; '6' db 01h, 71h, 09h, 05h, 03h ; '7' db 36h, 49h, 49h, 49h, 36h ; '8' db 06h, 49h, 49h, 29h, 1eh ; '9' db 00h, 36h, 36h, 00h, 00h ; ':' db 00h, 56h, 36h, 00h, 00h ; ';' db 08h, 14h, 22h, 41h, 00h ; '<' db 14h, 14h, 14h, 14h, 14h ; '=' db 00h, 41h, 22h, 14h, 08h ; '>' db 02h, 01h, 51h, 09h, 06h ; '?' db 32h, 49h, 79h, 41h, 3eh ; ' ' db 7eh, 11h, 11h, 11h, 7eh ; 'A' db 7fh, 49h, 49h, 49h, 36h ; 'B' db 3eh, 41h, 41h, 41h, 22h ; 'C' db 7fh, 41h, 41h, 22h, 1ch ; 'D' db 7fh, 49h, 49h, 49h, 41h ; 'E' db 7fh, 09h, 09h, 09h, 01h ; 'F' db 3eh, 41h, 49h, 49h, 7ah ; 'G' db 7fh, 08h, 08h, 08h, 7fh ; 'H' db 00h, 41h, 7fh, 41h, 00h ; 'I' db 20h, 40h, 41h, 3fh, 01h ; 'J' db 7fh, 08h, 14h, 22h, 41h ; 'K' db 7fh, 40h, 40h, 40h, 40h ; 'L' db 7fh, 02h, 0ch, 02h, 7fh ; 'M' db 7fh, 04h, 08h, 10h, 7fh ; 'N' db 3eh, 41h, 41h, 41h, 3eh ; 'O' db 7fh, 09h, 09h, 09h, 06h ; 'P' db 3eh, 41h, 51h, 21h, 5eh ; 'Q' db 7fh, 09h, 19h, 29h, 46h ; 'R' db 46h, 49h, 49h, 49h, 31h ; 'S' db 01h, 01h, 7fh, 01h, 01h ; 'T' db 3fh, 40h, 40h, 40h, 3fh ; 'U' db 1fh, 20h, 40h, 20h, 1fh ; 'V' db 3fh, 40h, 38h, 40h, 3fh ; 'W' db 63h, 14h, 08h, 14h, 63h ; 'X' db 07h, 08h, 70h, 08h, 07h ; 'Y' db 61h, 51h, 49h, 45h, 43h ; 'Z' db 00h, 7fh, 41h, 41h, 00h ; '[' db 15h, 16h, 7ch, 16h, 15h ; ' ' db 00h, 41h, 41h, 7fh, 00h ; ']' db 04h, 02h, 01h, 02h, 04h ; '^' db 40h, 40h, 40h, 40h, 40h ; '_' db 00h, 01h, 02h, 04h, 00h ; ' ' db 20h, 54h, 54h, 54h, 78h ; 'a' db 7fh, 48h, 44h, 44h, 38h ; 'b' db 38h, 44h, 44h, 44h, 20h ; 'c' db 38h, 44h, 44h, 48h, 7fh ; 'd' db 38h, 54h, 54h, 54h, 18h ; 'e' db 08h, 7eh, 09h, 01h, 02h ; 'f' db 0ch, 52h, 52h, 52h, 3eh ; 'g' db 7fh, 08h, 04h, 04h, 78h ; 'h' db 00h, 44h, 7dh, 40h, 00h ; 'i' db 20h, 40h, 44h, 3dh, 00h ; 'j' db 7fh, 10h, 28h, 44h, 00h ; 'k' db 00h, 41h, 7fh, 40h, 00h ; 'l' db 7ch, 04h, 18h, 04h, 78h ; 'm' db 7ch, 08h, 04h, 04h, 78h ; 'n' db 38h, 44h, 44h, 44h, 38h ; 'o' db 7ch, 14h, 14h, 14h, 08h ; 'p' db 08h, 14h, 14h, 18h, 7ch ; 'q' db 7ch, 08h, 04h, 04h, 08h ; 'r' db 48h, 54h, 54h, 54h, 20h ; 's' db 04h, 3fh, 44h, 40h, 20h ; 't' db 3ch, 40h, 40h, 20h, 7ch ; 'u' db 1ch, 20h, 40h, 20h, 1ch ; 'v' db 3ch, 40h, 30h, 40h, 3ch ; 'w' db 44h, 28h, 10h, 28h, 44h ; 'x' db 0ch, 50h, 50h, 50h, 3ch ; 'y' db 44h, 64h, 54h, 4ch, 44h ; 'z' db 00h, 08h, 36h, 41h, 00h ; '{' db 00h, 00h, 7fh, 00h, 00h ; ' ' db 00h, 41h, 36h, 08h, 00h ; '}' db 08h, 08h, 2ah, 1ch, 08h ; ' ' db 08h, 1ch, 2ah, 08h, 08h ; ' ' db 48h, 7eh, 49h, 49h, 4ah ; ' ' db 03h, 3bh, 44h, 44h, 44h ; ' ' db 03h, 7bh, 14h, 14h, 14h ; ' ' db 07h, 05h, 07h, 00h, 00h ; ' ' db 1ch, 54h, 3eh, 15h, 1ch ; ' ' db 22h, 55h, 2ah, 14h, 08h ; '>>' db 08h, 14h, 2ah, 55h, 22h ; '<<' db 22h, 14h, 08h, 14h, 22h ; 'X' db 08h, 08h, 2ah, 08h, 08h ; ' ' db 18h, 24h, 18h, 24h, 18h ; ' ' db 44h, 44h, 5fh, 44h, 44h ; ' ' db 10h, 20h, 7fh, 01h, 01h ; ' ' db 00h, 00h, 51h, 4ah, 44h ; ' ' db 00h, 00h, 44h, 4ah, 51h ; ' ' db 49h, 49h, 49h, 49h, 49h ; ' ' db 5ch, 62h, 02h, 62h, 5ch ; ' ' db 40h, 3eh, 10h, 10h, 3eh ; ' ' db 42h, 66h, 5ah, 42h, 42h ; ' ' db 38h, 44h, 46h, 3ah, 02h ; ' ' db 44h, 3ch, 04h, 3ch, 44h ; ' ' db 7eh, 15h, 25h, 25h, 1ah ; ' ' db 5ch, 32h, 2ah, 26h, 1dh ; ' ' db 5eh, 09h, 09h, 09h, 5eh ; ' ' db 78h, 14h, 15h, 14h, 78h ; ' ' db 45h, 29h, 11h, 29h, 45h ; ' ' db 17h, 08h, 64h, 56h, 5dh ; '1/2' db 17h, 08h, 14h, 1ah, 7dh ; '1/4' db 30h, 28h, 24h, 28h, 30h ; ' ' db 12h, 09h, 12h, 24h, 12h ; ' ' db 04h, 02h, 7dh, 02h, 04h ; ' ' db 10h, 20h, 5fh, 20h, 10h ; ' ' db 08h, 1ch, 2ah, 08h, 08h ; ' ' db 00h, 00h, 77h, 00h, 00h ; '|' db 0dh, 0bh, 00h, 54h, 7ch ; '2/3' db 17h, 08h, 74h, 02h, 71h ; '1/11' db 17h, 08h, 44h, 56h, 7dh ; '1/3' db 15h, 1fh, 20h, 30h, 78h ; '3/4' db 78h, 40h, 40h, 40h, 40h ; ' ' db 40h, 40h, 40h, 40h, 78h ; ' ' db 1ch, 22h, 7fh, 22h, 22h ; ' ' db 14h, 24h, 7fh, 24h, 14h ; ' ' db 14h, 12h, 7fh, 12h, 14h ; ' ' db 1ch, 22h, 24h, 18h, 26h ; ' ' db 14h, 22h, 7fh, 22h, 14h ; ' ' db 3eh, 49h, 49h, 49h, 3eh ; ' ' db 40h, 48h, 3eh, 09h, 01h ; ' ' db 01h, 01h, 01h, 01h, 01h ; ' ' db 00h, 7eh, 7eh, 7eh, 00h ; ' ' end