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

📄 lcd12864.c

📁 将UCOSII移植到AT91SAM7a3上
💻 C
字号:
#include "lcd12864.h"
#include "Board.h"

char L_lcd=0,R_lcd=0;

const int LCD_MASK_DATA_SZ[8]= {LCD_DB0,LCD_DB1,LCD_DB2,LCD_DB3,LCD_DB4,LCD_DB5,LCD_DB6,LCD_DB7};

///////////////////////////////////////////////////////////////////////
//软件延时1
//////////////////////////////////////////////////////////////////////
void wait( void )//1ms
{
  unsigned int i;
 for(i= 0; i<MCKKHz/100;i++) {;}//大约1ms

}

///////////////////////////////////////////////////////////////////////
//字节高低变换(预留)
//////////////////////////////////////////////////////////////////////
unsigned int char_change(unsigned char a)
{
  unsigned int i, b=0x00,c=0x01,d=0x80;

  for(i=8;i>0;i--)
  {
    if((a&c)!=0)
     {
      b=(b|d);
     }
    c=c<<1;
    d=d>>1;
  }
  return b;
}

///////////////////////////////////////////////////////////////////////
//LCD初始化
//////////////////////////////////////////////////////////////////////
void lcd_init(void)
{
   AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOB );//使能外设时钟
   //AT91F_PIO_MultiDriverEnable(AT91C_BASE_PIOB,LCD_MASK);

   AT91F_PIO_CfgOpendrain(AT91C_BASE_PIOB,LCD_MASK);   //将于LCD相联的I/O口配置为开路输出
   AT91F_PIO_CfgPullup(AT91C_BASE_PIOB,LCD_MASK);  //禁止上拉,LCD工作在5V状态!!!
   AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, LCD_MASK);     //配置输出

   //AT91F_PIO_CfgDirectDrive(AT91C_BASE_PIOB, LCD_MASK_DATA);//配置并行输出
   //AT91F_PIO_CfgPullup(AT91C_BASE_PIOB, LCD_MASK_COM);

   AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, LCD_MASK);//清除I/O

   //LCD复位,利用I/0口控制
   AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,LCD_RET);
   wait();
   AT91F_PIO_SetOutput(AT91C_BASE_PIOB,LCD_RET);
   wait();
}


///////////////////////////////////////////////////////////////////////
//判断LCD是否空闲或复位
//////////////////////////////////////////////////////////////////////
void check_busy(void)
{

   AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, LCD_E);
   wait();

   AT91F_PIO_SetOutput(AT91C_BASE_PIOB, LCD_CS1|LCD_CS2);
   AT91F_PIO_SetOutput(AT91C_BASE_PIOB, LCD_RW);
   AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,LCD_DI);

   AT91F_PIO_CfgPullup(AT91C_BASE_PIOB, LCD_MASK_DATA);
   AT91F_PIO_CfgInput( AT91C_BASE_PIOB, LCD_MASK_DATA);

 do{
    AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, LCD_E);
    wait();
    AT91F_PIO_SetOutput(AT91C_BASE_PIOB, LCD_E);
    wait();
    }
    while((AT91F_PIO_GetInput(AT91C_BASE_PIOB)&(LCD_DB7|LCD_DB4))!= 0);

   AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, LCD_E);
   wait();

   AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,LCD_CS1|LCD_CS2);
   if(L_lcd!=0)AT91F_PIO_SetOutput(AT91C_BASE_PIOB, LCD_CS1);
   if(R_lcd!=0)AT91F_PIO_SetOutput(AT91C_BASE_PIOB, LCD_CS2);

   AT91F_PIO_CfgOutput( AT91C_BASE_PIOB, LCD_MASK_DATA);
 }

///////////////////////////////////////////////////////////////////////
//LCD显示开关
//////////////////////////////////////////////////////////////////////
void LCD_on_off(unsigned char key)
{
  L_lcd=1;
  R_lcd=1;

  check_busy();

  AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,LCD_RW|LCD_DI);
  wait();
  AT91F_PIO_SetOutput(AT91C_BASE_PIOB, LCD_E);

  wait();
  if( key==1)
  {
  AT91F_PIO_SetOutput(AT91C_BASE_PIOB,LCD_DB5|LCD_DB4|LCD_DB3|LCD_DB2|LCD_DB1|LCD_DB0);
  AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,LCD_DB7|LCD_DB6);
}//on
else {
  AT91F_PIO_SetOutput(AT91C_BASE_PIOB,LCD_DB5|LCD_DB4|LCD_DB3|LCD_DB2|LCD_DB1);
  AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,LCD_DB7|LCD_DB6|LCD_DB0);
  }//off
  L_lcd=0;
  R_lcd=0;

  AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, LCD_E);
  wait();

}

///////////////////////////////////////////////////////////////////////
//LCD参数设置
//////////////////////////////////////////////////////////////////////
void LCD_Write_Com(unsigned char key)
{
  unsigned char i,b=0x1;
  check_busy();

  AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,LCD_RW|LCD_DI);
  wait();
  AT91F_PIO_SetOutput(AT91C_BASE_PIOB, LCD_E);

 wait();
 for(i=0;i<8;i++)
 {
   if((key&b)!=0)
   {
   AT91F_PIO_SetOutput(AT91C_BASE_PIOB,LCD_MASK_DATA_SZ[i]);
   }

   else
   AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,LCD_MASK_DATA_SZ[i]);
   b=b<<1;
 }
 wait();

 AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, LCD_E);
 wait();

}

///////////////////////////////////////////////////////////////////////
//写数据到LCD内存
//////////////////////////////////////////////////////////////////////
void LCD_Write_Dat(unsigned char key)
{
 unsigned char i,b=0x1;

 check_busy();

 AT91F_PIO_SetOutput(AT91C_BASE_PIOB,LCD_DI);
 AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,LCD_RW);

 wait();
 AT91F_PIO_SetOutput(AT91C_BASE_PIOB, LCD_E);


 wait();
 for(i=0;i<8;i++)
 {
   if((key&b)!=0)
   {
   AT91F_PIO_SetOutput(AT91C_BASE_PIOB,LCD_MASK_DATA_SZ[i]);
   }

   else
   AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,LCD_MASK_DATA_SZ[i]);
   b=b<<1;
 }
 wait();

 AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, LCD_E);
 wait();
}


///////////////////////////////////////////////////////////////////
//清LCD屏函数
///////////////////////////////////////////////////////////////////
void LCD_Clr(void)
 {
  unsigned char i,j;
  L_lcd=1;
  R_lcd=1;

  LCD_Write_Com(0xc0);
  LCD_Write_Com(0x3e);
  for(j=8;j>0;j--){
   LCD_Write_Com(0xb8|j);
   LCD_Write_Com(0x40);
   for(i=64;i>0;i--){
    LCD_Write_Dat(0x00);
    }
  }
  LCD_Write_Com(0x3f);
}


/////////////////////////////////////////////////////////////////////////
//显示8x8小写数字
//////////////////////////////////////////////////////////////////////////
void display8x8(unsigned char x,unsigned char y,const char *p){
 unsigned i;
 y<<=3;

 L_lcd=1;
 R_lcd=0;

 if(y&0x40){
 L_lcd=0;
 R_lcd=1;
  }
 y&=0x3f;
 LCD_Write_Com(0xb8|x);
 LCD_Write_Com(0x40|y);
 for(i=8;i>0;i--){
 LCD_Write_Dat(*p++);
 }
}
//////////////////////////////////////////////////////////////////////////
//显示8x16英文字母和数字
//////////////////////////////////////////////////////////////////////////
void display8x16(unsigned char x,unsigned char y,const char *p)
{
 unsigned char i;
 x<<=1;
 y<<=3;

 L_lcd=1;
 R_lcd=0;

 if(y&0x40){
 L_lcd=0;
 R_lcd=1;
  }
 y&=0x3f;
 LCD_Write_Com(0xb8|x);
 LCD_Write_Com(0x40|y);
 for(i=8;i>0;i--){
 LCD_Write_Dat(*p++);
 }
 LCD_Write_Com(0xb9|x);
 LCD_Write_Com(0x40|y);
 for(i=8;i>0;i--){
 LCD_Write_Dat(*p++);
 }
}
/////////////////////////////////////////////////////////////////////////
//显示汉字(16*16点阵字符汉字)
/////////////////////////////////////////////////////////////////////////
void display16x16(unsigned char x,unsigned char y,const char *p){
 unsigned char i;
 x<<=1;
 y<<=4;
 L_lcd=1;
 R_lcd=0;

 if(y&0x40){
 L_lcd=0;
 R_lcd=1;
  }

 y&=0x3f;
 LCD_Write_Com(0xb8|x);
 LCD_Write_Com(0x40|y);
 for(i=16;i>0;i--){
 LCD_Write_Dat(*p++);
 }
 LCD_Write_Com(0xb9|x);
 LCD_Write_Com(0x40|y);
 for(i=16;i>0;i--){
 LCD_Write_Dat(*p++);
 }
}

/////////////////////////////////////////////////////////////////////////
//显示图片---显示整屏
/////////////////////////////////////////////////////////////////////////
void displaypicture( const char *p)
{
  unsigned char x,y,a;

for(x=0;x<8;)
{

 LCD_Write_Com(0xb8|x);
 LCD_Write_Com(0x40|0);

for(y=0;y<64;y++)
  {  L_lcd=1;
     R_lcd=0;
     a=*p++;
   LCD_Write_Dat(a);
  // PrintkFoueByte(a);
   }
x++;//????????????//这点很重要!!不能放在FOR循环里面!!
LCD_Write_Com(0xb8|x);
LCD_Write_Com(0x40|0);
  for(y=64;y<128;y++)
    {
     L_lcd=0;
     R_lcd=1;
     a=*p++;
     LCD_Write_Dat(a);
   //  PrintkFoueByte(a);
   }

    }
}





⌨️ 快捷键说明

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