stm32_19264液晶LCD驱动程序

发布者:MoonlightStar最新更新时间:2018-06-03 来源: eefocus关键字:stm32  19264液晶  LCD驱动 手机看文章 扫描二维码
随时随地手机看文章

编译器为:MDK4.0

注意:若显示出现乱码的现象请适当修改延时函数

/****************************lcd.h********************************************/

#ifndef __LCD_H
#define __LCD_H  
#include "sys.h"
#define LCD_RS  PFout(0)// PF.0
#define LCD_E   PFout(1)// PF.1
#define LCD_CS1 PFout(2)// PF.2
#define LCD_RST PFout(3)// PF.3
#define LCD_CS2 PFout(4)// PF.4
#define LCD_CS3 PFout(5)// PF.5
#define LCD_DATA(x)  GPIOE->ODR=(GPIOB->ODR&0x807F)|((x & 0x00FF)<<7) //PE7~14,作为数据线
#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

/******************************************************lcd.c************************************************/
#include   
#include "lcd.h"
#include "delay.h" 
//LCD IO口配置
void LCDPortSet(void)
{

RCC->APB2ENR|=1<<6;      //使能PORTE时钟
RCC->APB2ENR|=1<<7;      //使能PORTF时钟
GPIOE->CRH&=0XF0000000;//PE8-14数据口
GPIOE->CRH|=0X03333333; 
GPIOE->CRL&=0X0FFFFFFF;//PE7数据口
GPIOE->CRL|=0X30000000;  
GPIOE->ODR|=0X7F80;      //上拉
GPIOF->CRL&=0XF0000000; 
GPIOF->CRL|=0X03333333;  //PF.0 1 2 3 4 5 6推挽输出 
 GPIOF->ODR|=1<<0;      //PF.0 输出高
GPIOF->ODR|=1<<1;      //PF.1 输出高
GPIOF->ODR|=1<<2;      //PF.2 输出高
GPIOF->ODR|=1<<3;      //PF.3 输出高
GPIOF->ODR|=1<<4;      //PF.4 输出高
GPIOF->ODR|=1<<5;      //PF.5 输出高
GPIOF->ODR|=1<<6;      //PF.6 输出高
}

void SelectChip1(void) //选择第1屏
{
LCD_CS1=0;
LCD_CS2=1;
LCD_CS3=1;
}

