#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];
}
}
#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];
}
}