STM32 驱动液晶LCD12864

#include "led.h"
#undef APP_DE
#include "hawk.h"
液晶采用晶联讯电子的JLX19264G-260

#define FEEDDOG() GPIOC->ODR^= GPIO_Pin_0




//LCD IO初始化
void LCD_Init(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA,ENABLE); //使能PB,端口时钟

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_11; //LED_BK,LED_RS
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
 GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8.11
 GPIO_SetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_11); //PA.8 输出高




 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;  
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
 GPIO_Init(GPIOC, &GPIO_InitStructure);  
 GPIO_SetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);  


 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //LED0-->PA.8 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
 GPIO_Init(GPIOD, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8
 //GPIO_SetBits(GPIOD,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //PA.8 输出高


 initial_lcd();
 clear_screen();
}


/******************************************************
函数功能:高低字节互换
************************************************/
u8 change_data(u8 temp)
{
 u8 temp1,i;
 temp1=0;
 for(i=0;i<8;i++)
 {
if((temp&0x01)==0x01)
{
temp1=temp1|0x01;

if(i<7)
{
    temp1=temp1<<1;
    temp= temp >>1;
}
 }
 return temp1;
}




//写命令 ok
void transfer_command(u8 DATA)
{
 u16 DATA1;
 
 DATA=change_data(DATA);
 DATA1=(u16)(DATA);
 DATA1=DATA1<<8;
 DATA1=DATA1&0xff00;
 LED_CS=0;
 LED_RS=0;
 LED_WR=0;
 LED_EN=0;
 //delay_ms(1);
 GPIOD->ODR=GPIOD->ODR|DATA1;
 LED_EN=1;
 //delay_ms(1);
 LED_EN=0;
 GPIOD->ODR=GPIOD->ODR&(~DATA1);
 //delay_ms(1);
 LED_CS=1;
}
//写数据
void transfer_data(u8 DATA)
{
 u16 DATA1;

 DATA=change_data(DATA);
 DATA1=(u16)(DATA);
 DATA1=DATA1<<8;
 DATA1=DATA1&0xff00;
 LED_CS=0;
 LED_RS=1;
 LED_WR=0;
 LED_EN=0;
 //delay_ms(1);
 GPIOD->ODR=GPIOD->ODR|DATA1;
 LED_EN=1;
 //delay_ms(1);
 LED_EN=0;
 GPIOD->ODR=GPIOD->ODR&(~DATA1);
 //delay_ms(1);
 LED_CS=1;
}


//设置地址
void lcd_address(u8 page,u8 column)
{
column=column-1;   //我们平常所说的第1列,在LCD驱动IC里是第0列。所以在这里减去1.
page=page-1;
transfer_command(0xb0+page);   //设置页地址。每页是8行。一个画面的64行被分成8个页。我们平常所说的第1页,在LCD驱动IC里是第0页,所以在这里减去1
transfer_command(((column>>4)&0x0f)+0x10); //设置列地址的高4位
transfer_command(column&0x0f); //设置列地址的低4位
}




//初始化
void initial_lcd(void)
{
 LED_RST=0;     //低电平复位
 delay_ms(500);
 LED_RST=1;     //复位完毕
 delay_ms(500);
 transfer_command(0xe2); //软复位
 delay_ms(500);
 transfer_command(0x2f);  //打开内部升压
 delay_ms(500);
 
 transfer_command(0x81);//微调对比度
 transfer_command(0x55);//微调对比度的值,可以设置范围0x00~0xff
 transfer_command(0xeb);//1/9偏压比
 transfer_command(0xc4);//行列扫描顺序,从上到下0xc2
 transfer_command(0xaf);//开显示
}




//全屏清屏
void clear_screen(void)
{
 u8 i,j;
 for(i=0;i<8;i++)
 {
  lcd_address(1+i,1);
  for(j=0;j<192;j++)
  {
   transfer_data(0x00);
   FEEDDOG();
  }
 }
}


//绘图19264
void display_graphic_192x64(u8 *dp)
{
 u8 i,j;
 for(i=0;i<8;i++)
 {
  lcd_address(i+1,1);
  for(j=0;j<192;j++)
  {
   FEEDDOG();
   transfer_data(*dp);
   dp++;
  }
 }
}
//显示16x16点阵图像、汉字、生僻字或16x16点阵的其他图标
void display_graphic_16x16(u8 page,u8 *dp)
{
 u8 k;
 for(k=1;k<=192;k++)
 {
FEEDDOG();
lcd_address(page,k);
transfer_data(*dp); //写数据到LCD,每写完一个8位的数据后列地址自动加1
dp++;
}
}


void display(u8 line)
{
 display_graphic_16x16(2*line+1,show_buff[0]);
 display_graphic_16x16(2*line+2,show_buff[1]);
}


void led_printf(char *buff)
{
 u8 i,j;
 u8 u8Char;
 u16 u16Char;
 u16Char = 0;
 u8Char = 0;
 for(i = 0;i<24;i++)
 {
  if((buff[i] & 0x80) != 0x80) //半角
  {
   u8Char = buff[i];
   u8Char = u8Char - 0x20;
   memcpy(&show_buff[0][i*8],&ascii_table_8x16[u8Char][0],8);
   memcpy(&show_buff[1][i*8],&ascii_table_8x16[u8Char][8],8);
   u16Char = 0;
  }
  else                        //全角
  {
   if(u16Char == 0)
   {
    u16Char = buff[i];
    u16Char = u16Char << 8;
   }
   else
   {
    u16Char = u16Char | (u16)(buff[i]);
    for(j=0;j<=HZ_NO;j++)
    {
     if(HZ_Lookup[j] == u16Char) break;
    }
    u8Char = j;
    memcpy(&show_buff[0][(i-1)*8],&HZ_table_16x16[u8Char][0],8);
    memcpy(&show_buff[0][(i-1)*8+8],&HZ_table_16x16[u8Char][8],8);
    memcpy(&show_buff[1][(i-1)*8],&HZ_table_16x16[u8Char][16],8);
    memcpy(&show_buff[1][(i-1)*8+8],&HZ_table_16x16[u8Char][24],8);
u16Char = 0;
   }
  }
 }
}


//数据反显
void changge_showbuff(void)
{
 u8 i;
 for(i=0;i<192;i++)
 {
  show_buff[0][i]=~show_buff[0][i];
show_buff[1][i]=~show_buff[1][i];
 }
}

你可能感兴趣的:(ARM的学习)