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

📄 lcddriver._c

📁 采用Mega16+VS1011B+SD卡制作的Mp3
💻 _C
字号:
//*********************************************
 //液晶驱动.C
 //MCU:AVR_MEGA16L ,晶振频率:8.0 MHz
 //LCD:OCM12864-9 ,并口LCD
 //制作人:平顶山工学院计算机系,郭猛
//**********************************************
# include "iom16v.h"
# include "macros.h"
# include "FontModel.h"
# include "LCDFun.h"

//延时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,背光显示开;
{
 	SETDDRC(LCD_AK);
	if(OnOff) CLRPORTC(LCD_AK); else SETPORTC(LCD_AK);
}

//=====忙检测=================
void check_busy(void)
{
  uchar read_data=0xFF;
  SETDDRD();//要输出LCD_DATA_OUT
  LCD_DATA_OUT=0xFF;
  CLRPORTC(LCD_RS);
  SETPORTC(LCD_RW);       //读命令
  CLRPORTC(LCD_CS1);      //片使能
  while((read_data&0x80)==0x80)
  {
    SETPORTC(LCD_E);
    ;
	SETPORTD();
	CLRDDRD();//要输入LCD_DATA_IN
	SETPORTD();
	;
    read_data=LCD_DATA_IN;	
    CLRPORTC(LCD_E);
  }
  CLRPORTC(LCD_E); 
  SETPORTC(LCD_CS1);      //片禁能 
}
//=====写命令到寄存器=========
void send_cmd(uchar cmd)
{
  check_busy();
  CLRPORTC(LCD_RS);
  CLRPORTC(LCD_RW);               //写命令
  CLRPORTC(LCD_CS1);              //片使能
  SETDDRD();					  //要输出LCD_DATA_OUT
  LCD_DATA_OUT=cmd;
  SETPORTC(LCD_E);
  ;
  CLRPORTC(LCD_E);
  ;
  SETPORTC(LCD_CS1);              //片禁能 
}
//=====写数据到DDRAM=========
void send_dat(uchar dat)
{
  check_busy();
  SETPORTC(LCD_RS);
  CLRPORTC(LCD_RW);               //写数据
  CLRPORTC(LCD_CS1);              //片使能
  SETDDRD();					  //要输出LCD_DATA_OUT
  LCD_DATA_OUT=dat;
  SETPORTC(LCD_E);
  ;
  CLRPORTC(LCD_E);
  ;
  SETPORTC(LCD_CS1);              //片禁能 
}//=======初始化==============
void LCD_Ini(void)
{
  //控制端口设置为输出:
  DDRC=0xFF;;
  SETPORTC(LCD_RES);
  CLRPORTC(LCD_E);
  Delay(50);
  send_cmd(LCD_ADC_NORMAL);
  send_cmd(LCD_COMMON_REVERSE);
  send_cmd(LCD_BIAS_1DIV9);
  send_cmd(LCD_POWER_CONTROL+4);
  send_cmd(LCD_POWER_CONTROL+6); 
  send_cmd(LCD_POWER_CONTROL+7);
  send_cmd(LCD_RESISTOR_RATIO+5);
  send_cmd(LCD_ELEC_VOLUME_SET);
  send_cmd(0x14); //0X14
  send_cmd(LCD_ON);
  send_cmd(LCD_RMW);
  send_cmd(LCD_START_LINE_SET);
}
//=======写页地址==============
void Set_Page_Address(unsigned char dat)
{
    send_cmd(LCD_PAGE_SET|dat);
}
//=======写列地址==============
void Set_Colume_Address(unsigned char dat)
{
    unsigned char tmp;
	tmp=dat>>4;
    send_cmd(LCD_COLUME_SET_H|tmp);  //送列地址高三位
	tmp=0x0f&dat; 
    send_cmd(tmp);       //送列地址低四位
}