void SelectChip2(void) //选择第2屏
{
LCD_CS1=1;
LCD_CS2=0;
LCD_CS3=1;
}
void SelectChip3(void) //选择第3屏
{
LCD_CS1=1;
LCD_CS2=1;
LCD_CS3=0;  
}
void WriteCommand(u8 cmd)   //写命令
{     
LCD_RS=0;    //写命令
//RW=0;  
LCD_DATA(cmd);
LCD_E=1;
delay_us(10);
LCD_E=0;
}
void WriteData(u8  dat)  //写数据
{  
        LCD_RS=1;//写数据
//RW=0;
LCD_DATA(dat);//数据输出到数据口
   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******************************************************/
/**
@说明:JBG19264 LCD测试程序
*/
#include
#include "sys.h"
#include "delay.h"
#include "lcd.h" 
u8 table[][32]={
/*--  文字:  我  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,0x20,0xFF,0x20,0x22,0x2C,0xA0,0x20,0x00,
0x00,0x08,0x48,0x84,0x7F,0x02,0x41,0x40,0x20,0x13,0x0C,0x14,0x22,0x41,0xF8,0x00,
/*--  文字:  们  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x80,0x60,0xF8,0x07,0x00,0xF8,0x01,0x06,0x00,0x04,0x04,0x04,0xFC,0x00,0x00,
0x01,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,
/*--  文字:  都  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x20,0x24,0x24,0xA4,0x7F,0x24,0x34,0x28,0x26,0x20,0xFE,0x02,0x22,0xDA,0x06,0x00,
0x04,0x02,0xFF,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0xFF,0x08,0x10,0x08,0x07,0x00,
/*--  文字:  是  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x00,0x7F,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x7F,0x00,0x00,0x00,0x00,
0x81,0x41,0x21,0x1D,0x21,0x41,0x81,0xFF,0x89,0x89,0x89,0x89,0x89,0x81,0x81,0x00,
/*--  文字:  好  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00,
0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,
/*--  文字:  孩  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x02,0x02,0x02,0xF2,0x8A,0x46,0x08,0x88,0xC8,0xA8,0x99,0x8E,0x88,0x48,0x28,0x00,
0x02,0x42,0x81,0x7F,0x00,0x00,0x88,0x88,0x44,0x44,0x22,0x11,0x28,0x44,0x82,0x00,
/*--  文字:  子  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x80,0x82,0x82,0x82,0x82,0x82,0x82,0xE2,0xA2,0x92,0x8A,0x86,0x82,0x80,0x80,0x00,
0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*--  文字:  我  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,0x20,0xFF,0x20,0x22,0x2C,0xA0,0x20,0x00,
0x00,0x08,0x48,0x84,0x7F,0x02,0x41,0x40,0x20,0x13,0x0C,0x14,0x22,0x41,0xF8,0x00,
/*--  文字:  们  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x80,0x60,0xF8,0x07,0x00,0xF8,0x01,0x06,0x00,0x04,0x04,0x04,0xFC,0x00,0x00,
0x01,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,
/*--  文字:  都  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x20,0x24,0x24,0xA4,0x7F,0x24,0x34,0x28,0x26,0x20,0xFE,0x02,0x22,0xDA,0x06,0x00,
0x04,0x02,0xFF,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0xFF,0x08,0x10,0x08,0x07,0x00,
/*--  文字:  是  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x00,0x7F,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x7F,0x00,0x00,0x00,0x00,
0x81,0x41,0x21,0x1D,0x21,0x41,0x81,0xFF,0x89,0x89,0x89,0x89,0x89,0x81,0x81,0x00,
/*--  文字:  好  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00,
0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00
};
int main(void)
{  
u8 i = 0;
Stm32_Clock_Init(9); //系统时钟设置8MHz * 9 = 72MHz
delay_init(72);    //延时初始化
 LCDPortSet();    //LCD口设置
LcdInit();  //LCM初始化程序
delay_ms(100);
while(1)
{
LCD_DATA(0x55);
delay_us(10);
LCD_DATA(0xf0);
while(1)
{          
delay_ms(1000);
for(i=0;i<12;i++)
WriteChr16x16(0,i*16,table[i]);
for(i=0;i<12;i++)
WriteChr16x16(2,i*16,table[i]);
for(i=0;i<12;i++)
WriteChr16x16(4,i*16,table[i]);
for(i=0;i<12;i++)
WriteChr16x16(6,i*16,table[i]);
delay_ms(500);
}    
}  
}


关键字:stm32  19264液晶  LCD驱动 引用地址:stm32_19264液晶LCD驱动程序

上一篇:STM32控制TFTLCD显示
下一篇:STM32F429之LTDC驱动图解

推荐阅读最新更新时间:2024-03-16 16:04

深度解读STM32数据保存与毁灭
一、认识ADC兼进一步看懂STM的库 ADC是多少位的? 12位 ADC有多少个? 1个、2个或多至3个,视不同的器件而不同;每个又有多个通道。 关于通道的名堂: 10.3.3 通道选择 有16个多路通道。可以把转换分成两组:规则的和注入的。在任意多个通道上以任意顺序进行的一系列转换构成成组转换。例如,可以如下顺序完成转换:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15。 ● 规则组由多达16个转换组成。规则通道和它们的转换顺序在ADC_SQRx寄存器中选择。规则组中转换的总数写入ADC_SQR1寄存器的L[3:0]位中。 ● 注入组由多达4个转换组成。注入通道和它们的转换顺序在ADC_JSQR寄存器中选择。注入
[单片机]
主流32位单片机攻略连载:为什么要学STM32
为什么学习STM32?   先列举一下大家问得最多的几个问题,然后我们一起由问题切入进行一些讨论。   首先问题1:我是单片机好还是直接学STM32好呢?   答:1)首先我们谈下目的,你学习的最终目的是能够开发产品或者成为项目经理;而目前市场上的单片机都基本用C语言了,用汇编进行开发的项目已经非常少了   2)在硬件接口这个环节上都一样:学51单片机和学STM32都是一样的,主要看其市场上的资料是不是足够充分,都是调用硬件的接口,控制I/O,完成相应的功能   3)在软件这个环节上,STM32要强过51单片机:为什么这么说呢?学STM32它自带一个官方的库,而这个库的源代码是开放的;而51单片机却没有,也就说,当你
[单片机]
stm32 通用定时器 精确延时程序
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseStructure.TIM_Period = 1; //自动装载 TIM_TimeBaseStructure.TIM_Prescaler = 7200; //72M分频率到10KHz TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down; //向下计数 TIM_TimeBaseInit(TIM2, &TI
[单片机]
STM32位带操作的详解
1. 什么是位带操作以及STM32中位带操作的区域 什么是位带操作?简单来说就是通过宏定义封装一些操作,让你可以像51单片机上去操作IO口,从而不用麻烦的去配置各种寄存器,在STM32中有两个地方实现了位带。其中一个是 SRAM 区的最低 1MB 范围,第二个则是片内外设区的最低 1MB 范围。这两个区中的地址除了可以像普通的 RAM 一样使用外,它们还都有自己的“位带别名区”,位带别名区把每个比特膨胀成一个 32 位的字。当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的。 下图就是STM32中可以用于位带操作的区域了,片上SRAM的0x2000 0000到0x2010 0000和片上外设的0x4000 0000到
[单片机]
<font color='red'>STM32</font>位带操作的详解
STM32数模转换器的说明
使用STM32 micros的 模拟数字转换器(ADC) 后,接下来要处理的明显内部硬件模块是 数字到模拟转换器(DAC) 。顾名思义,该模块仅具有ADC的补充功能。它将数字二进制值转换为模拟电压输出。 DAC模块具有多种用途,包括音频生成,波形生成等。通常在大多数8位微控制器中,该模块不可用,并且 脉冲宽度调制(PWM)可以稍微满足其需求。 》 块。部分原因是由于它们的硬件资源和运行速度相对较低。所有STM32单片机都具有PWM模块,但大容量STM32也具有DAC模块。 STM32 DAC模块不是很复杂,并且在工作原理方面与ADC模块相似。下面的简化框图显示了STM32 DAC模块的主要组件。 再次请注意低密度STM32微处
[单片机]
<font color='red'>STM32</font>数模转换器的说明
stm32_HAL库中__weak修饰符
前言, 在 HAL 库中,很多回调函数前面使用__weak 修饰符。 weak 顾名思义是“弱”的意思,所以如果函数名称前面加上__weak 修饰符,我们一般称这个函数为“弱函数”。 加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数, 那么编译器就会执行__weak 声明的函数,并且编译器不会报错。 举个例子: 我们打开工程模板,找到并打开文件stm32f4xx_hal.c 文件,里面定义了一个函数 HAL_MspInit,定义如下: __weak void HAL_MspInit(void) { __IO
[单片机]
38. ADC实验
一。ADC通道与引脚的对应关系 二。常用库函数 三。ADC初始化函数 ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct); 例: 四。ADC使能函数,ADC使能软件转换函数 不使用外部触发,使用软件触发,所以调用使能软件转换函数。 五。实验步骤 void Adc_Init(void); // 完成步骤1--4 //初始化ADC //这里我们仅以规则通道为例 //我们默认将开启通道0~3 void Adc_Init(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_In
[单片机]
38. ADC实验
STM32串口之空闲中断
背景 在做Nbiot的一个路灯项目,NBiot模块一般都是串口接口,使用AT指令集,对接中国移动onenet平台。先用串口助手去测试,流程测试OK之后需要在MCU上重新写一遍。一开始用的STC15系列的MCU,然后跟平台之间对接协议很多,代码量较大,所以换到了STM32F1系列的MCU。 在STC15MCU上面通过串口接收数据只能老老实实用接收中断来做,每接收一帧数据都需要判断帧头帧尾,一帧结束再处理。之前就听说过STM32串口上面有帧中断,一直没有用过,然后才有了这篇博客。 备注:一帧数据是表示一个或多个字节组成的有含义的字符串。 STM32串口 IDLE中断 IDLE其实是 空闲的意思。IDLE中断叫空闲中断
[单片机]
<font color='red'>STM32</font>串口之空闲中断
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved