高级会员
- 积分
- 715
- 威望
- 395
- 贡献
- 200
- 兑换币
- 220
- 注册时间
- 2014-2-20
- 在线时间
- 60 小时
- 毕业学校
- 湖北工程学院
|
.h文件
#ifndef __LCD_19264_H
#define __LCD_19264_H
#include "sys.h"
//LCD12964控制端口
#define LCD_RS PBout(0)// PB.0
#define LCD_E PBout(1)// PB.1
#define LCD_CS1 PBout(2)// PB.2
#define LCD_RST PBout(3)// PB.3
#define LCD_CS2 PBout(4)// PB.4
#define LCD_CS3 PBout(5)// PB.5
#define LCD_RW PBout(6)// PB.6
//设置数据A0-A7
#define DATA_I0 GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7
//设置控制口
#define CTRL_I0 GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7
#define LCD_PAGE_ADDR 0xb8
#define LCD_COL_ADDR 0x40
void LCDPortSet(void); //LCD IO口配置
void LcdInit(void); //初始化程序
void LcdClear(void); //清屏程序
void WriteChr16x16(u8 pag,u8 col, u8 *chr); //写一个汉字
#endif
/***********************************************************
功能:LCD19264驱动程序
作者:HUATU
时间:2015-9-22
************************************************************/
#include "lcd_19264.h"
#include "delay.h"
//LCD IO口配置
/***********************************
说明:LCD12964 数据引脚与控制引脚分配
************************************/
void LCDPortSet(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE); //使能PA,B端口时钟
GPIO_InitStructure.GPIO_Pin = DATA_I0;//设置数据输入引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //PA0-7为数据输入
GPIO_InitStructure.GPIO_Pin = CTRL_I0; //端口配置,设置LCD控制引脚PB0-PB7
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置速度为50MHZ
GPIO_Init(GPIOB, &GPIO_InitStructure); //对应的是PB
GPIO_SetBits(GPIOB, GPIO_Pin_0);
GPIO_SetBits(GPIOB, GPIO_Pin_1);
GPIO_SetBits(GPIOB, GPIO_Pin_2);
GPIO_SetBits(GPIOB, GPIO_Pin_3);
GPIO_SetBits(GPIOB, GPIO_Pin_4);
GPIO_SetBits(GPIOB, GPIO_Pin_5);
GPIO_SetBits(GPIOB, GPIO_Pin_6);
}
//****************判忙********************
void wtcom(void)
{
LCD_RS=0;
LCD_RW=1;
LCD_E=1;
delay_us(20);
LCD_E=0;
delay_us(20);
}
/******************选择第1屏***********************/
void SelectChip1(void)
{
LCD_CS1=0;
LCD_CS2=1;
LCD_CS3=1;
wtcom();
}
/******************选择第2屏***********************/
void SelectChip2(void)
{
LCD_CS1=1;
LCD_CS2=0;
LCD_CS3=1;
wtcom();
}
/*****************选择第3屏**************************/
void SelectChip3(void)
{
LCD_CS1=1;
LCD_CS2=1;
LCD_CS3=0;
wtcom();
}
void WriteCommand(u8 cmd) //写命令
{
LCD_RS=0; //写命令
LCD_RW=0;
//LCD_DATA_OUT(cmd);
GPIO_Write(GPIOA,(0xff00&(cmd<<8))); //写数据到PA低八位
LCD_E=1;
delay_us(10);
LCD_E=0;
}
void WriteData(u8 dat) //写数据
{
LCD_RS=1;//写数据
LCD_RW=0;
//LCD_DATA_OUT(dat);//数据输出到数据口
GPIO_Write(GPIOA,(0xff00&(dat<<8))); //写数据到PA低八位
LCD_E=1; //写入到LCD
delay_us(10);
LCD_E=0;
}
void LcdClear(void) //清屏
{
u16 j = 0;
u16 k = 0;
LCD_CS1 = 0;
LCD_CS2 = 0;
LCD_CS3 = 0;
WriteCommand(LCD_PAGE_ADDR + 0);
WriteCommand(LCD_COL_ADDR + 0);
for(k=0;k<8;k++)
{
WriteCommand(LCD_PAGE_ADDR+k);
for(j=0;j<64;j++)
{
WriteData(0x00);
}
}
LCD_CS1 = 1;
LCD_CS2 = 1;
LCD_CS3 = 1;
}
void LcdInit(void) //初始化程序
{
LCD_RST = 0;
delay_us(20);
LCD_RST = 1;
delay_us(5);
LCD_CS1=0;
LCD_CS2=0;
LCD_CS3=0;
WriteCommand(0x3f); //设置开显示命令
WriteCommand(0xc0);//设置起始位置
LCD_CS1 = 1;
LCD_CS2 = 1;
LCD_CS3 = 1;
LcdClear(); //清屏
}
//写一个汉字
void WriteChr16x16(u8 pag,u8 col,u8 *chr)
{
u8 i = 0;
u8 j = 0;
u8 col_t = 0;
WriteCommand(0xc0);
col_t = col;
for(i=0;i<2;i++)
{
for(j=0;j<16;j++)
{
switch(col_t&0xc0)
{
case 0:
SelectChip1();
WriteCommand(LCD_PAGE_ADDR + pag + i);
WriteCommand(LCD_COL_ADDR + col_t - 0 );
WriteData(chr[16*i + j]);
col_t++;
break;
case 0x40:
SelectChip2();
WriteCommand(LCD_PAGE_ADDR + pag + i);
WriteCommand(LCD_COL_ADDR + col_t - 64);
WriteData(chr[16*i + j]);
col_t++;
break;
case 0x80:
SelectChip3();
WriteCommand(LCD_PAGE_ADDR + pag + i);
WriteCommand(LCD_COL_ADDR + col_t - 128);
WriteData(chr[16*i + j]);
col_t++;
break;
default: break;
}
}
col_t=col_t-16;
}
}
main.c 如下
while(1)
{
delay_ms(1000);
WriteChr16x16(0,i*16,table[0]);
}
|
|