//在指定的位置显示1个ASCII码字符
//h,l:行位置与列位置
//Asc:字符的ASC值,注意ASC字符为可显示字符(ASCII>=0x20)
void PrintOneASCII(uchar h,uchar l,uchar Asc)
{
  uchar Tmp,j;
  Set_Page_Address(h);
  Set_Colume_Address(l);
  if (Asc>=0x20)  Tmp=Asc-0x20;else Tmp=0;
  for(j=0;j<8;j++)
  {
    send_dat(Ascii[Tmp][j]);
  }
}

void ClearLCD(void)	 //LCD清屏
{
  uchar i,j;
  for(i=0; i<9; i++)       //clear page 0~8
  {
     Set_Page_Address(i);
  	 Set_Colume_Address(0);
  	 for(j=0; j<132; j++)     //clear colum
  	 {      
   	    send_dat(0);     
  	 }
   }
}

//=======显示电池电量============
void Display_BattVol(uchar const *pic,uchar Vol)
{
  unsigned char j;
  Set_Page_Address(7);	   	   //LCD的左下角显示电池电量
  Set_Colume_Address(0x00);
  for(j=0;j<0x10;j++)	   	   //16列
  {
     send_dat(*(pic+0x10*Vol+j));
  }
  if(Vol==0) 
  {
     PrintConstAscStr(7,16,Menustr6[5],13)
  }
}

//=======显示图形===============
void Display_Picture(uchar const *pic)
{
  unsigned char i,j;
  for(i=0;i<8;i++)
  {
	Set_Page_Address(i);
    Set_Colume_Address(0x00);
    for(j=0;j<0x80;j++)
    {
       send_dat(*(pic+0x80*i+j));
	}
  }
}

//在指定位置显示指定长度的ASCII字符串
//h,l:行位置与列位置
//str:字符串
//Len:字符串长度,以字节为单位
void PrintConstAscStr(uchar h,uchar l,uchar const *str,uchar Len)	
{
    uchar i,Tx,Ty;
	Ty=h;Tx=l;
	for(i=0;i<Len;i++)
	{
	 	PrintOneASCII(Ty,Tx,str[i]);
		Tx+=8;
		if (Tx>=128) { Ty=(Ty+1)&0x07;Tx=0; }
	}
}

//在指定位置显示指定长度的ASCII字符串
//h,l:行位置与列位置
//str:字符串
//Len:字符串长度,以字节为单位
void PrintAscStr(uchar h,uchar l,uchar *str,uchar Len)	
{
    uchar i,Tx,Ty;
	Ty=h;Tx=l;
	for(i=0;i<Len;i++)
	{
	 	PrintOneASCII(Ty,Tx,str[i]);
		Tx+=8;
		if (Tx>=128) { Ty=(Ty+1)&0x07;Tx=0; }
	}
}

//在指定的位置显示1个16*16中文字符
//h,l:行位置与列位置
//hzm:指向汉字字型数据的指针
void PrintOneHZ(uchar h,uchar l,unsigned char *hzm)
{
  uchar i,Tmp_x,Tmp_y,LCD_DAT;
  if(h<=6 && h>=0 && l>=0 && l<=112)  //检查汉字能否正常显示出来
  {
    /*	for(i=0;i<16;i++)	//竖字
	{
		Tmp_x=h;Tmp_y=l+i;
		Set_Page_Address(Tmp_x);
        Set_Colume_Address(Tmp_y);
		LCD_DAT=*(hzm+(i<<1));
		send_dat(LCD_DAT);
		Set_Page_Address(Tmp_x-1);
        Set_Colume_Address(Tmp_y);
		LCD_DAT=*(hzm+(i<<1)+1);
		send_dat(LCD_DAT);
	}	*/
	Set_Page_Address(h);
    Set_Colume_Address(l);
	/*先显示汉字上半部分*/
	for(i=0;i<8;i++) send_dat(*(hzm+0+i));
	for(i=0;i<8;i++) send_dat(*(hzm+8+i));
	/*再显示汉字下半部分*/
	Set_Page_Address(h+1);
    Set_Colume_Address(l);
	for(i=0;i<8;i++) send_dat(*(hzm+16+i));
	for(i=0;i<8;i++) send_dat(*(hzm+24+i));
  }
}

⌨️ 快捷键说明

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