📄 mylcd.i
字号:
#pragma used+
sfrb TWBR=0;
sfrb TWSR=1;
sfrb TWAR=2;
sfrb TWDR=3;
sfrb ADCL=4;
sfrb ADCH=5;
sfrw ADCW=4;
sfrb ADCSRA=6;
sfrb ADCSR=6;
sfrb ADMUX=7;
sfrb ACSR=8;
sfrb UBRRL=9;
sfrb UCSRB=0xa;
sfrb UCSRA=0xb;
sfrb UDR=0xc;
sfrb SPCR=0xd;
sfrb SPSR=0xe;
sfrb SPDR=0xf;
sfrb PIND=0x10;
sfrb DDRD=0x11;
sfrb PORTD=0x12;
sfrb PINC=0x13;
sfrb DDRC=0x14;
sfrb PORTC=0x15;
sfrb PINB=0x16;
sfrb DDRB=0x17;
sfrb PORTB=0x18;
sfrb PINA=0x19;
sfrb DDRA=0x1a;
sfrb PORTA=0x1b;
sfrb EECR=0x1c;
sfrb EEDR=0x1d;
sfrb EEARL=0x1e;
sfrb EEARH=0x1f;
sfrw EEAR=0x1e;
sfrb UBRRH=0x20;
sfrb UCSRC=0X20;
sfrb WDTCR=0x21;
sfrb ASSR=0x22;
sfrb OCR2=0x23;
sfrb TCNT2=0x24;
sfrb TCCR2=0x25;
sfrb ICR1L=0x26;
sfrb ICR1H=0x27;
sfrb OCR1BL=0x28;
sfrb OCR1BH=0x29;
sfrw OCR1B=0x28;
sfrb OCR1AL=0x2a;
sfrb OCR1AH=0x2b;
sfrw OCR1A=0x2a;
sfrb TCNT1L=0x2c;
sfrb TCNT1H=0x2d;
sfrw TCNT1=0x2c;
sfrb TCCR1B=0x2e;
sfrb TCCR1A=0x2f;
sfrb SFIOR=0x30;
sfrb OSCCAL=0x31;
sfrb TCNT0=0x32;
sfrb TCCR0=0x33;
sfrb MCUCSR=0x34;
sfrb MCUCR=0x35;
sfrb TWCR=0x36;
sfrb SPMCR=0x37;
sfrb TIFR=0x38;
sfrb TIMSK=0x39;
sfrb GIFR=0x3a;
sfrb GICR=0x3b;
sfrb OCR0=0X3c;
sfrb SPL=0x3d;
sfrb SPH=0x3e;
sfrb SREG=0x3f;
#pragma used-
#asm
#ifndef __SLEEP_DEFINED__
#define __SLEEP_DEFINED__
.EQU __se_bit=0x80
.EQU __sm_mask=0x70
.EQU __sm_powerdown=0x20
.EQU __sm_powersave=0x30
.EQU __sm_standby=0x60
.EQU __sm_ext_standby=0x70
.EQU __sm_adc_noise_red=0x10
.SET power_ctrl_reg=mcucr
#endif
#endasm
#pragma used+
void delay_us(unsigned int n);
void delay_ms(unsigned int n);
#pragma used-
#pragma used+
char *strcat(char *str1,char *str2);
char *strcatf(char *str1,char flash *str2);
char *strchr(char *str,char c);
signed char strcmp(char *str1,char *str2);
signed char strcmpf(char *str1,char flash *str2);
char *strcpy(char *dest,char *src);
char *strcpyf(char *dest,char flash *src);
unsigned int strlenf(char flash *str);
char *strncat(char *str1,char *str2,unsigned char n);
char *strncatf(char *str1,char flash *str2,unsigned char n);
signed char strncmp(char *str1,char *str2,unsigned char n);
signed char strncmpf(char *str1,char flash *str2,unsigned char n);
char *strncpy(char *dest,char *src,unsigned char n);
char *strncpyf(char *dest,char flash *src,unsigned char n);
char *strpbrk(char *str,char *set);
char *strpbrkf(char *str,char flash *set);
char *strrchr(char *str,char c);
char *strrpbrk(char *str,char *set);
char *strrpbrkf(char *str,char flash *set);
char *strstr(char *str1,char *str2);
char *strstrf(char *str1,char flash *str2);
char *strtok(char *str1,char flash *str2);
unsigned int strlen(char *str);
void *memccpy(void *dest,void *src,char c,unsigned n);
void *memchr(void *buf,unsigned char c,unsigned n);
signed char memcmp(void *buf1,void *buf2,unsigned n);
signed char memcmpf(void *buf1,void flash *buf2,unsigned n);
void *memcpy(void *dest,void *src,unsigned n);
void *memcpyf(void *dest,void flash *src,unsigned n);
void *memmove(void *dest,void *src,unsigned n);
void *memset(void *buf,unsigned char c,unsigned n);
unsigned int strcspn(char *str,char *set);
unsigned int strcspnf(char *str,char flash *set);
int strpos(char *str,char c);
int strrpos(char *str,char c);
unsigned int strspn(char *str,char *set);
unsigned int strspnf(char *str,char flash *set);
#pragma used-
#pragma library string.lib
typedef char *va_list;
#pragma used+
char getchar(void);
void putchar(char c);
void puts(char *str);
void putsf(char flash *str);
char *gets(char *str,unsigned int len);
void printf(char flash *fmtstr,...);
void sprintf(char *str, char flash *fmtstr,...);
void snprintf(char *str, unsigned int size, char flash *fmtstr,...);
void vprintf (char flash * fmtstr, va_list argptr);
void vsprintf (char *str, char flash * fmtstr, va_list argptr);
void vsnprintf (char *str, unsigned int size, char flash * fmtstr, va_list argptr);
signed char scanf(char flash *fmtstr,...);
signed char sscanf(char *str, char flash *fmtstr,...);
#pragma used-
#pragma library stdio.lib
typedef enum
{
CLEAR_LCD = 0x01,
RETURN_TO_HOME = 0x02,
ENTRY_LEFT = 0x04,
ENTRY_RIGHT = 0x06,
LCD_ON = 0x0C,
BLINK_CHAR_ON = 0x0D,
CURSOR_ON = 0x0E,
BLINK_CURSOR_ON = 0x0F,
SHIFT_CURSOR_LEFT = 0x10,
SHIFT_CURSOR_RIGHT = 0x14,
SHIFT_DISPLAY_LEFT = 0x18,
SHIFT_DISPLAY_RIGHT = 0x1C,
MODE_8_BITS = 0x38,
MODE_4_BITS = 0x22,
MODE_2_LINES = 0x28
} HD44780_CMD_t;
#pragma used+
extern const unsigned char rowAdress[4];
#pragma used-
#pragma used+
void LCD_Init(void);
void LCD_SendNibble(unsigned char data);
void LCD_SendByte(unsigned char data);
unsigned char LCD_ReadByte(void);
void LCD_WaitBusyFlag(void);
void LCD_SendCharLine(unsigned char character, unsigned char repetition, HD44780_CMD_t direction,
unsigned char speed);
void LCD_SendString_S(unsigned char *str);
void LCD_SendString_F(unsigned char flash *str);
void LCD_SendRunLine(flash unsigned char *str, unsigned char line, unsigned char repetition,
unsigned char speed);
void LCD_SendTwoRunLines(flash unsigned char *str1, unsigned char line1, flash unsigned char *str2,
unsigned char line2, unsigned char repetition, unsigned char speed);
void LCD_WriteMyChar(unsigned char flash *data, unsigned char adress);
#pragma used-
#pragma used+
const unsigned char rowAdress[4] = {0x80, 0xC0, 0x94, 0xD4};
#pragma used-
void LCD_SendNibble (unsigned char data)
{
PORTB &= ~(1 << 1) ;
PORTB |= (1 << 0) ;
delay_us(10);
PORTB = (data & 0xF0 );
PORTB &= ~(1 << 0) ;
delay_ms(1);
}
void LCD_SendByte (unsigned char data)
{
PORTB |= (1 << 0) ;
PORTB &= ~0xF0 ;
PORTB |= (data >> 4);
PORTB &= ~(1 << 0) ;
delay_us(10);
PORTB |= (1 << 0) ;
PORTB &= ~0xF0 ;
PORTB |= (data & 0xF0 );
PORTB &= ~(1 << 0) ;
delay_us(100);
}
void LCD_SendString_S (unsigned char *str)
{
while(*str != 0)
{
PORTB |= (1 << 1) ; LCD_SendByte(*str);
str++;
}
}
void LCD_SendString_F (unsigned char flash *str)
{
while(*str != 0)
{
PORTB |= (1 << 1) ; LCD_SendByte(*str);
str++;
}
}
void LCD_SendCharLine (unsigned char character, unsigned char repetition, HD44780_CMD_t direction,
unsigned char speed)
{
unsigned char i;
PORTB &= ~(1 << 1) ; LCD_SendByte(direction);
for(i=0; i<(repetition + 1); i++)
{
PORTB |= (1 << 1) ; LCD_SendByte(character);
if(speed > 0)
{
delay_ms(speed);
}
}
PORTB &= ~(1 << 1) ; LCD_SendByte(ENTRY_RIGHT);
}
void LCD_SendRunLine (flash unsigned char *str, unsigned char line, unsigned char repetition, unsigned char speed)
{
unsigned char i, x, y;
unsigned char strSize = strlenf(str);
for(i=0; i<repetition; i++)
{
for(x=0; x<((strSize - 20 + 1) + (20 * 2)); x++)
{
PORTB &= ~(1 << 1) ; LCD_SendByte(rowAdress[line-1] + 0); ;
for(y=0; y<20 ; y++)
{
if((x + y < 20 ) || (x + y > strSize + 20 ))
{
PORTB |= (1 << 1) ; LCD_SendByte(' ');
}
else
{
PORTB |= (1 << 1) ; LCD_SendByte(str[x + y - 20 ]);
}
}
delay_ms(speed);
}
}
}
void LCD_SendTwoRunLines (flash unsigned char *str1, unsigned char line1, flash unsigned char *str2,
unsigned char line2, unsigned char repetition, unsigned char speed)
{
unsigned char i, j, k1, k2;
unsigned char str1Size;
unsigned char str2Size;
unsigned char strSize;
str1Size = strlenf(str1);
str2Size = strlenf(str2);
if(str1Size > str2Size)
{
strSize = str1Size;
}
else
{
strSize = str2Size;
}
for(i = 0; i < repetition; i++)
{
for(j=0; j<((strSize - 20 + 1) + (20 * 2)); j++)
{
PORTB &= ~(1 << 1) ; LCD_SendByte(rowAdress[line1-1] + 0); ;
for(k1=0; k1<20 ; k1++)
{
if((j + k1 < 20 ) || (j + k1 > str1Size + 20 ))
{
PORTB |= (1 << 1) ; LCD_SendByte(' ');
}
else
{
PORTB |= (1 << 1) ; LCD_SendByte(str1[j+k1-20 ]);
}
}
PORTB &= ~(1 << 1) ; LCD_SendByte(rowAdress[line2-1] + 0); ;
for(k2=0; k2<20 ; k2++)
{
if((j + k2 < 20 ) || (j + k2 > str2Size + 20 ))
{
PORTB |= (1 << 1) ; LCD_SendByte(' ');
}
else
{
PORTB |= (1 << 1) ; LCD_SendByte(str2[j+k2-20 ]);
}
}
delay_ms(speed);
}
}
}
void LCD_WriteMyChar (unsigned char flash *data, unsigned char adress)
{
unsigned char i;
adress = (0x40 + (adress * 8));
for(i=0; i<8; i++)
{
PORTB &= ~(1 << 1) ; LCD_SendByte(adress);
PORTB |= (1 << 1) ; LCD_SendByte(*data);
adress++;
data++;
}
}
void LCD_Init (void)
{
DDRB |= (0xF0 | (1 << 0) | (1 << 1) );
PORTB &= ~(1 << 0) ;
delay_ms(50);
LCD_SendNibble(MODE_8_BITS);
delay_ms(100);
LCD_SendNibble(MODE_8_BITS);
delay_ms(100);
LCD_SendNibble(MODE_8_BITS);
delay_ms(100);
LCD_SendNibble(MODE_4_BITS);
delay_ms(100);
PORTB &= ~(1 << 1) ; LCD_SendByte(MODE_2_LINES);
delay_ms(100);
PORTB &= ~(1 << 1) ; LCD_SendByte(ENTRY_RIGHT);
delay_ms(100);
PORTB &= ~(1 << 1) ; LCD_SendByte(LCD_ON);
delay_ms(100);
PORTB &= ~(1 << 1) ; LCD_SendByte(CLEAR_LCD); delay_ms(2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -