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

📄 lcd.c

📁 一个基于ATmega64、VS1003、SD卡的mp3播放程序
💻 C
字号:
#include "includes.h"
#include "LCD.h"
//液晶初始化寄存器地址
unsigned char reg[]={
	0x12,0x13,0x10,0x11,0x10,0x12,0x10,0x13,0x02,0x01,
	0x08,0x03,0x0b,0x21,0x30,0x31,0x32,0x33,0x34,0x35,
	0x36,0x37,0x38,0x39,0x40,0x41,0x42,0x43,0x44,0x45,
	0x07,0x07,0x07,0x07
};
//液晶初始化寄存器值
unsigned int reg_data[]={
	0x0009,0x133e,0x0604,0x0001,0x4634,0x0016,0x4730,0x313e,0x0700,0x011b,
	0x0202,0x1030,0x0070,0x0000,0x0303,0x0303,0x0303,0x0303,0x0404,0x0404,
	0x0404,0x0303,0x0000,0x0000,0x0000,0x0000,0xdb00,0x0000,0xaf00,0xdb00,
	0x0005,0x0025,0x0027,0x0037
};

//延时函数
void LCD_Delay(unsigned int i)
{
	unsigned int j;
	for(;i>0;i--)
		for(j=200;j>0;j--);
}
//写液晶
//comm为指令或数据选择,dat为数据
//
void wr_lcd(unsigned char comm,unsigned int dat)
{
	PORTD&=~(1<<rs);
	PORTD|=(comm<<rs);
	PORTC=dat;
	PORTA=dat>>8;
	PORTD&=~(1<<wr);
	PORTD|=(1<<wr);
}
//液晶初始化
void init_lcd()
{
	unsigned char i;
	PORTD&=~(1<<reset);
	LCD_Delay(10);
	PORTD|=(1<<reset);
	for(i=0;i<34;i++)
	{
		wr_lcd(0,reg[i]);
		wr_lcd(1,reg_data[i]);
		if(i==5)LCD_Delay(25);
		else if(i==29)LCD_Delay(220);
		else if(i==31||i==33)LCD_Delay(45);
	}
}

//液晶显示测试
void show_lcd()
{
	unsigned int i;
	PORTC = 0x00;
	DDRC  = 0xFF;
	PORTD = 0x00; 
	DDRD  = 0xFF;
	PORTA = 0x00;
	DDRA  = 0xFF;
	PORTD|=(1<<rd);
	init_lcd();
	wr_lcd(0,0x07);
	wr_lcd(1,0x0035);
	for(i=0;i<12907;i++){wr_lcd(0,0x22);wr_lcd(1,0x001f);}
	for(i=0;i<12907;i++){wr_lcd(0,0x22);wr_lcd(1,0x001f);}
	for(i=0;i<12906;i++){wr_lcd(0,0x22);wr_lcd(1,0x001f);}
	wr_lcd(0,0x07);
	wr_lcd(1,0x0037);

} 
//调节SPI,操作字库芯片
void ZK_Enable(void)
{
	SPCR=(1<<SPE)|(1<<MSTR);
	SPSR|=(1<<SPI2X);

}
//***************************************************
//函数名称:SD_SPI_WriteByte(unsigned char val)
//函数功能:SPI发送或读取一个字节
//输入:val:将发送的字节
//输出:读取到的一字节
//***************************************************
unsigned char ZK_WriteByte(unsigned char val)
{
	SPDR=val;
	while(!(SPSR&(1<<SPIF)));
	return SPDR;
}
//显示一个汉字,x,y为坐标,word为要显示汉字的GB码,color送颜色,back背景色
void LCD_Show_Word(unsigned char X,unsigned char Y,unsigned int word,unsigned int Color,unsigned int Back)
{
	unsigned char word_tab[32];
	unsigned char i,j,temp;
	unsigned long Address=0;
	PORTD&=~(1<<3);//下面是字库地址计算,是资料上的公式
	if((word>>8)>=0xA1 && (word>>8)<= 0xAB)
		Address =(unsigned long)(((word>>8)-0xA1)*94+((word&0xff)-0xA1))*32+ 0x2C9D0;
	else if((word>>8)>=0xB0 && (word>>8)<= 0xF7)
		Address = (unsigned long)(((word>>8)-0xB0)*94+((word&0xff)-0xA1)+846)*32+ 0x2C9D0;
	wr_lcd(0,0x21);
	wr_lcd(1,Y*256+X);
	ZK_WriteByte(0x0B);
	ZK_WriteByte((Address>>16)&0xff);
	ZK_WriteByte((Address>>8)&0xff);
	ZK_WriteByte((Address)&0xff);
	ZK_WriteByte(0xff);
	for(i=0;i<32;i++)word_tab[i]=ZK_WriteByte(0xff);
	PORTD|=(1<<3);
	for(i=0;i<32;i++)
	{
		temp=word_tab[i];
		for(j=0;j<8;j++)
		{
			if((temp&0x80)!=0){wr_lcd(0,0x22);wr_lcd(1,Color);}
			else {wr_lcd(0,0x22);wr_lcd(1,Back);}
			temp<<=1;
		}
		if(i%2)
		{
			Y++;
			wr_lcd(0,0x21);
			wr_lcd(1,Y*256+X);
		}
	}

}
//显示一字符,同上
void LCD_Show_Char(unsigned char X,unsigned char Y,unsigned char Char,unsigned int Color,unsigned int Back)
{
	unsigned char word_tab[16];
	unsigned char i,j,temp;
	unsigned long Address=0;
	PORTD&=~(1<<3);
	if(Char>=0x20 && Char<=0x7E)Address=(Char-0x20)*16+0x1DD780;
	wr_lcd(0,0x21);
	wr_lcd(1,Y*256+X);
	ZK_WriteByte(0x0B);
	ZK_WriteByte((Address>>16)&0xff);
	ZK_WriteByte((Address>>8)&0xff);
	ZK_WriteByte((Address)&0xff);
	ZK_WriteByte(0xff);
	for(i=0;i<16;i++)word_tab[i]=ZK_WriteByte(0xff);
	PORTD|=(1<<3);
	for(i=0;i<16;i++)
	{
		temp=word_tab[i];
		for(j=0;j<8;j++)
		{
			if((temp&0x80)!=0){wr_lcd(0,0x22);wr_lcd(1,Color);}
			else {wr_lcd(0,0x22);wr_lcd(1,Back);}
			temp<<=1;
		}
		Y++;
		wr_lcd(0,0x21);
		wr_lcd(1,Y*256+X);
	}
}



//显示一字符串,同上
void LCD_Show_String(unsigned char X,unsigned char Y, char str[],unsigned int Color,unsigned int Back)
{
	unsigned int i,j;
	for(i=0;str[i]!=0;i++)
	{
		if(str[i]>=0x20&&str[i]<=0x7e)
		{//字符
			if((X+8)>176){Y+=16;X=0;}
			if(Y>204){Y=0;while(PING&0x10);for(j=0;j<38720;j++){wr_lcd(0,0x22);wr_lcd(1,0x001f);}}
			LCD_Show_Char(X,Y,str[i],Color,Back);
			X+=8;
		}
		else if((str[i+1]>=0xa1)&&((str[i]>=0xA1&&str[i]<=0xAB)||(str[i]>=0xB0&&str[i]<=0xF7)))
		{//汉字
			if((X+16)>176){Y+=16;X=0;}
			if(Y>204){Y=0;while(PING&0x10);for(j=0;j<38720;j++){wr_lcd(0,0x22);wr_lcd(1,0x001f);}}
			LCD_Show_Word(X,Y,str[i]*256+str[i+1],Color,Back);
			i++;
			X+=16;
		}
		else if(str[i]==0x0d&&str[i+1]==0x0a)//换行
		{
			X=0;
			Y+=16;
			i++;
			if(Y>204){Y=0;while(PING&0x10);for(j=0;j<38720;j++){wr_lcd(0,0x22);wr_lcd(1,0x001f);}}
		}
		else if(str[i]>0x7E)
		{//这个记不得了,好像是其他符号吧
			if((X+8)>175){Y+=16;X=0;}
			if(Y>204){Y=0;while(PING&0x10);for(j=0;j<38720;j++){wr_lcd(0,0x22);wr_lcd(1,0x001f);}}
			LCD_Show_Char(X,Y,0x20,Color,Back);
			X+=8;
		}

	}
}





⌨️ 快捷键说明

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