lcd.asm

来自「e1c0df5d-c8bc-48a5-bc02-a2b7c51c0dbf是做mp」· 汇编 代码 · 共 419 行

ASM
419
字号
/* ***************************************************************************  Copyright (C) 2002  Jesper Hansen <jesperh@telia.com> and**			Romuald Bialy (MIS) <romek_b@o2.pl>.******  Yampp-7/USB - low level support library*********************************************************************************   This file is part of the yampp system.****  This program is free software; you can redistribute it and/or**  modify it under the terms of the GNU General Public License**  as published by the Free Software Foundation; either version 2**  of the License, or (at your option) any later version.****  This program is distributed in the hope that it will be useful,**  but WITHOUT ANY WARRANTY; without even the implied warranty of**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the**  GNU General Public License for more details.****  You should have received a copy of the GNU General Public License**  along with this program; if not, write to the Free Software Foundation,**  Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.*******************************************************************************  Revision History****  when         what  who	why****  2002-09-22   1.0   MIS      initial public release**  2002-10-15   1.10  MIS      added support for Nokia LCD to yampp7**  2002-10-30   1.11  MIS      added support for national characters displaying************************************************************************* */#define __ASSEMBLER__ 1#define __SFR_OFFSET 0#include <avr/io.h>#define LCD_ASM#include "lcd.h"#define __tmp_reg__	r0#define __zero_reg__	r1.extern delayms#define LCD_ASM	.comm	lcd_x,1	.comm	lcd_y,1	.comm	lcd_xmax,1	.comm	lcd_ymax,1	.text.extern vs1001_init_io	.comm	lcd_inv,1	.text;************************************************;LCD control routine		;void lcd_init(u08 mode)	.global lcd_initlcd_init:	mov	r25,r24		andi	r25,254		ldi	r24,14		sts	lcd_xmax,r24		ldi	r24,6		sts	lcd_ymax,r24		sbi	PORTB,PB4		;deselect Display		sbi	DDRB,PB4		;		sbi	DDRD,PD0		;C/D = output		call	vs1001_init_io		;init SPI		ldi	r24,0x21		;LCD extended cmds		rcall	lcd_wrcmd		ldi	r24,0xC8		;set LCD Vop (contrast)		rcall	lcd_wrcmd		ldi	r24,0x06		;set temperatur coefficent		rcall	lcd_wrcmd		ldi	r24,0x13		;LCD bias mode 1:48		rcall	lcd_wrcmd		ldi	r24,0x20		;LCD standard cmds, Horizontal adressing mode		rcall	lcd_wrcmd		ldi	r24,0x0C		;LCD in normal mode		add	r24,r25			;set mode to eventually REVERS		rcall	lcd_wrcmd		;fall trough;************************************************;clear LCD;void lcd_clrscr(void)	.global lcd_clrscrlcd_clrscr:	sts	lcd_x,__zero_reg__		sts	lcd_y,__zero_reg__			sts	lcd_inv,__zero_reg__			ldi	r24,0x40		;clear LCD y addr		rcall	lcd_wrcmd		ldi	r24,0x80		;clear LCD x addr		rcall	lcd_wrcmd		ldi 	r21, 84			;84 chars on displayLCD_CLEAR_1:	clr 	r24			;char #0		rcall 	lcd_data		dec 	r21		brne 	LCD_CLEAR_1		ldi	r24,0x40		;clear LCD y addr		rcall	lcd_wrcmd		ldi	r24,0x80		;clear LCD x addr		rjmp	lcd_wrcmd;************************************************;display graphics welcome screen from eeprom;Screen must have size of 84x32 pixesls, and LCD ram format.;It must be loaded into EEPROM from 0x05C address and have 4*84 bytes length.;u08 lcd_logo(u08 line)	.global lcd_logolcd_logo:	ori	r24,0x40		;set line number		rcall	lcd_wrcmd		ldi	r24,0x80		rcall	lcd_wrcmd		ldi	r30,EEPROM_LOGO		;EEPROM data start pointer (512 - 4*84 - 2)		clr	r31		rcall	get_eep		cpi	r24,'y'		brne	no_logo		rcall	get_eep		cpi	r24,'W'		brne	no_logo		sbi	PORTD,PD0		;set DATA mode		sbi	DDRD,PD0		;PD0 - output for LCD D/C		cbi	PORTB,PB4		;enable LCDlcd_wloop:	rcall	get_eep		rcall	SPI_SEND		;Send over SPI		sbrs	r31,1			;if address == 512		rjmp	lcd_wloop		rcall	LCD_SEXIT		clr	r24		retno_logo:	ser	r24		retget_eep:	out	EEARH,r31		;set eeprom addressget_eep1:	out	EEARL,r30		sbi	EECR,EERE		;eeprom read		in	r24,EEDR		;get byte from eeprom		adiw	r30,1			;increament address		ret;************************************************;void lcd_off(void)	.global lcd_offlcd_off:	rcall	lcd_clrscr		ldi	r24,0x08		rcall	lcd_wrcmd		ldi	r24,0x24		;LCD off		rjmp	lcd_wrcmd;************************************************;void lcd_invert(void)	.global lcd_invertlcd_invert:	ldi	r24,0x7f		sts	lcd_inv,r24		ret;************************************************;void lcd_normal(void)	.global lcd_normallcd_normal:	sts	lcd_inv,__zero_reg__		ret;************************************************;			r24;void lcd_contrast(u08 cont)	.global lcd_contrastlcd_contrast:	mov	r25,r24		ldi	r24,0x21		;LCD extended cmds		rcall	lcd_wrcmd		mov	r24,r25		ori	r24,0x80		;add Set Vop command		rcall	lcd_wrcmd		ldi	r24,0x20		;LCD in normal mode		rjmp	lcd_wrcmd;************************************************;display a bar;Lenght(on display) is in r22 and value(how much is filled) in r24;		  r24	r22;void lcd_bar(u08 val, u08 len)	.global lcd_barlcd_bar:	mov	r25,r24		ldi	r24,0b01111111		;begin of bar		cbi	PORTB,PB4		;enable LCD		sbi	PORTD,PD0		;set DATA mode		sbi	DDRD,PD0		;PD0 - output for LCD D/C		rcall	SPI_SENDLCD_BAR_2:	ldi	r24,0b01011101		;full bar pixel		tst	r25		brne	LCD_BAR_1		ldi	r24,0b01000001		;empty bar pixel		inc	r25LCD_BAR_1:	dec	r25		rcall	SPI_SEND		dec	r22		brne	LCD_BAR_2		ldi	r24,0b01111111		;end of bar		rjmp	lcd_wrdata;************************************************;		  r24	r22;void lcd_gotoxy(u08 x, u08 y)	.global lcd_gotoxylcd_gotoxy:		sts	lcd_x,r24		sts	lcd_y,r22		; Fall trough;void lcd_goto(void)lcd_goto:		lds	r24,lcd_y		; get y position		ori	r24,0x40		rcall	lcd_wrcmd		lds	r0,lcd_x		ldi	r24,6		mul	r24,r0		mov	r24,r0		clr	__zero_reg__		ori 	r24,0x80		; get x position		rjmp	lcd_wrcmd;************************************************;display a character	;		r24;void lcd_data(u08 data)	.global	lcd_datalcd_data:		clr	r22			;offset = 0;void lcd_data_o(u08 data, u08 offset)	.global	lcd_data_olcd_data_o:	push 	r30		push 	r31		lds	r23,lcd_inv		;get lcd_invert flag		cbi	PORTB,PB4		;enable LCD		sbi	PORTD,PD0		;set DATA mode		sbi	DDRD,PD0		;PD0 - output for LCD D/C		tst	r24			;test for code > 127		brmi	NATCH			;go to national chars printingLCD_SENDASC:	ldi	r25,6			;6 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__		add	r30, r22		;add offset		adc	r31, __zero_reg__		sub	r25,r22			;substract bytes countLCD_CHAR_1:	lpm	r24,Z+			;load byte from ASCII table		eor 	r24,r23			;Character inversion		rcall	SPI_SEND		;Send over SPI		dec	r25		brne	LCD_CHAR_1		;next byteLCD_CHAR_2:	pop 	r31		pop 	r30		rjmp	LCD_SEXITNATCH:		mov	r25,r24		ldi	r30,EEPROM_LANGTAB	;codes conversion table addres		out	EEARH,__zero_reg__	;set eeprom addressNTABS:		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 searchNTABNF:		ldi	r24,'_'			;end of table -> print "_"		rjmp	LCD_SENDASCNATCH_F:	subi	r30,(EEPROM_LANGTAB+1)	;substract cargen table base = char number		ldi	r25,6			;6 bytes per char		mul	r30,r25		mov	r30,r0		clr	__zero_reg__		subi	r30,-(EEPROM_LANGCHARS)	;add character generator table offset		add	r30,r22			;add offset		sub	r25,r22			;substract bytes countNAT_CHAR_1:	rcall	get_eep1		;get byte from eeprom		eor 	r24,r23			;Character inversion		rcall	SPI_SEND		;Send over SPI		dec	r25			;dec bytes counter		brne	NAT_CHAR_1		;next byte		rjmp	LCD_CHAR_2;************************************************;send an LCD commandlcd_wrcmd:	cbi	PORTD,PD0		;set CMD mode		rjmp	LCD_SEND;************************************************;send LCD data;		 r24;void lcd_wrdata(u08 data)	.global lcd_wrdatalcd_wrdata:	sbi	PORTD,PD0		;set DATA mode		;fall trough;************************************************;using the SPI for communicationLCD_SEND:	cbi	PORTB,PB4		;enable LCD		sbi	DDRD,PD0		;PD0 - output for LCD D/C		rcall	SPI_SENDLCD_SEXIT:	sbi	PORTB,PB4		;disable LCD		cbi	DDRD,PD0		;PD0 - input for DREQ handling		sbi	PORTD,PD0		;enable pullup		retSPI_SEND:	out	SPDR,r24		;load byte in SPI data registerSPI_SEND_0:	sbis	SPSR,SPIF		rjmp	SPI_SEND_0		;transmitt byte to LCD		in	r24,SPDR		ret;************************************************;void lcd_newline(void)lcd_newline:		sts 	lcd_x,__zero_reg__		; lcd_x = 0		lds 	r18,lcd_y			; lcd_y++ 		inc	r18		lds	__tmp_reg__,lcd_ymax		cp	r18,__tmp_reg__		brge	lcd_nl2 		sts 	lcd_y,r18lcd_nl2:	ret;					r24;void lcd_putchar(u08 data)	.global lcd_putcharlcd_putchar:		cpi	r24,'\n'		brne	lcd_pc2			rcall	lcd_newline		rjmp	lcd_gotolcd_pc2:	cpi	r24,'\r'		breq	lcd_p3		lds	r25,lcd_x		lds	__tmp_reg__,lcd_xmax		cp	r25,__tmp_reg__		brge	lcd_p3		inc	r25		sts	lcd_x,r25		rjmp	lcd_data;				r25/r24;void lcd_puts(char *s)	.global lcd_putslcd_puts:			movw	r30,r24		sbiw	r30,0		; test for zero		breq	lcd_p3lcd_p2:		ld	r24,Z+		tst	r24		breq	lcd_p3				rcall	lcd_putchar		rjmp	lcd_p2lcd_p3:		ret;		  		   r25/r24;void lcd_progputs(char *s)	.global lcd_progputslcd_progputs:			movw	r30,r24		sbiw	r30,0		; test for zero		breq	lcd_p3lcd_pp2:		lpm	r24,Z		tst	r24		breq	lcd_p3				rcall	lcd_putchar		adiw	r30,1		rjmp	lcd_pp2;Ascii table for character definitionASCIITAB:#include "ascii.def"

⌨️ 快捷键说明

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