⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.asm

📁 e1c0df5d-c8bc-48a5-bc02-a2b7c51c0dbf是做mp3的源代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
		ldi	r24,0x02		;Colour mode (second data for MADCTRL)
		rcall	lcd_wrdata
		ldi	r24,0x01		;Colour mode (second data for MADCTRL)
		rcall	lcd_wrdata
#endif

		push	r22
#ifndef EPSON_NEW_LCD
		lds	r24,lcd_x
		lds	r22,lcd_y
		mov	r20,r24
		add	r20,r25
		inc	r20
		mov	r18,r22
		subi	r18,lo8(-13)
#else
		lds	r22,lcd_x		;the S1D15G17 rotates the coordinates as well
		lds	r24,lcd_y		;when in vertical addressing mode
		mov	r18,r22			;so x and y are swapped
		add	r18,r25
		inc	r18
		mov	r20,r24
		subi	r20,lo8(-13)
#endif
		rcall	lcd_window1		;create window xlen = R25, ylen = 14
		pop	r22

		ldi	r24,LCD_CMD_RAMWR	;write memory command
		rcall	lcd_wrcmd
		rcall	send_begin

bar_lop:	tst	r21
		brne	bar_2
		rcall	send_empty
		inc	r21
		rjmp	bar_3
bar_2:		rcall	send_full
bar_3:		dec	r21
		dec	r25
		brne	bar_lop

		rcall	send_begin
		ldi	r24,LCD_CMD_MADCTL	;Memory data acces control
		rcall	lcd_wrcmd
		ldi	r24,MADCTL_HORIZ	;Return to horizontal addresing
		rcall	lcd_wrdata
#ifdef EPSON_LCD
		ldi	r24,0x02		;Colour mode (second data for MADCTRL)
		rcall	lcd_wrdata
		ldi	r24,0x01		;Colour mode (second data for MADCTRL)
		rcall	lcd_wrdata
#endif
;		sbi	PORTB,LCD_CS		;deselect Display
		ret

send_begin:	ldi	r20,14			;send vertical line of bar
		clr	r24
sb1:		rcall	lcd_wrdata
		dec	r20
		brne	sb1
		ret

send_full:	rcall	sf2			;send full bar patterrn
		mov	r24,r23
		rcall	lcd_wrdata
		rcall	lcd_wrdata
		ldi	r20,8
		mov	r24,r22
sf1:		rcall	lcd_wrdata
		dec	r20
		brne	sf1
		mov	r24,r23
		rcall	lcd_wrdata
		rcall	lcd_wrdata
sf2:		clr	r24
		rjmp	lcd_wrdata

send_empty:	rcall	sf2			;send empty bar patterrn
		ldi	r20,12
		mov	r24,r23
se1:		rcall	lcd_wrdata
		dec	r20
		brne	se1
		rjmp	sf2

;************************************************
;		  r24	r22

#ifndef EPSON_LCD
 #define lcd_wind2	lcd_wind1
#endif

;void lcd_gotoxy(u08 x, u08 y)		Assume as this display is used in 128x128 pixels mode
	.global lcd_gotoxy
lcd_gotoxy:
		sts	lcd_x,r24
		sts	lcd_y,r22
		ldi	r20,0x81
		mov	r18,r20

;		    r24     r22     r20     r18
;void lcd_window(u08 xp, u08 yp, u08 xe, u08 ye)
	.global lcd_window
lcd_window:

;		cbi	PORTB,LCD_CS		;select Display
		rcall	lcd_window1
;		sbi	PORTB,LCD_CS		;deselect Display
		ret

lcd_window1:	mov	r1,r24
		ldi	r24,LCD_CMD_CASET	;set X
		rcall	lcd_wrcmd
		mov	r24,r1			;xp
		clr	r1
		rcall	lcd_wind2
		mov	r24,r20			;xe
		rcall	lcd_wind2

		ldi	r24,LCD_CMD_PASET	;set Y
		rcall	lcd_wrcmd
		mov	r24,r22			;yp
		rcall	lcd_wind1
		mov	r24,r18			;ye

lcd_wind1:	subi	r24,lo8(-2)

#ifdef EPSON_LCD
lcd_wind2:	inc	r24
#endif
		rjmp	lcd_wrdata

;************************************************

;void lcd_newline(void)
lcd_newline:
		sts 	lcd_x,__zero_reg__		; lcd_x = 0
		lds 	r18,lcd_y			; lcd_y++
		subi	r18,lo8(-14)
		cpi	r18,126				; Ymax
		brsh	lcd_nl2
 		sts 	lcd_y,r18
lcd_nl2:	ret



;************************************************
;display a character	

;					r24
;void lcd_putchar(u08 data)
	.global lcd_putchar
lcd_putchar:
		cpi	r24,'\n'
		brne	lcd_pc2	
		rjmp	lcd_newline

lcd_pc2:	cpi	r24,'\r'
		breq	lcd_nl2
		cpi	r24,0xff		;test text color token
		brne	lcd_pc3
		sts	setcolmark,r24		;mark that next byte is color code
		ret
lcd_pc3:	lds	r25,setcolmark
		tst	r25
		breq	lcd_pc4
		sts 	text_color,r24
		sts	setcolmark,__zero_reg__
		ret
lcd_pc4:	lds	r25,lcd_x
		cpi	r25,124			;Xmax
		brsh	lcd_nl2

;------------------------------

lcd_data:	push 	r30
		push 	r31
;		cbi	PORTB,LCD_CS		;enable LCD

		tst	r24			;test for code > 127
		brmi	NATCH			;go to national chars printing

LCD_SENDASC:	subi	r24,lo8(30)		;substract offset to first char
		ldi	r25,14			;14 byte/char
		mul	r24,r25			;compute character offset
		ldi	r30,lo8(ASCIITAB)	;set pointer to Ascii table
		ldi	r31,hi8(ASCIITAB)
		add	r30, r0
		adc	r31, r1
		clr	__zero_reg__
		rcall	DISPSET

LCD_CHAR_1:	lpm	r23,Z+			;load byte from ASCII table
		rcall	SEND_LIN
		brne	LCD_CHAR_1		;next byte

; LCD_CHAR_2:	sbi	PORTB,LCD_CS		;disable LCD

LCD_CHAR_2:	lds	r24,lcd_x		;update X position to next char
		subi	r24,lo8(-8)
		sts	lcd_x,r24

		pop 	r31
		pop 	r30
		ret

;------------------------------

NATCH:		mov	r25,r24
		clr	r31
		ldi	r30,EEPROM_LANGTAB	;codes conversion table addres
NTABS:		rcall	get_eep1
		tst	r24
		breq	NTABNF			;test for 0 -> end of table -> print "_"
		cp	r24,r25			;is this char ?
		breq	NATCH_F			;yes, display it
		cpi	r30,(EEPROM_LANGTAB+20)	;check for table end
		brne	NTABS			;next search
NTABNF:		ldi	r24,'_'			;end of table -> print "_"
		rjmp	LCD_SENDASC

NATCH_F:	subi	r30,(EEPROM_LANGTAB+1)	;substract chargen table base = char number
		ldi	r25,14			;14 bytes per char
		mul	r30,r25
		movw	r30,r0
		clr	__zero_reg__
		subi	r30,lo8(-EEPROM_LANGCHARS)	;add character generator table offset
		sbci	r31,hi8(-EEPROM_LANGCHARS)	;add character generator table offset
		rcall	DISPSET

NAT_CHAR_1:	rcall	get_eep1		;get byte from eeprom
		mov	r23,r24
		rcall	SEND_LIN		;Send over SPI
		brne	NAT_CHAR_1		;next byte
		rjmp	LCD_CHAR_2

;------------------------------

DISPSET:	ldi	r24,LCD_CMD_CASET
		rcall	lcd_wrcmd
		lds	r24,lcd_x		;xp = lcd_x
		rcall	lcd_wind2
		subi	r24,lo8(-7)		;xe = lcd_x + 7
		rcall	lcd_wrdata
		
		ldi	r24,LCD_CMD_PASET
		rcall	lcd_wrcmd
		lds	r24,lcd_y		;yp = lcd_y
		rcall	lcd_wind1
		subi	r24,lo8(-13)		;ye = lcd_y + 13
		rcall	lcd_wrdata

		ldi	r24,LCD_CMD_RAMWR	;write memory command
		rjmp	lcd_wrcmd

;------------------------------

SEND_LIN:	ldi	r22,8
SL_2:		lds	r24,bkg_color		;send 8 bytes pixel data
		rol	r23
		brcc	SL_3
		lds	r24,text_color
SL_3:		rcall	lcd_wrdata		;Send over SPI
		dec	r22
		brne	SL_2
		dec	r25
		ret

;------------------------------

get_eep1:	out	EEARH,r31
		out	EEARL,r30
		sbi	EECR,EERE		;eeprom read
		in	r24,EEDR		;get byte from eeprom
		adiw	r30,1			;increament address
		ret


;************************************************
;send an LCD command
	.global lcd_wrcmd
lcd_wrcmd:
		cbi	PORTB,LCD_CS
		cbi	SPCR,SPE		;disable SPI
		cbi	PORTB,PB5		;clear MOSI
		rjmp	send_dc

;************************************************
;send LCD data
;		 r24
;void lcd_wrdata(u08 data)
	.global lcd_wrdata
lcd_wrdata:
		cbi	PORTB,LCD_CS
		cbi	SPCR,SPE		;disable SPI
		sbi	PORTB,PB5		;set MOSI High
send_dc:
		sbi	PORTB,PB7		;SCK Hi
		cbi	PORTB,PB7		;SCK Lo
		sbi	SPCR,SPE		;enable SPI
		;fall trough

;************************************************
;using the SPI for communication

SPI_SEND:	out	SPDR,r24		;load byte in SPI data register
SPI_SEND_0:	sbis	SPSR,SPIF
		rjmp	SPI_SEND_0		;transmitt byte to LCD
		in	r0,SPDR
		sbi	PORTB,LCD_CS
		ret

;************************************************

;				r25/r24
;void lcd_puts(char *s)
	.global lcd_puts
lcd_puts:	
		movw	r30,r24
		sbiw	r30,0		; test for zero
		breq	lcd_p3
lcd_p2:
		ld	r24,Z+
		tst	r24
		breq	lcd_p3		
		rcall	lcd_putchar
		rjmp	lcd_p2
lcd_p3:		ret


;		  		   r25/r24
;void lcd_progputs(char *s)
	.global lcd_progputs
lcd_progputs:	
		movw	r30,r24
		sbiw	r30,0		; test for zero
		breq	lcd_p3
lcd_pp2:
		lpm	r24,Z
		tst	r24
		breq	lcd_p3		
		rcall	lcd_putchar
		adiw	r30,1
		rjmp	lcd_pp2

;Ascii table for character definition
ASCIITAB:
#include "ascii.def"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -