STM32F4LCD12864串行并行驱动程序合集.docx

上传人:b****6 文档编号:6030113 上传时间:2023-01-03 格式:DOCX 页数:46 大小:31.14KB
下载 相关 举报
STM32F4LCD12864串行并行驱动程序合集.docx_第1页
第1页 / 共46页
STM32F4LCD12864串行并行驱动程序合集.docx_第2页
第2页 / 共46页
STM32F4LCD12864串行并行驱动程序合集.docx_第3页
第3页 / 共46页
STM32F4LCD12864串行并行驱动程序合集.docx_第4页
第4页 / 共46页
STM32F4LCD12864串行并行驱动程序合集.docx_第5页
第5页 / 共46页
点击查看更多>>
下载资源
资源描述

STM32F4LCD12864串行并行驱动程序合集.docx

《STM32F4LCD12864串行并行驱动程序合集.docx》由会员分享,可在线阅读,更多相关《STM32F4LCD12864串行并行驱动程序合集.docx(46页珍藏版)》请在冰豆网上搜索。

STM32F4LCD12864串行并行驱动程序合集.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 预防医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1