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 + -
显示快捷键?