STM32F4LCD12864串行并行驱动程序合集.docx
《STM32F4LCD12864串行并行驱动程序合集.docx》由会员分享,可在线阅读,更多相关《STM32F4LCD12864串行并行驱动程序合集.docx(46页珍藏版)》请在冰豆网上搜索。
STM32F4LCD12864串行并行驱动程序合集
LCD12864.c文件:
/**********************************************************
*@Filename->lcd12864.c
*@Version->V1.1
*@Date->07-15-2017
*@Brief->LCD12864驱动函数
*适用于ST7920驱动芯片
V1.0
*@Revise->A、修正操作命令宏定义。
*@->B、显示字符串函数增加显示长度选择,即显示多少个ASCII可显示字符,汉字x2即可
*@->C、去掉显示数组函数,合并在字符串显示里
V1.1
*@Revise->A、增加STM32硬件SPI控制接口
*@->B、修正STM32并口控制LCD12864接口(但未测试)
**********************************************************/
#include"lcd12864.h"
/**********************************************************
自定义显示字符
**********************************************************/
#defineCGRAM_Value64//写入CGRAM数量
u8CGROM_Code[]={
//电量100Percent(add_h=0,add_l=0)
0x00,0x00,0x00,0x00,0xFF,0xFE,0x80,0x02,0xB6,0xDA,0xB6,0xDB,0xB6,0xDB,0xB6,0xDB,
0xB6,0xDB,0xB6,0xDB,0xB6,0xDB,0xB6,0xDA,0x80,0x02,0xFF,0xFE,0x00,0x00,0x00,0x00,
//月亮图形(add_h=0,add_l=2)
0x01,0x80,0x07,0x00,0x0E,0x00,0x1C,0x00,0x3C,0x00,0x78,0x00,0x78,0x00,0x78,0x00,
0x78,0x00,0x7C,0x00,0x7C,0x00,0x3E,0x00,0x1F,0x00,0x0F,0x80,0x03,0xF0,0x00,0x30,
//存储设备(add_h=0,add_l=4)
0x00,0x00,0x0F,0xF8,0x08,0x08,0x0B,0x68,0x08,0x08,0x3F,0xFE,0x3F,0xFE,0x3F,0xFE,
0x3F,0xFE,0x3F,0xFE,0x3F,0xFE,0x3F,0xFE,0x1F,0xFC,0x0F,0xF8,0x07,0xF0,0x03,0xE0,
//天线图形(add_h=0,add_l=6)
0x10,0x10,0x20,0x08,0x40,0x04,0x84,0x42,0x88,0x22,0x90,0x12,0x93,0x92,0x93,0x92,
0x91,0x12,0x88,0x22,0x85,0x42,0x41,0x04,0x21,0x08,0x11,0x10,0x03,0x80,0x03,0x80
//CD图形
//0xff,0xff,0xff,0xff,0xff,0xff,0xe3,0x07,0xc9,0xb3,0x9d,0xb9,0x9f,0xb9,0x9f,0xb9,
//0x9f,0xb9,0x9f,0xb9,0x9d,0xb9,0xc9,0xb3,0xe3,0x07,0xff,0xff,0xff,0xff,0xff,0xff,
//右指向手型
//0x00,0x00,0x1e,0x00,0x12,0x00,0x73,0xfc,0x52,0x02,0x52,0x1c,0x53,0xe0,0x52,0x10,
//0x53,0xe0,0x52,0x10,0x53,0xe0,0x52,0x10,0x73,0xe0,0x12,0x00,0x1e,0x00,0x00,0x00
//摄氏图形
//0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x70,0x14,0xd8,0x1d,0x88,0x01,0x80,0x01,0x80,
//0x01,0x80,0x01,0x80,0x01,0x88,0x00,0xc8,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,
//天线图形1
//0xff,0xff,0x80,0x01,0xbf,0xfd,0xdf,0xfb,0xec,0x37,0xf6,0x6f,0xfb,0xdf,0xfd,0xbf,
//0xfe,0x7f,0xfe,0x7f,0xfe,0x7f,0xfe,0x7f,0xfe,0x7f,0xfe,0x7f,0xfe,0x7f,0xff,0xff,
//蓝牙图形
//0x07,0xe0,0x0e,0x70,0x1e,0xb8,0x3e,0xdc,0x36,0xec,0x3a,0xdc,0x3c,0xbc,0x3e,0x7c,
//0x3e,0x7c,0x3c,0xbc,0x3a,0xdc,0x36,0xec,0x3e,0xdc,0x1e,0xb8,0x0e,0x70,0x07,0xe0,
};
u8constClearCGRAM[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
u8constSunIcon[]={
0x00,0x80,0x40,0x82,0x20,0x84,0x10,0x08,0x03,0xC0,0x07,0xE0,0x0F,0xF0,0xEF,0xF7,
0x0F,0xF0,0x0F,0xF0,0x07,0xE0,0x03,0xC0,0x10,0x08,0x20,0x84,0x40,0x82,0x00,0x80
};
u8constMoonIcon[]={
0x01,0x80,0x07,0x00,0x0E,0x00,0x1C,0x00,0x3C,0x00,0x78,0x00,0x78,0x00,0x78,0x00,
0x78,0x00,0x7C,0x00,0x7C,0x00,0x3E,0x00,0x1F,0x00,0x0F,0x80,0x03,0xF0,0x00,0x30,
};
u8constAntennaIcon[]={
0x10,0x10,0x20,0x08,0x40,0x04,0x84,0x42,0x88,0x22,0x90,0x12,0x93,0x92,0x93,0x92,
0x91,0x12,0x88,0x22,0x85,0x42,0x41,0x04,0x21,0x08,0x11,0x10,0x03,0x80,0x03,0x80
};
u8constWIFIConnection[]={
0x00,0x00,0x00,0x00,0x0F,0xF0,0x3F,0xFC,0x70,0x0E,0xE0,0x07,0x07,0xE0,0x0F,0xF0,
0x1C,0x38,0x00,0x00,0x01,0x80,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x00,0x00,0x00,0x00
};
u8constBattery_100Percent[]={
0x00,0x00,0x00,0x00,0xFF,0xFE,0x80,0x02,0xB6,0xDA,0xB6,0xDB,0xB6,0xDB,0xB6,0xDB,
0xB6,0xDB,0xB6,0xDB,0xB6,0xDB,0xB6,0xDA,0x80,0x02,0xFF,0xFE,0x00,0x00,0x00,0x00
};
u8constBattery_80Percent[]={
0x00,0x00,0x00,0x00,0xFF,0xFE,0x80,0x02,0xB6,0xC2,0xB6,0xC3,0xB6,0xC3,0xB6,0xC3,
0xB6,0xC3,0xB6,0xC3,0xB6,0xC3,0xB6,0xC2,0x80,0x02,0xFF,0xFE,0x00,0x00,0x00,0x00
};
u8constBattery_60Percent[]={
0x00,0x00,0x00,0x00,0xFF,0xFE,0x80,0x02,0xB6,0x02,0xB6,0x03,0xB6,0x03,0xB6,0x03,
0xB6,0x03,0xB6,0x03,0xB6,0x03,0xB6,0x02,0x80,0x02,0xFF,0xFE,0x00,0x00,0x00,0x00
};
u8constBattery_40Percent[]={
0x00,0x00,0x00,0x00,0xFF,0xFE,0x80,0x02,0xB0,0x02,0xB0,0x03,0xB0,0x03,0xB0,0x03,
0xB0,0x03,0xB0,0x03,0xB0,0x03,0xB0,0x02,0x80,0x02,0xFF,0xFE,0x00,0x00,0x00,0x00
};
u8constBattery_20Percent[]={
0x00,0x00,0x00,0x00,0xFF,0xFE,0x80,0x02,0x80,0x02,0x80,0x03,0x80,0x03,0x80,0x03,
0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x02,0x80,0x02,0xFF,0xFE,0x00,0x00,0x00,0x00
};
u8constASCII_Table[]={
0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,/*"0",0*/
0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,/*"1",1*/
0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x04,0x04,0x08,0x10,0x20,0x42,0x7E,0x00,0x00,/*"2",2*/
0x00,0x00,0x00,0x3C,0x42,0x42,0x04,0x18,0x04,0x02,0x02,0x42,0x44,0x38,0x00,0x00,/*"3",3*/
0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x24,0x44,0x44,0x7E,0x04,0x04,0x1E,0x00,0x00,/*"4",4*/
0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x58,0x64,0x02,0x02,0x42,0x44,0x38,0x00,0x00,/*"5",5*/
0x00,0x00,0x00,0x1C,0x24,0x40,0x40,0x58,0x64,0x42,0x42,0x42,0x24,0x18,0x00,0x00,/*"6",6*/
0x00,0x00,0x00,0x7E,0x44,0x44,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,/*"7",7*/
0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00,/*"8",8*/
0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x26,0x1A,0x02,0x02,0x24,0x38,0x00,0x00/*"9",9*/
};
u8LCD12864_LockedFlag;//LCD12864lockedflag
//=========================================================
voidLCD_delay_1us()
{
inti=200;//最小90可以稳定工作
while(i--);
}
voidLCD_delay_nus(intnus)
{
while(nus--)LCD_delay_1us();
}
#ifdefLCD_Work_Mode_Parallel//如果定义了,则使用并口工作模式
GPIO_InitTypeDefGPIOStru;//定义用于定义所以引脚为输出的变量
//=========================================================
/**********************************************************
*函数功能--->把所有数据端口初始化为推挽输出模式的函数。
*入口参数--->none
*返回数值--->none
*功能说明--->none
**********************************************************/
voidLCDDataBus_OUT(void)
{
RCC_APB2PeriphClockCmd(DataBusGPIOCLK,ENABLE);
GPIOStru.GPIO_Pin=DataBusPins;//LCD数据端口对应的引脚
GPIOStru.GPIO_Mode=GPIO_Mode_OUT;//普通输出模式
GPIOStru.GPIO_OType=GPIO_OType_PP;//推挽输出
GPIOStru.GPIO_Speed=GPIO_Speed_100MHz;//100MHz
GPIOStru.GPIO_PuPd=GPIO_PuPd_UP;//上拉
GPIO_Init(DataBusGPIO,&GPIOStru);
}
/**********************************************************
*函数功能--->把数据引脚初始化为浮空输入的函数
*入口参数--->none
*返回数值--->none
*功能说明--->none
**********************************************************/
voidLCDDataBus_IN(void)
{
RCC_APB2PeriphClockCmd(DataBusGPIOCLK,ENABLE);
GPIOStru.GPIO_Pin=DataBusPins;//LCD数据端口对应的引脚
GPIOStru.GPIO_Mode=GPIO_Mode_IN;//普通输入模式
GPIOStru.GPIO_OType=GPIO_OType_OD;//开漏模式
GPIOStru.GPIO_Speed=GPIO_Speed_100MHz;//100MHz
GPIOStru.GPIO_PuPd=GPIO_PuPd_NOPULL;//无上下拉
GPIO_Init(DataBusGPIO,&GPIOStru);
}
/**********************************************************
*函数功能--->LCD12864判断忙
*入口参数--->none
*返回数值--->none
*功能说明--->none
**********************************************************/
voidLCD_Check_Busy(void)
{
staticu16busytimeout;//忙超时
//=====================================================
LCDDataBus_IN();//把数据引脚定义为浮空输入
do
{
busytimeout++;
if(busytimeout>300)break;
LCD_RS=0;
LCD_Delay();
LCD_RW=1;
LCD_Delay();
LCD_EN=1;
LCD_Delay();
}while(GPIO_ReadInputData(DataBusGPIO)&DataBusPin7);//等待LCD忙完
LCD_EN=0;
LCDDataBus_OUT();//把数据引脚定义为输出
//=====================================================
if(busytimeout>=300)printf("LCDBusyTimeOut...\r\n");
busytimeout=0;
}
/**********************************************************
*函数功能--->LCD写入一个字节命令或者数据,判断忙标志(8位数据一次发送完毕)
*入口参数--->dat:
要写入的字节
*ord:
判断dat是命令还是数据依据,“0”为命令,“1”为数据
*返回数值--->none
*功能说明--->none
**********************************************************/
voidLCD_Write_Byte(u8dat,u8ord)
{
//=====================================================
LCD_Check_Busy();//判断是否在忙?
LCD_EN=0;
LCD_Delay();
LCD_RW=0;
LCD_Delay();
if(ord&0x01)LCD_RS=1;//放上数据或者命令判断位
elseLCD_RS=0;
LCD_EN=1;
LCD_Delay();
LCDWriteData(dat);//放入数据
LCD_Delay();
LCD_EN=0;
//=====================================================
}
//=========================================================
#else//没定义则使用串口通讯模式
#ifdefLCD_Work_Mode_HardSPI//串行模式-采用硬件SPI
//=========================================================
/**********************************************************
*函数功能--->初始化硬件SPI1模块,配置为主机模式
*入口参数--->none
*返回数值--->none
*功能说明--->none
**********************************************************/
voidSPI1_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
SPI_InitTypeDefSPI_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);//使能GPIOB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);//使能SPI1时钟
//GPIOB3,5初始化设置(仅使用SCK,MOSI引脚)
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_5;//PB3~5复用功能输出
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化
GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_SPI1);//PB3复用为SPI1(SCK)
//GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_SPI1);//PB4复用为SPI1(MISO)
GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_SPI1);//PB5复用为SPI1(MOSI)
//这里只针对SPI口初始化
RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE);//复位SPI1
RCC_APB2PeriphResetCmd(RCC_APB2Per