STM32 驅動液晶LCD12864
#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];
}
}