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

📄 yejing.c

📁 自己改写的LCD驱动程序
💻 C
字号:
/**************************************************

the led should be set to two 8bytes lines with the first character of the first line at address 0x80
and the first character of the second line at address 0xC0 

ipbus = 2.4576M
cycle = 0.4u  	delaytwous(1) means delay 2us

MCU		DISPLAY
PORTC0 ->RS
PORTC1 ->R/W
PORTC2 ->E
MOSI   ->A
SPSCK  ->CLK
PORTC3 ->MR
+5V    ->B
SS     ->+5V
***************************************************/


#include <hidef.h>
#include "string.h"

#define  PORTA    (*((char *)0x0000))
#define  DDRA	  (*((char *)0x0004))
#define  PORTB    (*((char *)0x0001))
#define  DDRB     (*((char *)0x0005))
#define  PORTC    (*((char *)0x0002))
#define  DDRC     (*((char *)0x0006))

#define  SPCR     (*((char *)0x0010))
#define  SPSCR    (*((char *)0x0011))
#define  SPDR     (*((char *)0x0012))

#define  COMMANDOPRA	(PORTC &= 0xFE)
#define  DATAOPRA		(PORTC |= 0x01)
#define  READOPRA 		(PORTC |= 0x02)
#define  WRITEOPRA 		(PORTC &= 0xFD)
#define  EUP			(PORTC |= 0x04)
#define  EDOWN 			(PORTC &= 0xFB)
#define  MRUP			(PORTC |= 0x08)
#define  MRDOWN			(PORTC &= 0xF7)


unsigned char logo[17] = " _Tsinghua MAC_ ";

void delaytwous(int twous);  //in 2us
void spi_out(unsigned char onebyte);
void senddata(unsigned char onebyte);
void sendcommand(unsigned char onebyte);
void setledadd(unsigned int i);
void clrscreen(void);
void displaystring(unsigned char* buffer);
void cpuinit(void);
void displayinit(void);
void appinit(void);


/*delay function :the input argument = 1 means delay 2us*/
void delaytwous(int twous)  //in 2us
{
	int i;
	for (i=0;i<twous;i++)
	asm{
		nop
		nop
		};
	return;
}

/*use spi to send one char to led*/
void spi_out(unsigned char onebyte)
{
	do{
	}while((SPSCR & 0x08) == 0);
	SPDR = onebyte;
	do{
	}while((SPSCR & 0x08) == 0);
	return;
}

/*send data from mcu to led by spi*/
void senddata(unsigned char onebyte)
{
	DATAOPRA;
	WRITEOPRA;
	spi_out(onebyte);
	asm{
		nop
		nop
		};
	EUP;
	asm{
		nop
		nop
		};
	EDOWN;
}

/*send command from mcu to led by spi*/
void sendcommand(unsigned char onebyte)
{
	COMMANDOPRA;
	WRITEOPRA;
	spi_out(onebyte);
	asm{
		nop
		nop
		};
	EUP;
	asm{
		nop
		nop
		};
	EDOWN;
}
	
/*set the display char's address*/
void setledadd(unsigned int i)
{
	if (i == 0)
	{
		sendcommand(0x80);
		delaytwous(20);
	}	
	if (i == 8)
	{
		sendcommand(0xC0);
		delaytwous(20);
	}	
}

/*clear screen function by sendcommand 0x01 to led*/
void clrscreen(void)
{
	sendcommand(0x01);
	delaytwous(800);
}

/*display one string using the senddata function*/
void displaystring(unsigned char* buffer)
{
	unsigned int i, l;
	l = strlen(buffer);
	clrscreen();
	for (i = 0; i < l; i++)
	{
		setledadd(i);
		senddata(buffer[i]);
		delaytwous(20);
	}
}

/*initialize the portc and spi*/
void cpuinit(void)
{
	DDRC = 0xFF;
	MRUP;
	SPCR = 0x3A;
	SPSCR = 0x00;
}

/*initialize the led by sending special command to it*/
void displayinit(void)
{
	delaytwous(2300);
	sendcommand(0x38);//function set
	delaytwous(2300);
	sendcommand(0x38);
	delaytwous(50);
	sendcommand(0x38);
	delaytwous(20);
	sendcommand(0x38);
	delaytwous(20);
	sendcommand(0x38);
	delaytwous(20);

	sendcommand(0x08);//display off
	delaytwous(20);

	clrscreen();//clear screen

	sendcommand(0x06);//entry mode set
	delaytwous(20);

	sendcommand(0x14);//cursor or display shift
	delaytwous(20);

	sendcommand(0x0C);//display on/off control
	delaytwous(20);
}

/*application initialize using cpuinit and displayinit*/
void appinit(void)
{
	cpuinit();
	displayinit();
}

/*the main function*/
void main(void)
{
	appinit();
	displaystring(logo);
	while (1)
	{}
}

⌨️ 快捷键说明

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