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

📄 lcddrive._c

📁 AVR-MEGA8单片机中使用AD转换的一个例子
💻 _C
字号:
//*********************************************
 //MCU:ATMEL AVR MEGA8 ,晶振频率:8MHz,频率越高,播放Mp3越流畅
 //LCD:128*64
 //LCD型号:FYD12864-0402B
 //制作人:平顶山工学院计算机系,郭猛
//*********************************************
# include "iom8v.h"
# include "macros.h"
#include <math.h>
#include "FontModel.h"
#include "LCDFun.h"

//LCD驱动用到的变量:
uchar LCD_COM;		//LCD控制命令字
uchar LCD_DAT;		//LCD数据
//绘图方式下的坐标:
uchar AC_X;			//X坐标
uchar AC_Y;			//Y坐标

//延时1ms
void Delay_1ms(void)
{	 
	 unsigned int j;
	 for(j=1;j<(unsigned int)(XTAL*143-2);j++) NOP();
}
/*******************************************延时子程序**********************************************/
///////////////////n的取值最好不要超过500!!!
void Delay(unsigned int n)
{
	uchar i,j;
	for(i=0;i<(uchar)(n/100);i++)
	  for(j=0;j<100;j++) Delay_1ms();   //100mS
}

//*************************************LCD背光控制***************************************
void LCD_AK_Control(uchar OnOff)			//On0FF=1,背光显示开;
{
	if(OnOff) CLRPORT(LCD_AK); else SETPORT(LCD_AK);
}

void SendToSID(unsigned char bitNum, unsigned char dat)//向串行数据线发送指定位数一个数据
{
	unsigned char i,bitcode;
	for(i=0;i<bitNum;i++)
	{
	 	bitcode=dat & 0x80;
		if(bitcode!=0) SETPORT(SID); else CLRPORT(SID); //SID = dat & 0x80;
		dat = dat << 1;
		CLRPORT(SCLK); 	  	 	//SCLK = 0;
		SETPORT(SCLK);	 		//SCLK = 1;
		CLRPORT(SCLK);			//SCLK = 0; 
	}
}

//*************************************写入LCD控制字******************************
void Write_LCD_Com(void)						//对LCD写入控制命令
{
	//	SynCode为同步码
	unsigned char SynCode;
	CLRPORT(CS);	//CS=0;
	SETPORT(CS);	//CS=1;

	SynCode = 0xFF;	 		 	//同步码
	SendToSID(5,SynCode);

	SynCode = 0x00;	 		 	//写入代码RW,RS,0,3位代码
	SendToSID(3,SynCode);

	SynCode = LCD_COM & 0xF0;	//写入代码COM数据的高四位 要发送的数据格式是XXXX0000
	SendToSID(8,SynCode);

	SynCode = LCD_COM & 0x0F;	//写入代码COM数据的低四位	0000XXXX
	SynCode = SynCode<<4;    	//要发送的数据格式是XXXX0000
	SendToSID(8,SynCode);
	Delay_1ms() ;	//必要的延时
}

//*************************************写入LCD数据**********************************
void Write_LCD_Data(void)						//对LCD写入8位数据
{
	//	iSynCode为同步码计数器,同步码为5位,	SynCode为同步码
	unsigned char iSynCode,SynCode;
	uchar bitcode;
	CLRPORT(CS);	//CS=0;
	SETPORT(CS);	//CS=1;

	SynCode = 0xFF;	 //同步码
	SendToSID(5,SynCode);
	SynCode = 0x40;	 //写入代码RW,RS,0,3位代码
	SendToSID(3,SynCode);

	SynCode = LCD_DAT & 0xF0;	 //写入代码COM数据的高四位 要发送的数据格式是XXXX0000
	for(iSynCode=0;iSynCode<8;iSynCode++)
	{
		bitcode = SynCode & 0x80;
		if(bitcode!=0) SETPORT(SID); else CLRPORT(SID);//SID = bitcode;	
		SynCode = SynCode << 1;
		CLRPORT(SCLK); 	  	 	//SCLK = 0;
		SETPORT(SCLK);	 		//SCLK = 1;
		CLRPORT(SCLK);			//SCLK = 0; 
		
	}
	SynCode = LCD_DAT & 0x0F;	 //写入代码COM数据的低四位	0000XXXX
	SynCode = SynCode<<4;    //要发送的数据格式是XXXX0000
	for(iSynCode=0;iSynCode<8;iSynCode++)
	{
		bitcode = SynCode & 0x80;
		if(bitcode!=0) SETPORT(SID); else CLRPORT(SID);//SID = bitcode;	
		SynCode = SynCode << 1;
		CLRPORT(SCLK); 	  	 	//SCLK = 0;
		SETPORT(SCLK);	 		//SCLK = 1;
		CLRPORT(SCLK);			//SCLK = 0; 
	}
	Delay_1ms();
}

//*************************************LCD屏幕初始化**************************************
//LCD接口:
//CS    <==>PD5;
//SID   <==>PD6;
//SCLK  <==>PD7;
//LCD_AK<==>PD3;		//背光控制,=0时打开背光
void LCD_Ini(void)				//初始化,并进入文本模式				
{
	//LCD端口初始化,将PD7~PD5端口设置为输出方式
	DDRD|=0xE0;
	_NOP();

	LCD_COM =0x30;//功能设置为8BIT控制界面,基本指令集
	Write_LCD_Com();//调用写指令子程序
	Delay(5);//39uS
 
	LCD_COM =0x0C;//显示打开,光标关,反白不显示
	Write_LCD_Com();//调用写指令子程序
	Delay(5);//39uS

	LCD_COM =0x01;//清除屏幕显示,将DDRAM的地址计数器归零
	Write_LCD_Com();//调用写指令子程序
	Delay(5);//39uS

	LCD_COM =0x06;//DDRAM的地址计数器(AC)加1
	Write_LCD_Com();//调用写指令子程序
	Delay(5);//39uS

	AC_X=1;AC_Y=1;
}

void LCD_Contrl_Cursor(uchar ON)		//打开游标显示
{ 
	if (ON) LCD_COM =0x0F;else LCD_COM=0x0C;	//ON:显示打开,光标开,反白显示
	Write_LCD_Com();//调用写指令子程序
	Delay(5);//39uS
}

void DispSetCursor(uchar x,uchar y)	//设置光标到指定位置
//x:串首字符在LCD屏幕上列的位置(水平位置) 0<=x<=7  
//y:串首字符在LCD屏幕上行的位置(垂直位置) 0<=y<=3 
{
   LCD_COM=CharMap[y][x];		//查表得到DDRAM地址AC
   Write_LCD_Com();
}

void DispHalfWord(uchar x,uchar y,uchar HASC,uchar LASC)	//在指定位置处显示半角ASCII字符	
{	
	unsigned int HH;
	LCD_COM=CharMap[y][x];		//查表得到DDRAM地址AC
	Write_LCD_Com();
	
	LCD_DAT=HASC;
	Write_LCD_Data();	//显示ASCII字符
	LCD_DAT=LASC;
	Write_LCD_Data();	//显示ASCII字符
}

//**************************************在指定位置处打印ASCII字符串**********************************
//x:串首字符在LCD屏幕上列的位置(水平位置) 0<=x<=7  
//y:串首字符在LCD屏幕上行的位置(垂直位置) 0<=y<=3 
//*str:存放ASCII字符串的指针
void PrintS(uchar x,uchar y,uchar *str)		//在指定位置打印字符串
{
	uchar i,Tx,Ty;
//	EA=0;
	Ty=y;Tx=x;
	for(i=0;str[i]!='\0';i=i+2)
	{
		DispHalfWord(Tx,Ty,str[i],str[i+1]);
		Tx++;
		if (Tx>=8) { Ty=(Ty+1)&0x03;Tx=0; }
	}
//	EA=1;
}



//**************************************在指定位置打印指定长度字符串**********************************
//x:串首字符在LCD屏幕上列的位置(水平位置) 0<=x<=7  
//y:串首字符在LCD屏幕上行的位置(垂直位置) 0<=y<=3 
//*str:存放ASCII字符串的指针
//Len:字符串的长度,字节为单位
void PrintSLen(uchar x,uchar y,uchar *str,uchar Len)		//在指定位置打印字符串
{
	uchar i,Tx,Ty;
	Ty=y;Tx=x;
	for(i=0;i<Len;i=i+2)
	{
	 	if((Len-i)==1) DispHalfWord(Tx,Ty,str[i],'\0'); else DispHalfWord(Tx,Ty,str[i],str[i+1]);
		Tx++;
		if (Tx>=8) { Ty=(Ty+1)&0x03;Tx=0; }
	}
//	EA=1;
}


void DisplayNumChar(unsigned char l,unsigned char h,unsigned int ll)
{
  unsigned char knnum,hunum,tnnum,srnum;  //百、十、个位
  knnum=ll/1000;
  hunum=ll/100-10*knnum; 	//百位
  srnum=ll%10;		//个位
  tnnum=(ll-knnum*1000-hunum*100)/10; //十位
  
  knnum+=0x30;hunum+=0x30;srnum+=0x30;tnnum+=0x30;
  DispHalfWord(l,h,knnum,hnnum);
  DispHalfWord(l+1,h,tnnum,snnum);
}

⌨️ 快捷键说明

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