基于某STM32LCD12864驱动程序

合集下载

stm32-12864并行驱动程序

stm32-12864并行驱动程序

//////////////////////////////////////////////////////////////////////////////////stm32-12864并行驱动程序////////////////////////////////////////////////////#include "delay.h" //必须配合delay.c 和delay.h 文件使用,所以要包含delay.h。

#include "display12864.h"f/********** 以下是相关引脚定义。

**************/// A 口的#define DisIO GPIOE //定义12864 要使用的I/O 端口。

#define DisClk RCC_APB2Periph_GPIOE //定义12864 要使用的I/O 端口的时钟。

#define DataGPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7//定义12864 使用的数据引脚。

#define EN GPIO_Pin_10 //定义使能端使用的引脚/*********************************************/#define DisIOIO GPIOE //定义12864 要使用的I/O 端口。

#define DisClkIO RCC_APB2Periph_GPIOE //定义12864 要使用的I/O 端口的时钟。

#define RS #define RW GPIO_Pin_9GPIO_Pin_8/*光标定位函数定义结束。

*/#define x1 0x80#define x2 0x88#define y 0x80GPIO_InitTypeDef GPIOStru; //定义用于定义所以引脚为输出的变量。

LCD12864驱动程序(带字库的)

LCD12864驱动程序(带字库的)
/*void delayuS(uchar buf)
{
while(buf--);
}*/
/***********忙检测********************/
void Busy()
{
DataPort=0xFF;
RS=0;
RW=1;
while (1)
{
E =1;
if (P0^7==0) break;
}
E=0;
}
void main(void)
{
TMOD=0x01; ///选择定时器模式
TR0=1; //开中断,并允许T0中断
ET0=1;
EA=1; //总开关
Init_LCቤተ መጻሕፍቲ ባይዱ();
Clear_LCD();
while(1);
}
void t0(void) interrupt 1 using 0
{
//delay(100);
/*void Line_Num(uchar k)
{
//uint l;
if(k>=128&&k<=135)l=1;
if(k>135&&k<=143) l=3;
if(k>143&&k<=151) l=2;
if(k>151&&k<=159) l=4;
}*/
/*******************逐行显示***************************************/
void Write_Data(uchar Data)
{
Busy();
RS=1;
RW=0;

使用stm32 SPI总线控制LCD12864

使用stm32 SPI总线控制LCD12864

使用stm32 SPI总线控制LCD12864一、SPI初始化/****************************************************************************** ** Function Name : SPI1_Init* Description : Initializes the peripherals used by the SPI FLASH driver.* Input : None* Output : None* Return : None******************************************************************************* /void SPI1_Init(void){SPI_InitTypeDef SPI_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;/* Enable SPI1 and GPIO clocks *//*!< SPI_FLASH_SPI_CS_GPIO, SPI_FLASH_SPI_MOSI_GPIO,SPI_FLASH_SPI_MISO_GPIO, SPI_FLASH_SPI_DETECT_GPIOand SPI_FLASH_SPI_SCK_GPIO Periph clock enable */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);/*!< SPI_FLASH_SPI Periph clock enable */RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);/*!< Configure SPI_FLASH_SPI pins: SCK */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);/*!< Configure SPI_FLASH_SPI pins: MISO */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_Init(GPIOA, &GPIO_InitStructure);/*!< Configure SPI_FLASH_SPI pins: MOSI */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_Init(GPIOA, &GPIO_InitStructure);/*!< Configure SPI_FLASH_SPI_CS_PIN pin: SPI_FLASH Card CS pin */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);/* SPI1 configuration */// Data on the DO and DIO pins are clocked out on the falling edge of CLK.SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;SPI_InitStructure.SPI_Mode = SPI_Mode_Master;SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;SPI_InitStructure.SPI_CRCPolynomial = 7;SPI_Init(SPI1, &SPI_InitStructure);/* Enable SPI1 */SPI_Cmd(SPI1, ENABLE);}二、LCD12864头文件#ifndef __LCD12864_H__#define __LCD12864_H__#include "stm32f10x.h"#define DisIO GPIOA#define DisClk RCC_APB2Periph_GPIOA#define IOData GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7#define CS_H GPIO_SetBits(GPIOA,GPIO_Pin_4) //CS=1 PIN4#define CS_L GPIO_ResetBits(GPIOA,GPIO_Pin_4) //CS=0#define SID_H GPIO_SetBits(GPIOA,GPIO_Pin_7) //SID=1 PIN5#define SID_L GPIO_ResetBits(GPIOA,GPIO_Pin_7); //SID = 0#define CLK_H GPIO_SetBits(GPIOA,GPIO_Pin_5); //CLK = 1.PIN6#define CLK_L GPIO_ResetBits(GPIOA,GPIO_Pin_5); //CLK = 0void LCD_Init(void); //液晶初始化void LCD_Wdata(u8 data); //液晶写入数据void LCD_Wcmd(u8 cmd); //液晶写入指令void LCD_Clr(void); //清屏void DisNum(u8 x_add,u8 y_add,u8 num); //指定位置写入数字void display(unsigned char x_add,unsigned char *ptr); //指定位置写入字符串void DisStr(u8 x_add,u8 y_add,u8 *ptr); //指定位置写入字符串三、u8 SPI_SendByte(u16 data){while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);SPI1->DR=data; //送数据return 0;}void LCD_Write(u8 data){SPI_SendByte(data&0xf0); //发送高四位SPI_SendByte((data<<4)&0xf0); //发送低四位}void LCD_Wcmd(u8 cmd){CS_H;SPI_SendByte(0xf8); //表示要发送的是指令LCD_Write(cmd);CS_L;}void LCD_Clr(){LCD_Wcmd(0x01);}void LCD_Wdata(u8 data){CS_H;SPI_SendByte(0xfa); //表示要发送的是数据LCD_Write(data);CS_L;}void DisNum(u8 x_add,u8 y_add,u8 num){u8 temp,i=0;temp=num;temp/=10;while(temp){i++;temp /= 10;}if(y_add==1) //第一行{LCD_Wcmd(x_add+0x80);}else if(y_add==2) //第二行{LCD_Wcmd(x_add+0x90);}else if(y_add==3) //第三行{LCD_Wcmd(x_add+0x80+0x08);}else //第四行LCD_Wcmd(x_add+0x90+0x08);if(i==1 || num==0)LCD_Wdata(num+0x30);else if(i==2){LCD_Wdata(num/10+0x30);LCD_Wdata(num%10+0x30);}else{LCD_Wdata(num/100+0x30);LCD_Wdata(num%100/10+0x30);LCD_Wdata(num%10+0x30);}}void display(unsigned char x_add,unsigned char *ptr){LCD_Wcmd(x_add);while(*ptr != '\0'){LCD_Wdata(*ptr);++ptr;}}void DisStr(u8 x_add,u8 y_add,u8 *ptr){if(y_add==1) //第一行{LCD_Wcmd(x_add+0x80);else if(y_add==2) //第二行{LCD_Wcmd(x_add+0x90);}else if(y_add==3) //第三行{LCD_Wcmd(x_add+0x80+0x08);}else //第四行LCD_Wcmd(x_add+0x90+0x08);while(*ptr != '\0'){LCD_Wdata(*ptr);++ptr;}}void LCD_Init(void){CS_L;SPI1_Init();Delay_us(2000);LCD_Wcmd(0x30);//基本指令集LCD_Wcmd(0x0c);LCD_Wcmd(0x01);LCD_Wcmd(0x02);LCD_Wcmd(0x80);}。

STM32驱动12864液晶屏

STM32驱动12864液晶屏

STM32驱动12864液晶屏#include "stm32f10x_lib.h"#define uint unsigned int#define uchar unsigned char#define RSH GPIO_SetBits(GPIOA,GPIO_Pin_0)#define RSL GPIO_ResetBits(GPIOA,GPIO_Pin_0)#define RWH GPIO_SetBits(GPIOA,GPIO_Pin_1)#define RWL GPIO_ResetBits(GPIOA,GPIO_Pin_1)#define ENH GPIO_SetBits(GPIOA,GPIO_Pin_2)#define ENL GPIO_ResetBits(GPIOA,GPIO_Pin_2)#define CS1H GPIO_SetBits(GPIOA,GPIO_Pin_3)#define CS1L GPIO_ResetBits(GPIOA,GPIO_Pin_3)#define CS2H GPIO_SetBits(GPIOA,GPIO_Pin_4)#define CS2L GPIO_ResetBits(GPIOA,GPIO_Pin_4)void RCC_Configuration(void);void NVIC_Configuration(void);void GPIO_Configuration(void);void Delay();uchar table[][16]={/*-- 文字: 我 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x20,0x22,0x22,0xFE,0x21,0x21,0x20,0x20,0xFF,0x20,0x22,0xAC,0x20,0x20,0x00 ,0x04,0x04,0x42,0x82,0x7F,0x01,0x01,0x10,0x10,0x08,0x07,0x1A,0x21,0x40,0xF0,0x00 ,/*-- 文字: 爸 --*//*-- 文字: 一 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0x80,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,/*-- 文字: 天 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x40,0x42,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x40,0x00 ,0x00,0x80,0x40,0x20,0x10,0x08,0x06,0x01,0x02,0x04,0x08,0x10,0x30,0x60,0x20,0x00 ,/*-- 文字: 的 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xF8,0x8C,0x8B,0x88,0xF8,0x40,0x30,0x8F,0x08,0x08,0x08,0x08,0xF8,0x00,0x00 ,0x00,0x7F,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x03,0x26,0x40,0x20,0x1F,0x00,0x00 ,/*-- 文字: 成 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xF8,0x48,0x48,0x48,0xC8,0x08,0xFF,0x08,0x09,0x0A,0xC8,0x88,0x08,0x00 ,0x40,0x30,0x0F,0x00,0x08,0x50,0x4F,0x20,0x10,0x0B,0x0C,0x12,0x21,0x40,0xF0,0x00 ,/*-- 文字: 果 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x3E,0x2A,0x2A,0x2A,0xFE,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,0x00 ,0x21,0x21,0x11,0x11,0x09,0x05,0x03,0xFF,0x03,0x05,0x09,0x09,0x11,0x31,0x11,0x00 ,};void Write_cmd_left(uchar cmd) {RSL;RWL;CS1H;GPIO_Write(GPIOF,cmd);ENL;Delay(50);ENH;Delay(50);ENL;Delay(50);CS1L;}void Write_cmd_right(uchar cmd) {RSL;RWL;CS2H;GPIO_Write(GPIOF,cmd);ENL;Delay(50);ENH;Delay(50);ENL;Delay(50);CS2L;}void Write_data_left(uchar data) {RSH;RWL;CS2L;CS1H;GPIO_Write(GPIOF,data);ENL;Delay(50);ENH;Delay(50);ENL;Delay(50);CS1L;}void Write_data_right(uchar data) {RSH;RWL;CS1L;CS2H;GPIO_Write(GPIOF,data);ENL;Delay(50);ENH;Delay(50);ENL;Delay(50);CS2L;}void led_disp(uchar *p,uchar lr) {uchar i,cl,cr;if(lr=='L'){for(i=0;i<16;i++){cl=*p;p++;Write_data_left(cl);}}if(lr=='R'){for(i=0;i<16;i++){cr=*p;p++;Write_data_right(cr);}}}void clear(){uchar i,j,disp_page;for(i=0;i<8;i++){disp_page=0xb8+i;Write_cmd_left(disp_page);Write_cmd_left(0x40);for(j=0;j<64;j++)Write_data_left(0x00);}for(i=0;i<8;i++){disp_page=0xb8+i;Write_cmd_right(disp_page);Write_cmd_right(0x40);for(j=0;j<64;j++)Write_data_right(0x00);}}void init(){Write_cmd_left(0x30);Delay(10);Write_cmd_right(0x30);Delay(10);Write_cmd_left(0x3f);Delay(10);Write_cmd_right(0x3f);Delay(10);Write_cmd_left(0xc0);Delay(10);Write_cmd_right(0xc0);}int main(void){/* Infinite loop */RCC_Configuration();NVIC_Configuration();GPIO_Configuration();clear();Delay(10);init();Delay(10);uchar i;while(1){Write_cmd_left(0xb8);Write_cmd_left(0x40);for(i=0;i<4;i++)led_disp(table[2*i],'L');Write_cmd_left(0xb8+1);Write_cmd_left(0x40);for(i=0;i<4;i++)led_disp(table[2*i+1],'L');Write_cmd_right(0xb8);Write_cmd_right(0x40);for(i=0;i<2;i++)led_disp(table[2*i+8],'R');Write_cmd_right(0xb8+1);Write_cmd_right(0x40);for(i=0;i<2;i++)led_disp(table[2*i+9],'R');}}/*******************************************************************************Function Name :RCC_Configuration.*Descriprion :configures the different system clocks.*Input :None*Output :None*Return :None******************************************************************************* /void RCC_Configuration(void){ErrorStatus HSEStartUpStatus;/*RCC system reset(for debug purpose)*/RCC_DeInit();/*Enable HSE 打开外部时钟*/RCC_HSEConfig(RCC_HSE_ON);/*Wait till HSE is read */HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus==SUCCESS)//起振成功{/*Enable PrefetchBuffer 打开flash的预存储功能*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);FLASH_SetLatency(FLASH_Latency_2);//设置代码延时值/*HCLK=syclk*/RCC_HCLKConfig(RCC_SYSCLK_Div1);/*PCLK2=HCLK*/RCC_PCLK2Config(RCC_HCLK_Div1);/*RCLK1=HCLK*/RCC_PCLK1Config(RCC_HCLK_Div2);/*PLLCLK=8MHZ*9=72MHZ*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);/*Enable PLL*/RCC_PLLCmd(ENABLE);/*Wait till PLL is ready*/while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){}/*Select PLL as system clock source*/RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/*Wait till pll used as system clock source*/while(RCC_GetSYSCLKSource() !=0x80){}/*打开相应的外部时钟:GPIOF*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); }else{}}/*******************************************************************************Function Name :NVIC_Configuration.*Descriprion :configures Vector Table base location.*Input :None*Output :None*Return :None******************************************************************************* /void NVIC_Configuration(void){#ifdef VECT_TAB_RAM/*Set the vector table base location at 0x20000000*/NVIC_SetVectorTable(NVIC_VectTab_RAM,0X0);#else/*Set the vector table base location at 0x20000000*/NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);#endif}void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;//设置GPIO的工作状态GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz; / /设置GPIO的速度GPIO_Init(GPIOF,&GPIO_InitStructure);GPIO_Init(GPIOA, &GPIO_InitStructure);}/******************************************************************************延时函数******************************************************************************/void Delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=100;y>0;y--);}以上是鑫洪泰的小编为你带来的液晶屏ST7565R IC驱动程序演示代码介绍,如果你想有更进一步的了解,请您关注我们微信,或者点击我们官网了解我们,也可以在线咨询或者拨打我们的热线电话与我们联系!我们会有专业的工作人员为你实时解答。

stm32-12864并行驱动程序

stm32-12864并行驱动程序

//////////////////////////////////////////////////////////////////////////////////stm32-12864并行驱动程序////////////////////////////////////////////////////#include "delay.h" //必须配合delay.c 和delay.h 文件使用,所以要包含delay.h。

#include "display12864.h"f/********** 以下是相关引脚定义。

**************/// A 口的#define DisIO GPIOE //定义12864 要使用的I/O 端口。

#define DisClk RCC_APB2Periph_GPIOE //定义12864 要使用的I/O 端口的时钟。

#define DataGPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7//定义12864 使用的数据引脚。

#define EN GPIO_Pin_10 //定义使能端使用的引脚/*********************************************/#define DisIOIO GPIOE //定义12864 要使用的I/O 端口。

#define DisClkIO RCC_APB2Periph_GPIOE //定义12864 要使用的I/O 端口的时钟。

#define RS #define RW GPIO_Pin_9GPIO_Pin_8/*光标定位函数定义结束。

*/#define x1 0x80#define x2 0x88#define y 0x80GPIO_InitTypeDef GPIOStru; //定义用于定义所以引脚为输出的变量。

STM32的LCD19264-12864经典程序

STM32的LCD19264-12864经典程序

现在STM32越来越流行,在学校搞的很火,本人最近也在学习,做了一个LCD19264的程序,先与大家分享,多谢关注!本程序是有LCD12864该进的,液晶驱动为ST7920。

可以稍微改动即可用于12864一、以下是LCD19264头文件/////////////////////////////////////////////////////////////////////////////////******************************************************************** ************ 函数功能:STM32F103VET6 19264-1液晶显示,串---并口19264* 编写时间:2012.07.22* 作者:ZhouGanJin* 版本:V1.1* 液晶19264-1简介:并口不多说;串口引脚4根RW(SID),E1(CLK1),E2(CLK2),PSB=0, RS(CS)=1,* 通过预编译选择串并口方式********************************************************************* **********/#ifndef _LCD19264_H#define _LCD19264_H/* 端口定义---------------------------本程序只用了GPIOA-----------------------------------*//* 函数申明---------------------STM32配置和19264函数声明-------------------------------*/#define LCD_RS_H GPIO_SetBits(GPIOA, GPIO_Pin_0) //GPIOA->BSRR=GIOP_pin_0 #define LCD_RS_L GPIO_ResetBits(GPIOA, GPIO_Pin_0) //GPIOA->BRR=GIOP_pin_0#define LCD_RW_H GPIO_SetBits(GPIOA, GPIO_Pin_1)#define LCD_RW_L GPIO_ResetBits(GPIOA, GPIO_Pin_1)#define LCD_E1_H GPIO_SetBits(GPIOA, GPIO_Pin_2)#define LCD_E1_L GPIO_ResetBits(GPIOA, GPIO_Pin_2)#define LCD_E2_H GPIO_SetBits(GPIOA, GPIO_Pin_3)#define LCD_E2_L GPIO_ResetBits(GPIOA, GPIO_Pin_3)#define LCD_PSB_H GPIO_SetBits(GPIOA, GPIO_Pin_4)#define LCD_PSB_L GPIO_ResetBits(GPIOA, GPIO_Pin_4)#define LCD_DATA_PORT GPIOD#define LCD_DATA GPIOD->BSRR //BSRR高十六位是复位,低十六位是置位void Lcm_Wr_Dat(u8 wrdata,u8 enable); //写数据void Lcm_Wr_Com(u8 wrcommand,u8 enable); //写指令void Lcm_Rd_Status(u8 enable);//读忙状态void Lcm_Init(u8 enable); //液晶初始化void Lcm_GotoXY(u8 pos_X,u8 pos_y); //设定坐标void Lcm_SETXY(u8 pos_X,u8 pos_y,u8 enable);void Lcm_Disp_Char(u8 onechar,u8 enable);//显示单个字符void Lcm_Disp_Char_setxy(u8 x,u8 y,u8 ch,u8 enable); //定坐标显示单个字符void Lcm_Disp_Str(u8 *string,u8 enable);//显示字符串void Lcm_Disp_Str_setxy(u8 x,u8 y,u8 *strings,u8 enable);//定坐标显示字符串void Delay_ms(u32 m);//1ms延时void Lcm_Delay(void);/*function all ------函数定义-------------以下函数包含19264液晶的串并行方式----------------------------------------*/#define PSB_SERIAL 0#ifdef PSB_SERIAL// -------以下为串口函数-------- serial transmission------/////-----------传送8bits 数据----void Send_byte(u8 bbyte,u8 enable){u8 i;for(i=0;i<8;i++){LCD_E1_L; LCD_E2_L;if(0x80&bbyte) LCD_RW_H; //SID=1;else LCD_RW_L;if(!enable) //CLK = 01 ; 串行用下降沿{LCD_E1_H;Lcm_Delay();LCD_E1_L;}else{LCD_E2_H;Lcm_Delay();LCD_E2_L;}bbyte<<=1;Lcm_Delay(); //?}}//-----------写指令函数----void Lcm_Wr_Com(u8 wcomd,u8 enable){Lcm_Delay();Send_byte(0xf8,enable); //1111_1,RW(0),RS(0),0 -----------指令Send_byte(0xf0&wcomd,enable); //high 4bitsSend_byte(0xf8&(wcomd<<4),enable); //low 4bits}//-----------写数据函数----void Lcm_Wr_Dat(u8 wdata,u8 enable){Lcm_Delay();Send_byte(0xfa,enable); //1111_1,RW(0),RS(1),0 ---------数据Send_byte(0xf0&wdata,enable); //high 4bitsSend_byte(0xf8&(wdata<<4),enable); //low 4bits}#else// -------以下为并口函数-------- parallel Transmission-------/// //---------读忙函数----------------void Lcm_Rd_Status(u8 enable){u16 getd;while(1){Lcm_Delay();LCD_RS_L; //命令LCD_RW_H; //读取Lcm_Delay();//LCD_DATA=0xFFFF0000; //LCD_DATA=0xFF; 高16位为复位,即写入0使其不忙GPIO_Write(LCD_DATA_PORT, 0XFFFF) ; //准备读取数据, 写0x0000则与上相同Lcm_Delay();if(!enable){LCD_E1_L;Lcm_Delay();LCD_E1_H;getd=GPIO_ReadInputData(LCD_DATA_PORT);if((getd&0x0080)==0)break;}else{LCD_E2_L;Lcm_Delay();LCD_E2_H;if((getd&0x0080)==0)break;}}}//-----写指令----------------void Lcm_Wr_Com(u8 wcomd,u8 enable){Lcm_Rd_Status(enable);Lcm_Delay();LCD_RS_L;Lcm_Delay();LCD_RW_L;Lcm_Delay();LCD_DATA=wcomd|(~wcomd<<16); //Lcm_Delay();if(!enable){LCD_E1_H;Lcm_Delay();LCD_E1_L;}else{LCD_E2_H;Lcm_Delay();LCD_E2_L;}// Lcm_Delay();}//------写数据----------------void Lcm_Wr_Dat(u8 wdata,u8 enable) {Lcm_Rd_Status(enable);Lcm_Delay();LCD_RS_H;Lcm_Delay();LCD_RW_L;Lcm_Delay();LCD_DATA=wdata|(~wdata<<16);Lcm_Delay();if(!enable){LCD_E1_H;Lcm_Delay();LCD_E1_L;}else{LCD_E2_H;Lcm_Delay();LCD_E2_L;}}#endif//----选定坐标,全屏选择---------- void Lcm_GotoXY(u8 pos_x,u8 pos_y) {u8 addr;if((pos_x>11)||(pos_y>1))return;if(pos_y==0)addr=0x80+pos_x;else if(pos_y==1)addr=0x90+pos_x;Lcm_Wr_Com(addr,0);//设定DDRAM地址Lcm_Wr_Com(addr,1);//设定DDRAM地址}//---选定坐标,分屏选择------------void Lcm_SETXY(u8 pos_x,u8 pos_y,u8 enable){u8 addr;if((pos_x>11)||(pos_y>1))return;if(pos_y==0)addr=0x80+pos_x;else if(pos_y==1)addr=0x90+pos_x;if(enable==0)Lcm_Wr_Com(addr,0);//设定DDRAM地址elseLcm_Wr_Com(addr,1);//设定DDRAM地址}//----------初始化----------------void Lcm_Init(u8 enable){#ifdef PSB_SERIALLCD_PSB_L; //选择串口#elseLCD_PSB_H; //选择并口#endifLcm_Wr_Com(0x30,enable);Delay_ms(2);Lcm_Wr_Com(0x30,enable);Delay_ms(2);Lcm_Wr_Com(0x0c,enable); //开显示及光标设置Delay_ms(2);Lcm_Wr_Com(0x01,enable); //显示清屏Delay_ms(3);Lcm_Wr_Com(0x06,enable); //显示光标移动设置Delay_ms(3);}/*--------- display function----------以下为各种显示函数---------------------------------------*/void Lcm_Disp_Char(u8 onechar,u8 enable)//显示单个字符{Lcm_Wr_Dat(onechar,enable);}void Lcm_Disp_Str(u8 *strings,u8 enable)//显示字符串{while(*strings != '\0')Lcm_Wr_Dat(*strings++,enable);Lcm_Wr_Dat('\0',enable);}void Lcm_Disp_Char_setxy(u8 x,u8 y,u8 ch,u8 enable) //指定坐标显示字符{Lcm_GotoXY(x, y);Lcm_Wr_Dat(ch,enable);}void Lcm_Disp_Str_setxy(u8 x,u8 y,u8 *strings,u8 enable)//指定坐标显示字符串{Lcm_GotoXY(x, y);while(*strings != '\0')Lcm_Wr_Dat(*strings++,enable);Lcm_Wr_Dat('\0',enable);}二、以下是STM32配置函数/* 函数申明---------------------STM32配置和19264函数声明-------------------------------*/void RCC_Configuration(void);void GPIO_Configuration(void);void NVIC_Configuration(void);void WWDG_Configuration(void);/********************************************************************** ************* 函数名称:RCC_Configuration(void)** 函数功能:时钟初始化** 输入:无** 输出:无** 返回:无********************************************************************* ************/GPIO_InitTypeDef GPIO_InitStructure;ErrorStatus HSEStartUpStatus;void RCC_Configuration(void){/* RCC system reset(for debug purpose) */RCC_DeInit();/* Enable HSE */RCC_HSEConfig(RCC_HSE_ON);/* Wait till HSE is ready */HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus == SUCCESS){/* HCLK = SYSCLK */RCC_HCLKConfig(RCC_SYSCLK_Div1);/* PCLK2 = HCLK */RCC_PCLK2Config(RCC_HCLK_Div1);/* PCLK1 = HCLK/2 */RCC_PCLK1Config(RCC_HCLK_Div2);/* Flash 2 wait state */FLASH_SetLatency(FLASH_Latency_2);/* Enable Prefetch Buffer */FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/* PLLCLK = 8MHz * 9 = 72 MHz */RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);/* Enable PLL */RCC_PLLCmd(ENABLE);/* Wait till PLL is ready */while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}/* Select PLL as system clock source */RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/* Wait till PLL is used as system clock source */while(RCC_GetSYSCLKSource() != 0x08){}}}/********************************************************************** ************* 函数名称:GPIO_Configuration(void)** 函数功能:端口初始化** 输入:无** 输出:无** 返回:无********************************************************************* ************/void GPIO_Configuration(void){//定义端口结构体GPIO_InitTypeDef GPIO_InitStructure;//将GPIOA端口使能有效RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE );GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | //GPIOAGPIO_Pin_1 |GPIO_Pin_2 |GPIO_Pin_3 |GPIO_Pin_4 |GPIO_Pin_5 |GPIO_Pin_6 |GPIO_Pin_7 |GPIO_Pin_8 |GPIO_Pin_9 |GPIO_Pin_10 |GPIO_Pin_11 |GPIO_Pin_12 ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最高输出速率50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); // 选择A端口}/********************************************************************** ************* 函数名称:NVIC_Configuration(void)** 函数功能:中断初始化** 输入:无** 输出:无** 返回:无********************************************************************* ************/void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_Init(&NVIC_InitStructure);}/******************************************************************************** *函数功能:延时函数/*--- Delay function-----------------延时函数定义********************************************************************* ************///------1ms延时------------void Delay_ms(u32 m){u32 i;for(; m != 0; m--)for (i=0; i<25000; i++); //clk=50MHz ,25_000000 分频得1s,25000分频得1ms}//---------液晶延时----------void Lcm_Delay(void){u8 j,i=100;while(i--){for(j=0;j<100;j++){;}}}#endif/*************结束***************/。

LCD12864驱动程序(STM32F103RCT6)

LCD12864驱动程序(STM32F103RCT6)
u8 i = 0;
CS_LOW; RS_DATA; for(i=0;i<8;i++) {
SCLK_LOW; if(data&0x80) {
SDA_HI; } else {
SDA_LOW; } SCLK_HI; data <<= 1; } } /************************************************************************ 函 数 名:void JLX12864_Init(void) 功 能:12864 初始化 入口参数:无 返 回 值:无 说 明: 作 者:Joe 日 期:2015/1/13 16:33:38 修 改:XX 修改说明:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
************************************************************************/ void JLX12864_Init(void) {
GPIO_Init(GPIOB, GPIO_Pin_1, GPIO_Mode_Out_PP_High_Fast); GPIO_Init(GPIOB, GPIO_Pin_2, GPIO_Mode_Out_PP_High_Fast); GPIO_Init(GPIOB, GPIO_Pin_3, GPIO_Mode_Out_PP_High_Fast); GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Fast); GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_Out_PP_High_Fast);
/************************************************************************ 函 数 名:JLX12864_ClearScreen(void) 功 能:清屏 入口参数:无 返 回 值:无 说 明: 作 者:Joe 日 期:2015/1/13 16:33:38 修 改:XX 修改说明:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ************************************************************************/ void JLX12864_ClearScreen(void) {

STM3212864显示驱动程序,,寄存器版

STM3212864显示驱动程序,,寄存器版

头文件#ifndef __12864_H_#define __12864_H_#include"sys.h"//管脚定义,移植修改区//***************************************************************************** *********************************************//#define LCD12864_GPIO GPIOB//#define GPIOCLK RCC_APB2Periph_GPIOB#define RS PBout(0)#define RW PBout(1)#define EN PBout(2)//#define PSB GPIO_Pin_4//#define RST GPIO_Pin_5//#define Busy GPIO_Pin_15//#define LCD_GPIO_DAT GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10 |GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15//#define LCD_GPIO_CMD GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_5//#define LCD_RS(x) x ? GPIO_SetBits(LCD12864_GPIO,RS): GPIO_ResetBits(LCD12864_GPIO,RS)//#define LCD_RW(x) x ? GPIO_SetBits(LCD12864_GPIO,RW): GPIO_ResetBits(LCD12864_GPIO,RW)//#define LCD_EN(x) x ? GPIO_SetBits(LCD12864_GPIO,EN): GPIO_ResetBits(LCD12864_GPIO,EN)//#define LCD_PSB(x) x ? GPIO_SetBits(LCD12864_GPIO,PSB): GPIO_ResetBits(LCD12864_GPIO,PSB)//#define LCD_RST(x) x ? GPIO_SetBits(LCD12864_GPIO,RST): GPIO_ResetBits(LCD12864_GPIO,RST)//#define Text_Busy GPIO_ReadInputDataBit(LCD12864_GPIO ,Busy) //PBin(7)#define LCD_WriteData(x) {GPIOC->BSRR = x & 0x00ff;GPIOC->BRR = ((~x)) & 0x00ff;} //高8位的数据//#define LCD_WriteData(x) {LCD12864_GPIO->BSRR = x & 0x00ff;LCD12864_GPIO->BRR = ((~x)<<8) & 0x00ff;} //低8位的数据void LCD12864_Init(void); //硬件端口初始化void LCD12864_InitPort(void); //硬件端口初始化void NOP(void); //延时函数u8 LCD12864_busy(void); //检测忙状态void LCD12684_Wcmd(u8 dat); //写指令void LCD12684_Wdat(u8 dat); //写数据void LCD12864_Init(void); //液晶初始化void LCD12864_Clr(void); // 清屏void LCD12864_Pos(u8 x,u8 y); //设置显示位置void LCD12864_PhotoDis(u8 *bmp); // 显示图片void LCD_ShowString(u8 x,u8 y,const u8 *p); // 显示字符串void LCD_Shownum(u8 x,u8 y,u8 num);void LCD_Shownum1(u8 num);//***************************************************************************** *****************************************#endif//#include "stm32f10x.h"#include"12864.h"#include"delay.h"/****************************************************************************** ******************//FILE:液晶12864驱动程序//VERS:1.0//AUTHOR:福建师范大学林木泉//DATE:2012/07/11******************************************************************************* *****************//****************************************************************************** ******************@f_name: void LCD12864_InitPort(void)@brief: 初始化硬件端口配置@param: None@return: None******************************************************************************* *****************//*void LCD12864_InitPort(void){GPIO_InitTypeDef GPIO_InitStructure; //定义结构体RCC_APB2PeriphClockCmd(GPIOCLK|RCC_APB2Periph_AFIO, ENABLE); //使能功能复用IO时钟,不开启复用时钟不能显示GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); //把调试设置普通IO 口GPIO_InitStructure.GPIO_Pin = LCD_GPIO_DAT; //数据口配置成开漏输出模式,此模式下读输入寄存器的值得到IO口状态GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LCD12864_GPIO , &GPIO_InitStructure); //IO口初始化函数(使能上述配置)GPIO_InitStructure.GPIO_Pin = LCD_GPIO_CMD;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LCD12864_GPIO , &GPIO_InitStructure);//GPIO_Init(LCD12864_GPIO , &GPIO_InitStructure); //初始化IO口配置GPIO_Write(LCD12864_GPIO ,0xffff);} *//****************************************************************************** *************///数据口:PB8~PB15; 命令口:PB0~PB2void LCD12864_InitPort(void){RCC->APB2ENR|=1<<3;//先使能外设PORTB时钟RCC->APB2ENR|=1<<4;//先使能外设PORTC时钟RCC->APB2ENR|=1<<0; //开启辅助时钟GPIOC->CRL&=0X00000000;GPIOC->CRL|=0X33333333;GPIOB->CRL&=0XFFFFF000;GPIOB->CRL|=0X00000333;GPIOB->ODR|=0XFF07;}C文件/****************************************************************************** ******************@f_name: void NOP(void)@brief: 延时函数@param: None@return: None******************************************************************************* *****************/void NOP(void){ u8 i; for(i=0; i<100; i++); }/****************************************************************************** ******************@f_name: u8 LCD12864_busy(void)@brief: 检测忙状态@param: None@return: None******************************************************************************* *****************///u8 LCD12864_busy(void)//{// u8 x;// RS=0;// RW=1;// EN=1;// NOP();// NOP();// x=Text_Busy;// EN=1;// return x;//}/****************************************************************************** ******************@f_name: void LCD12684_Wcmd(u8 dat)@brief: 写指令@param: u8 dat 输入指令@return: None******************************************************************************* *****************/void LCD12684_Wcmd(u8 dat){//while(LCD12864_busy()); //忙检测RS=0;RW=0;EN=0;NOP();NOP();LCD_WriteData(dat);NOP();NOP();EN=1;NOP();NOP();EN=0;NOP();NOP();}/****************************************************************************** ******************@f_name: void LCD12684_Wcmd(u8 dat)@brief: 写数据@param: u8 dat 输入数据@return: None******************************************************************************* *****************/void LCD12684_Wdat(u8 dat){//while(LCD12864_busy()); //忙检测RS=1;RW=0;EN=0;NOP();NOP();LCD_WriteData(dat);NOP();NOP();EN=1;NOP();NOP();EN=0;}/****************************************************************************** ******************@f_name: void LCD12864_Init(void)@brief: 液晶初始化@param: None@return: None******************************************************************************* *****************/void LCD12864_Init(void){//LCD_PSB(1); //并口方式//LCD_RST(0); //液晶复位低电平有效//delay_ms(3);// LCD_RST(1); //置高电平等待复位//delay_ms(3);LCD12864_InitPort();LCD12684_Wcmd(0x34); //扩充指令操作delay_ms(5);LCD12684_Wcmd(0x30); //基本指令操作delay_ms(5);LCD12684_Wcmd(0x0c); //显示开,关光标delay_ms(5);LCD12684_Wcmd(0x01); //清除LCD的显示内容delay_ms(5);}/****************************************************************************** ******************@f_name: void LCD12864_Clr(void)@brief: 清屏@param: None@return: None******************************************************************************* *****************/void LCD12864_Clr(void){LCD12684_Wcmd(0x34); //扩充指令操作“绘图”delay_ms(5);LCD12684_Wcmd(0x30); //基本指令操作delay_ms(5);LCD12684_Wcmd(0x01); //清屏delay_ms(5);}/****************************************************************************** ******************@f_name: void LCD12864_Pos(u8 x,u8 y)@brief: 设置显示位置@param: u8 x:X轴u8 y:Y轴@return: None******************************************************************************* *****************/void LCD12864_Pos(u8 x,u8 y){u8 pos;if (x==0) {x=0x80;}else if (x==1) {x=0x90;}else if (x==2) {x=0x88;}else if (x==3) {x=0x98;}else x=0x80;pos = x+y ;LCD12684_Wcmd(pos); //显示地址}/****************************************************************************** ******************@f_name: void LCD12864_PhotoDis(u8 *bmp)@brief: 显示图形@param: u8 *bmp 图形数组@return: None******************************************************************************* *****************/void LCD12864_PhotoDis(u8 *bmp){u8 i,j;LCD12684_Wcmd(0x34); //关闭图形显示for(i=0;i<32;i++){LCD12684_Wcmd(0x80+i); //先写入水平坐标值LCD12684_Wcmd(0x80); //写入垂直坐标值for(j=0;j<16;j++) //再写入两个8位元的数据LCD12684_Wdat(*bmp++);delay_ms(1);}for(i=0;i<32;i++){LCD12684_Wcmd(0x80+i);LCD12684_Wcmd(0x88);for(j=0;j<16;j++)LCD12684_Wdat(*bmp++);delay_ms(1);}LCD12684_Wcmd(0x36); //写完数据,开图形显示}/****************************************************************************** ******************@f_name: void LCD_ShowString(u8 x,u8 y,const u8 *p)@brief: 显示字符串@param: u8 *bmp 图形数组@return: None******************************************************************************* *****************/void LCD_ShowString(u8 x,u8 y,const u8 *p){u8 temp;if(x>3) {x=0;}if(y>7) {y=0;}LCD12864_Pos(x,y);temp=*p;while(temp!='\0'){LCD12684_Wdat(temp);temp=*(++p);}}void LCD_Shownum(u8 x,u8 y,u8 num){ u8 number;u8 shi;u8 ge;if(x>3) {x=0;}if(y>7) {y=0;}LCD12864_Pos(x,y);number=num;shi=number/10+0x30;ge=number%10+0x30;LCD12684_Wdat(shi);LCD12684_Wdat(ge);}void LCD_Shownum1(u8 num){ u8 number;u8 shi;u8 ge;number=num;shi=number/10+0x30;ge=number%10+0x30;LCD12684_Wdat(shi);LCD12684_Wdat(ge);}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32 LCD12864驱动程序(头文件)(2012-05-29 21:25:08)转载▼标签:杂谈#ifndef LCD12864_H#define LCD12864_H#define LCD_CONTROL GPIOD //默认LCD12864的控制口在PD口#define LCD_DATAPORT GPIOD //默认LCD12864的数据口在PD口#define LCD_RESET_Pin GPIO_Pin_12 //默认LCD12864的复位引脚连接到PD.12 也可不用#define LCD_RS_Pin GPIO_Pin_13 //默认LCD12864 RS -- PD.13#define LCD_RW_Pin GPIO_Pin_14 //默认LCD12864 RW -- PD.14#define LCD_EN_Pin GPIO_Pin_15 //默认LCD12864 E -- PD.15#define LCD_CONTROL_CLOCK RCC_APB2Periph_GPIOD //默认LCD12864的控制口时钟#define LCD_DATAPORT_CLOCK RCC_APB2Periph_GPIOD //默认LCD12864的数据口时钟#define LCD_RS_1 LCD_CONTROL->BSRR &=~LCD_RS_Pin;LCD_CONTROL->BSRR |=LCD_RS_Pin //RS置高电平#define LCD_RS_0 LCD_CONTROL->BRR &=~LCD_RS_Pin;LCD_CONTROL->BRR |=LCD_RS_Pin //RS置低电平#define LCD_RW_1 LCD_CONTROL->BSRR &=~LCD_RW_Pin;LCD_CONTROL->BSRR |=LCD_RW_Pin //RW置高电平#define LCD_RW_0 LCD_CONTROL->BRR &=~LCD_RW_Pin;LCD_CONTROL->BRR |=LCD_RW_Pin //RW置低电平#define LCD_EN_1 LCD_CONTROL->BSRR &=~LCD_EN_Pin;LCD_CONTROL->BSRR |=LCD_EN_Pin //EN置高电平#define LCD_EN_0 LCD_CONTROL->BRR &=~LCD_EN_Pin;LCD_CONTROL->BRR |=LCD_EN_Pin //EN置低电平#define LCD_RESET_0 LCD_CONTROL->BRR = LCD_RESET_Pin // 复位#define LCD_RESET_1 LCD_CONTROL->BSRR = LCD_RESET_Pin // 复位脚拉高#define DATAOUT LCD_DATAPORT->ODR &=0xff00;LCD_DATAPORT->ODR // 数据输出寄存器#define DATAIN LCD_DATAPORT->IDR // 数据输入寄存器#define LCD_BF ((DATAIN)& 0x0080) // 忙状态void LCD_delayus(unsigned long n); //延时n(us)void LCD_delayms(unsigned long n); //延时n(ms)void LCD_WriteInitcmd(uint8_t initcmd); //写初始化命令void LCD_WaitLaisure(void); //一直等待到LCD内部操作完成,变为空闲状态void LCD_Writecmd(uint8_t cmd); //写命令到LCD12864void LCD_WriteByte(uint8_t byte); //写一字节数据到LCD12864void LCD_pos(uint16_t pos); //LCD显示位置设置void LCD_Setpos(uint16_t row,uint16_t col);//设定LCD12864的显示地址,根据习惯void LCD_DispChar(char ch); //显示一个字符void LCD_Setpos_DispChar(uint16_t row,uint16_t col,char ch);//在指定位置显示一个字符void LCD_DispString(char str[]); //显示一个字符串,显示位置需提前设定//在指定位置显示一个字符串void LCD_Setpos_DispString(uint16_t row,uint16_t col,char str[]);void LCD_Dispnum(uint32_t num); //显示一个不超过8位的整数,显示位置需提前设置//在指定位置显示一个不超过8位的整数void LCD_Setpos_Dispnum(uint16_t row,uint16_t col,uint32_t num);void LCD_DispDecimal(uint32_t num,uint16_t dot);//显示一个有效位不超过8位的浮点数,显示位置需要提前设定//在指定位置显示一个有效位不超过8位的浮点数void LCD_Setpos_DispDecimal(uint16_t row,uint16_t col,uint32_t num,uint16_t dot);//显示日历,显示日期与时间void LCD_DispDateTime(uint32_t year,uint16_t month,uint16_t day,uint16_t hour,uint16_t min,uint16_t sec);void LCD_DispPicture(const unsigned char picture[]); //显示一幅图像128*64//屏幕整体左移一格,用于滚动显示void LCD_ShiftLeft(void);//屏幕整体右移一格,用于滚动显示void LCD_ShiftRight(void);//清屏,清除显示void LCD_Clear(void);//使光标还回原点位置void LCD_Return(void);//关显示void LCD_Close(void);//开显示void LCD_Open(void);void LCD_FlickerChar(uint16_t row,uint16_t col);//关闭字符闪烁void LCD_CloseFlicker(void);//屏幕秒闪烁一次void LCD_FlickerScreen(void);void LCD_PORT_Init(void); //LCD连接端口初始化void LCD_Init(void); //LCD配置初始化#endif#include "stm32f10x.h"#include "stm32f10x_gpio.h"#include "LCD12864.h"#include "picture.h"//延时n(us)void LCD_delayus(unsigned long n){unsigned long j;while(n--){ j=8;while(j--);}}//延时n(ms)void LCD_delayms(unsigned long n){while(n--)LCD_delayus(1100);}//写初始化命令void LCD_WriteInitcmd(uint8_t initcmd){LCD_RS_0;LCD_RW_0;LCD_EN_1;DATAOUT |= initcmd;LCD_delayus(600);LCD_EN_0;LCD_RW_1;}//一直等待到LCD内部操作完成,变为空闲状态void LCD_WaitLaisure(void){uint16_t flag=0x00;LCD_RS_0;LCD_RW_1;do{LCD_EN_0;LCD_delayus(5);LCD_EN_1;LCD_delayus(5);flag=(uint16_t)LCD_BF;}while(flag);}//写命令到LCD12864void LCD_Writecmd(uint8_t cmd){LCD_WaitLaisure();LCD_RS_0;LCD_RW_0;LCD_EN_1;DATAOUT |= cmd;LCD_delayus(600); //经过测试,取600。

550都不可以LCD_EN_0;LCD_RW_1;}//写一字节数据到LCD12864void LCD_WriteByte(uint8_t byte){LCD_WaitLaisure();LCD_RS_1;LCD_RW_0;LCD_EN_1;DATAOUT |= byte;LCD_delayus(600);LCD_EN_0;LCD_RW_1;}void LCD_pos(uint16_t pos){LCD_Writecmd(pos);}void LCD_Setpos(uint16_t row,uint16_t col){uint16_t pos=0x00;if(row+1>3) pos=0x08;if(row & 0x01) pos |= 0x80;else pos |= 0x90;pos += col-1;LCD_Writecmd(pos);}void LCD_DispChar(char ch){LCD_WriteByte(ch);}void LCD_Setpos_DispChar(uint16_t row,uint16_t col,char ch) {LCD_Setpos(row,col);LCD_WriteByte(ch);}void LCD_DispString(char str[]){uint16_t i;for(i=0;str[i]!='\0';i++){LCD_WriteByte(str[i]);}}void LCD_Setpos_DispString(uint16_t row,uint16_t col,char str[]) {LCD_Setpos(row,col);LCD_DispString(str);}void LCD_Dispnum(uint32_t num){char str[12];uint32_t q;uint16_t wei,i,j,k;if(num>=10000000)wei=8;else if(num>=1000000)wei=7;else if(num>=100000)wei=6;else if(num>=10000)wei=5;else if(num>=1000) wei=4;else if(num>=100)wei=3;else if(num>=10) wei=2;else wei=1;k=0;for(i=wei;i>0;i--){ q=1;j=1; //i=1时,q=1,得到个位for(;j<i;j++)q *=10;str[k++]=num/q +'0';num %= q;}str[k] = '\0'; //添加字符串结束标志LCD_DispString(str);//显示字符串}void LCD_Setpos_Dispnum(uint16_t row,uint16_t col,uint32_t num) {LCD_Setpos(row,col);LCD_Dispnum(num);}void LCD_DispDecimal(uint32_t num,uint16_t dot){uint32_t i=0,j,k=0,wei;uint32_t q;char str[10];if(num>=10000000)wei=8;else if(num>=1000000)wei=7;else if(num>=100000)wei=6;else if(num>=10000)wei=5;else if(num>=1000) wei=4;else if(num>=100)wei=3;else if(num>=10) wei=2;else wei=1;for(i=wei;i>0;i--){ q=1;j=1; //i=1时,q=1,得到个位for(;j<i;j++)q *=10;str[k++]=num/q +'0';num %= q;}str[k] = '\0'; //添加字符串结束标志for(i=8;i>0;i--){ if((str[i]>='0')&&(str[i]<='9')) break;}str[i+2]='\0'; //添加字符串结束符for(j=0;j<dot;j++,i--)//小数点后各位依次右移,准备插入{str[i+1]=str[i];}str[i+1]='.'; //插入小数点LCD_DispString(str);//显示浮点小数}void LCD_Setpos_DispDecimal(uint16_t row,uint16_t col,uint32_t num,uint16_t dot){LCD_Setpos(row,col);LCD_DispDecimal(num,dot);}void LCD_DispDateTime(uint32_t year,uint16_t month,uint16_t day,uint16_t hour,uint16_t min,uint16_t sec){//extern uint16_t enableclock;LCD_Setpos(1,0);LCD_DispString("Date:");LCD_Dispnum((uint32_t)year);LCD_DispChar('-');LCD_Dispnum((uint32_t)month);LCD_DispChar('-');LCD_Dispnum((uint32_t)day);if((month<10)&&(day<10)) //清除无效位置可能残留的显示{LCD_DispChar(' ');LCD_DispChar(' ');}else if(((month<10)&&(day>9))||((month>9)&&(day<10)))LCD_DispChar(' ');LCD_Setpos(1,15);//if(enableclock) //如果开启闹铃,显示闹铃标志// LCD_DispChar('@');//elseLCD_DispChar('*'); //第一行结束符显示LCD_Setpos(2,0);LCD_DispString("Time:");LCD_Dispnum((uint32_t)hour);LCD_DispChar(':');LCD_Dispnum((uint32_t)min);LCD_DispChar(':');LCD_Dispnum((uint32_t)sec);if(sec==0) LCD_DispChar('0');LCD_DispChar(' ');LCD_DispChar(' ');if((hour<10)&&(min<10)&&(sec>0)&&(sec<10))LCD_DispChar(' '); //用于消隐LCD_Setpos(2,15);//if(enableclock)// LCD_DispChar('@');//elseLCD_DispChar('*');//第二行结束符显示}void LCD_DispPicture(const unsigned char picture[]) {uint16_t i,j;LCD_Writecmd(0x34); //写数据时,关闭图形显示LCD_delayms(20);for(i=0;i<32;i++) //32行{LCD_Writecmd(0x80+i);LCD_delayus(150);LCD_Writecmd(0x80);LCD_delayus(150);for(j=0;j<16;j++) //一行,16个字节{LCD_WriteByte(picture[j]);LCD_delayus(150);}LCD_delayus(150);}for(i=0;i<32;i++) //32行{LCD_Writecmd(0x80+i);LCD_delayus(150);LCD_Writecmd(0x80);LCD_delayus(150);for(j=0;j<16;j++) //一行,16个字节{LCD_WriteByte(picture[j]);LCD_delayus(150);}LCD_delayus(150);}LCD_Writecmd(0x36); //写完数据,开图形显示LCD_delayms(50);}//屏幕整体左移一格,用于滚动显示void LCD_ShiftLeft(){LCD_Writecmd(0x18);}//屏幕整体右移一格,用于滚动显示void LCD_ShiftRight(void){LCD_Writecmd(0x1C);}//清屏,清除显示void LCD_Clear(void){LCD_Writecmd(0x01);}//使光标还回原点位置void LCD_Return(void){LCD_Writecmd(0x02);}//关显示void LCD_Close(void){LCD_Writecmd(0x08);}//开显示void LCD_Open(void){LCD_Writecmd(0x0C);}void LCD_FlickerChar(uint16_t row,uint16_t col) {LCD_Writecmd(0x0D);LCD_Setpos(row,col);}//关闭字符闪烁void LCD_CloseFlicker(void){LCD_Writecmd(0x0C);}//屏幕秒闪烁一次void LCD_FlickerScreen(void){LCD_Writecmd(0x08);//关显示LCD_delayms(500);LCD_Writecmd(0x0C);//开显示LCD_delayms(500);}//LCD连接端口初始化void LCD_PORT_Init(void){GPIO_InitTypeDef LCD_port;RCC_PCLK2Config(RCC_HCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div2); //fPCLK1=36MHzRCC_APB2PeriphClockCmd(LCD_CONTROL_CLOCK ,ENABLE); //时钟使能RCC_APB2PeriphClockCmd(LCD_DATAPORT_CLOCK ,ENABLE);LCD_port.GPIO_Pin = (uint16_t)0x00ff;LCD_port.GPIO_Speed= GPIO_Speed_50MHz;LCD_port.GPIO_Mode = GPIO_Mode_Out_OD;//OD开路输出,外接上拉电阻到5V GPIO_Init(LCD_DATAPORT,&LCD_port);LCD_port.GPIO_Pin = LCD_RESET_Pin | LCD_RS_Pin | LCD_RW_Pin | LCD_EN_Pin; LCD_port.GPIO_Speed= GPIO_Speed_50MHz;LCD_port.GPIO_Mode = GPIO_Mode_Out_OD;//OD开路输出GPIO_Init(LCD_CONTROL,&LCD_port);}void LCD_Init(void){LCD_RESET_0;LCD_delayms(300); //复位LCD12864LCD_RESET_1;LCD_delayms(300);LCD_Writecmd(0x34); //写数据时,关闭图形显示LCD_delayus(400);LCD_WriteInitcmd(0x38); //并行,8位,基本指令操作LCD_delayus(200); //150LCD_WriteInitcmd(0x38);LCD_delayus(100);LCD_WriteInitcmd(0x0C); //开显示,显示光标,用于测试LCD_delayus(150);LCD_WriteInitcmd(0x01); //清屏LCD_delayms(12);LCD_Writecmd(0x06); //地址自动增加LCD_delayus(150);}#include "stm32f10x.h"#include "LCD12864.h"extern const unsigned char picture1[];extern const unsigned char picture2[];void GPIO_Configuration(void);//延时n usvoid delay_nus(unsigned long n){unsigned long j;while(n--){ j=8;while(j--);}}//延时n msvoid delay_nms(unsigned long n){while(n--)delay_nus(1100);}//时钟配置函数72MHz 端口配置void RCC_Configuration(){RCC_PCLK2Config(RCC_HCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div2); //fPCLK1=36MHz//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC|\// RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE,ENABLE);}int main(void){//uint16_t i;//char str1[]={"Happy everyday!"};//char str2[]={"天天向上"};RCC_Configuration();LCD_PORT_Init();LCD_Init();//LCD_Writecmd(0x90);//LCD_WriteByte('a');//delay_nms(10); //至少延时1usLCD_Setpos_DispString(1,3,"好好学习");delay_nms(10); //至少延时1usLCD_Setpos_DispString(3,3,"天天向上");delay_nms(300);LCD_FlickerChar(3,3);//LCD_Setpos_DispString(2,1,"天天sr向上");//delay_nms(2000);//LCD_Setpos_Dispnum(3,1,12345678);//LCD_Setpos_Dispnum(4,1,12345678);//LCD_Setpos_DispDecimal(4,1,1234567,6);//delay_nms(1); //必要的延时//LCD_Setpos_DispString(3,1,"Have a good time!"); //delay_nms(1); //必要的延时//LCD_Setpos_DispString(4,1,"天天向上天天向上");//LCD_Setpos_DispString(3,1,"进步每一天!");//LCD_Setpos_DispString(3,1,"Happy everyday!"); //LCD_Setpos_DispString(4,1,"认真学习STM32"); //LCD_Setpos_DispString(2,2,str1);//LCD_DispPicture(picture1);//LCD_WriteByte('d');//LCD_WriteByte('e');//delay_nms(1000);while (1){};}。

相关文档
最新文档