液晶型号:JLX12864G-290-PN不带字库

芯片型号:STM32F030F4

SPI连接方式:IO口模拟


STM32CubeMX  中引脚设置


JLX12864G_290_PN.h文件

#ifndef __JLX12864G_290_PN_H__
#define __JLX12864G_290_PN_H__

/* 包含头文件 ----------------------------------------------------------------*/
#include "stm32f0xx_hal.h"

/* 类型定义 --------------------------------------------------------------*/

/* 宏定义 --------------------------------------------------------------------*/
//#define uchar unsigned char 
//#define uint  unsigned int 
//#define ulong unsigned long

#define CS_H          HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_SET) // 输出高电平
#define CS_L          HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_RESET) // 输出低电平
#define RST_H         HAL_GPIO_WritePin(RST_GPIO_Port,RST_Pin,GPIO_PIN_SET) // 输出高电平
#define RST_L         HAL_GPIO_WritePin(RST_GPIO_Port,RST_Pin,GPIO_PIN_RESET) // 输出低电平
#define RS_H          HAL_GPIO_WritePin(RS_GPIO_Port,RS_Pin,GPIO_PIN_SET) // 输出高电平
#define RS_L          HAL_GPIO_WritePin(RS_GPIO_Port,RS_Pin,GPIO_PIN_RESET) // 输出低电平
#define SDA_H         HAL_GPIO_WritePin(SDA_GPIO_Port,SDA_Pin,GPIO_PIN_SET) // 输出高电平
#define SDA_L         HAL_GPIO_WritePin(SDA_GPIO_Port,SDA_Pin,GPIO_PIN_RESET) // 输出低电平
#define SCK_H         HAL_GPIO_WritePin(SCK_GPIO_Port,SCK_Pin,GPIO_PIN_SET) // 输出高电平
#define SCK_L         HAL_GPIO_WritePin(SCK_GPIO_Port,SCK_Pin,GPIO_PIN_RESET) // 输出低电平

/* 扩展变量 ------------------------------------------------------------------*/

/* 函数声明 ------------------------------------------------------------------*/
//void delay(int i); 
void delay_us(uint8_t i); 
void transfer_command(uint8_t data1);
void transfer_data(uint8_t data1);
void initial_lcd(void);
void lcd_address(uint8_t page,uint8_t column);
void clear_screen(void);
void full_display(uint8_t data_left,uint8_t data_right);
void display_graphic_32x32(uint8_t page,uint8_t column,uint8_t *dp);
void display_graphic_16x16(uint8_t page,uint8_t column,uint8_t reverse,uint8_t *dp);
void display_graphic_8x16(uint8_t page,uint8_t column,uint8_t *dp);
void display_string_8x16(uint16_t page,uint16_t column,uint8_t *text);
void display_string_5x7(uint16_t page,uint16_t column,uint8_t *text);
void disp_grap(uint8_t page,uint8_t column,uint8_t *dp);
#endif  // __JLX12864G_290_PN_H__


JLX12864G_290_PN.C文件

#include "JLX12864G_290_PN/JLX12864G_290_PN.H"

uint8_t ascii_table_8x16[95][16]; 
uint8_t ascii_table_5x7[95][5];

uint8_t cheng1[]={ 
/*-- 文字: 成 --*/ 
/*-- 宋体 23; 此字体下对应的点阵为:宽 x 高=31x31 --*/ 
/*-- 高度不是 8 的倍数,现调整为:宽度 x 高度=32x32 --*/ 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C, 
0xFC,0xFC,0x88,0x00,0x00,0x1C,0x78,0xF0,0xE0,0x00,0x80,0x80,0x00,0x00,0x00,0x00, 
0x00,0x00,0x00,0x00,0xFF,0xFF,0x83,0x83,0x83,0x83,0x83,0x83,0xC3,0xC3,0x03,0x1F, 
0xFF,0xFF,0x83,0x03,0x03,0x03,0xC3,0xF3,0xF3,0x63,0x03,0x03,0x00,0x00,0x00,0x00, 
0x00,0x00,0xFC,0xFF,0x3F,0x00,0x80,0x00,0x00,0x80,0xFF,0xFF,0x03,0x00,0x00,0x03, 
0x9F,0xFF,0xF8,0xF8,0xBE,0x1F,0x07,0x01,0x00,0x00,0xE0,0x20,0x00,0x00,0x20,0x38, 
0x1F,0x07,0x01,0x00,0x00,0x01,0x01,0x07,0x07,0x23,0x31,0x18,0x0C,0x0E,0x07,0x03, 
0x01,0x01,0x01,0x03,0x07,0x0F,0x0E,0x1C,0x1F,0x3F,0x30,0x00,0x00,0x00,0x00,0x00}; 
uint8_t gong1[]={ 
/*-- 文字: 功 --*/ 
/*-- 宋体 23; 此字体下对应的点阵为:宽 x 高=31x31 --*/ 
/*-- 高度不是 8 的倍数,现调整为:宽度 x 高度=32x32 --*/ 
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0xC0,0xC0,0x00, 
0x00,0x00,0x00,0xFE,0xFC,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x0C,0x04,0x04, 
0x04,0x84,0xFF,0xFF,0x04,0x04,0x04,0x04,0x04,0xFE,0xFE,0x04,0x00,0x00,0x00,0x00, 
0xC0,0xC0,0xC0,0xC0,0xE0,0x60,0x7F,0x3F,0x30,0x30,0x10,0x18,0x18,0x88,0xC0,0xF8, 
0x7F,0x1F,0x01,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x01, 
0x01,0x00,0x00,0x00,0x00,0x20,0x20,0x30,0x18,0x0C,0x0C,0x07,0x03,0x01,0x00,0x04, 
0x04,0x0C,0x0C,0x1C,0x38,0x3C,0x1F,0x0F,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

///*延时*/ 
//void delay(int i) 
//{ 
// int j,k; 
// for(j=0;j<i;j++) 
// for(k=0;k<110;k++); 
//} 
/*延时*/ 
void delay_us(uint8_t i) 

 int j,k; 
 for(j=0;j<i;j++) 
 for(k=0;k<1;k++); 
}

//void waitkey() 
//{ 
//  repeat: 
//    if(key==1) 
//      goto repeat; 
//    else 
//      HAL_Delay(1000);
     delay(1000); 
//}

/*写指令到 LCD 模块*/ 
void transfer_command(uint8_t data1) 

   char i; 
   CS_L; 
   RS_L; 
   for(i=0;i<8;i++) 
   { 
     SCK_L;
     delay_us(2); 
     if(data1&0x80) 
        SDA_H; 
      else
        SDA_L; 
     SCK_H; 
     delay_us(2); 
     data1=data1<<=1; 
   } 
   CS_H; 
}

/*写数据到 LCD 模块*/ 
void transfer_data(uint8_t data1) 

   char i; 
   CS_L;
   RS_H;
   for(i=0;i<8;i++) 
   { 
     SCK_L; 
     delay_us(1); 
     if(data1&0x80) 
       SDA_H; 
     else 
       SDA_L; 
     SCK_H; 
     delay_us(1); 
     data1=data1<<=1; 
   } 
   CS_H; 
}

/*LCD 模块初始化*/ 
void initial_lcd(void) 

//   CS_L;
   RST_L; /*低电平复位*/ 
   HAL_Delay(100); 
   RST_H; /*复位完毕*/ 
   HAL_Delay(100);  
   transfer_command(0xe2); /*软复位*/ 
   HAL_Delay(5);  
   transfer_command(0x2c); /*升压步聚 1*/ 
   HAL_Delay(5); 
   transfer_command(0x2e); /*升压步聚 2*/ 
   HAL_Delay(5); 
   transfer_command(0x2f); /*升压步聚 3*/ 
   HAL_Delay(5); 
   transfer_command(0x24); /*粗调对比度,可设置范围 0x20~0x27*/ 
   transfer_command(0x81); /*微调对比度*/ 
   transfer_command(0x2a); /*0x1a,微调对比度的值,可设置范围 0x00~0x3f*/ 
   transfer_command(0xa2); /*1/9 偏压比(bias)*/ 
   transfer_command(0xc8); /*行扫描顺序:从上到下*/ 
   transfer_command(0xa0); /*列扫描顺序:从左到右*/ 
   transfer_command(0x40); /*起始行:第一行开始*/ 
   transfer_command(0xaf); /*开显示*/ 
//   CS_H;
}

void lcd_address(uint8_t page,uint8_t column) 

   column=column-1; //我们平常所说的第 1 列,在 LCD 驱动 IC 里是第 0 列。所以在这里减去 1. 
   page=page-1; 
   transfer_command(0xb0+page); //设置页地址。每页是 8 行。一个画面的 64 行被分成 8 个页。我们平常所说的第 1 页,在 LCD驱动 IC 里是第 0 页,所以在这里减去 1*/ 
   transfer_command(((column>>4)&0x0f)+0x10); //设置列地址的高 4 位 
   transfer_command(column&0x0f); //设置列地址的低 4 位 
}

/*全屏清屏*/ 
void clear_screen(void) 

   unsigned char i,j; 
   for(i=0;i<9;i++) 
   { 
     lcd_address(1+i,1); 
     for(j=0;j<132;j++) 
     { 
        transfer_data(0x00); 
     } 
   } 
}

//==================display a piture of 128*64 dots================ 
void full_display(uint8_t data_left,uint8_t data_right) 

   int i,j; 
   for(i=0;i<8;i++) 
   { 
     CS_L; 
     lcd_address(i+1,1); 
     for(j=0;j<64;j++) 
     { 
       transfer_data(data_left); 
       transfer_data(data_right); 
     } 
   } 
}

/*显示 32x32 点阵图像、汉字、生僻字或 32x32 点阵的其他图标*/ 
void display_graphic_32x32(uint8_t page,uint8_t column,uint8_t *dp) 

   uint8_t i,j; 
   for(j=0;j<4;j++) 
   { 
     lcd_address(page+j,column); 
     for (i=0;i<31;i++) 
     { 
       transfer_data(*dp); /*写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1*/ 
       dp++; 
     } 
   } 
}

/*显示 16x16 点阵图像、汉字、生僻字或 16x16 点阵的其他图标*/ 
void display_graphic_16x16(uint8_t page,uint8_t column,uint8_t reverse,uint8_t *dp) 

   uint8_t i,j; 
   for(j=0;j<2;j++) 
   { 
     lcd_address(page+j,column); 
     for (i=0;i<16;i++) 
     { 
       if(reverse==1) 
       { 
          transfer_data(*dp); /*写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1*/ 
       } 
       else 
          transfer_data(~*dp); 
       dp++; 
     } 
   } 
}

/*显示 8x16 点阵图像、ASCII, 或 8x16 点阵的自造字符、其他图标*/ 
void display_graphic_8x16(uint8_t page,uint8_t column,uint8_t *dp) 

   uint8_t i,j; 
   for(j=0;j<2;j++) 
   { 
     lcd_address(page+j,column); 
     for (i=0;i<8;i++) 
     { 
       transfer_data(*dp); /*写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1*/ 
       dp++; 
     } 
   } 
}

void display_string_8x16(uint16_t page,uint16_t column,uint8_t *text) 

   uint16_t i=0,j,k,n; 
   while(text[i]>0x00) 
   { 
      if((text[i]>=0x20)&&(text[i]<=0x7e)) 
       { 
         j=text[i]-0x20; 
         for(n=0;n<2;n++) 
         { 
           lcd_address(page+n,column); 
           for(k=0;k<8;k++) 
           { 
              transfer_data(ascii_table_8x16[j][k+8*n]);/*显示 5x7 的 ASCII 字到 LCD 上,y 为页地址,x 为列地址,最后为数据*/ 
           } 
         } 
         i++; 
         column+=8;        
       } 
       else 
         i++; 
   } 
}

void display_string_5x7(uint16_t page,uint16_t column,uint8_t *text) 

   uint16_t i=0,j,k; 
   while(text[i]>0x00) 
   { 
     if((text[i]>=0x20)&&(text[i]<0x7e)) 
     { 
       j=text[i]-0x20; 
       lcd_address(page,column); 
       for(k=0;k<5;k++) 
       { 
          transfer_data(ascii_table_5x7[j][k]);/*显示 5x7 的 ASCII 字到 LCD 上,y 为页地址,x 为列地址,最后为数据*/ 
       } 
       i++; 
       column+=6; 
     } 
     else 
     i++; 
   } 

//==================display a piture of 128*64 dots================ 
void disp_grap(uint8_t page,uint8_t column,uint8_t *dp) 

   int i,j; 
   for(i=0;i<8;i++) 
   { 
     lcd_address(page+i,column); 
     for(j=0;j<128;j++) 
     { 
       transfer_data(*dp); 
       dp++; 
     } 
   } 
}


main.c中写入如下代码:

效果:

晶联讯12864液晶+STM32+HAL库 IO模拟SPI成功实现显示。相关推荐

  1. STM32 HAL库 实现基于SPI模式的SD卡、TF卡FATS文件系统+模拟U盘的应用笔记

    前言 很多单片机不带SDIO接口,所以在使用SD卡时必须使用SPI模式进行读写. 想做一个基于SPI的SD卡文件系统读写SD卡上的文件,再配合USB接口做一个模拟U盘.只能利用业余时间慢慢更新,也不知 ...

  2. STM32 HAL库学习笔记4-SPI

    STM32 HAL库学习笔记4-SPI 前言 一.SPI协议简介 SPI物理层 SPI协议层 1.基本通讯过程 2. 通讯的起始和停止信号 3. 数据有效性 4. CPOL/CPHA 及通讯模式 二. ...

  3. STM32 HAL库PID控制电机 第二章 TB6612FNG芯片驱动GB37-520电机

    STM32 HAL库PID控制电机 第二章 TB6612FNG芯片驱动GB37-520电机(HAL库) 1 电路图 2 TB6612简介 TB6612是双驱动,可同时驱动两个电机 STBY:接单片机的 ...

  4. 基于STM32 HAL库的遥控小车

    目录 前言 一.材料清单 二.系统概述 三.硬件设计 1.HC-SR04超声波模块 2.HC-05/06蓝牙模块 3.L298n电机驱动模块 四.代码 1.引脚设置 2.遥控部分 3.超声波报警部分 ...

  5. STM32 HAL库学习笔记1-HAL库简介

    STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...

  6. stm32+HAL库制作转速仪

    stm32+HAL库制作转速仪 前言 电机在运行过程中,需要实时检测其转速的稳定性,有效反映电机的运行情况. 本文介绍了基于stm32的转速仪的设计,可以用光电门传感器和红外对管传感器测量,可以设置选 ...

  7. stm32 HAL库 Flash操作简介

    stm32 HAL库 Flash操作简介 目录 第一stm32,flash介绍 查看代码段,以判断代码长度 flash的基本操作规则 stm32 HAL库 Flash操作指南 stm32f1xx_ha ...

  8. STM32 HAL库 CubeMX教程(五)串口通信基础

    STM32 HAL库 CubeMX教程(五)串口通信基础 串口通信简介 CubeMX配置 初始化程序分析 程序编写 参考文献 STM32 HAL库 CubeMX系列教程 目录 串口通信简介 UART: ...

  9. STM32 HAL库

    STM32 HAL库 第三章 MDK5 软件入门 bug解决 关键文件介绍 程序仿真 User Keywords 语法提示 代码编辑/查看技巧 第四章 STM32F1 基础知识入门 MDK 下 C 语 ...

最新文章

  1. 优化汽车仪表板以实现高效渲染
  2. memcached(二)事件模型源码分析
  3. 【论文阅读----DDI(1)】MUFFIN: multi-scale feature fusion for drug–drug interaction prediction
  4. 5G NR — Massive MIMO 与波束赋形
  5. ps原始数据清理脚本_创建地形模型一步到位!PS最新2019全球首款3D地形生成插件送给你...
  6. LeetCode44 Wildcard Matching
  7. 比较重量 网易2016实习研发工程师编程题
  8. ODAC(V9.5.15) 学习笔记(四)TCustomDADataSet(2)
  9. java代码内创建mysql索引_点评阿里JAVA手册之MySQL数据库 (建表规约、索引规约、SQL语句、ORM映射)...
  10. Windows socket测试工具
  11. uni-app开发环境配置及混合开发流程
  12. 对称密钥密码体制的主要特点
  13. YUY与RGB格式区别
  14. 【bfs 反向建边】2016-2017 ACM-ICPC, Egyptian Collegiate Programming Contest (ECPC 16) Jumping
  15. 近端策略优化(proximal policy optimization)算法简述
  16. 如何看待985高校例如交大的材料专业的研究生找不到好工作?
  17. android点击按钮静音,android 实现一键静音功能
  18. 应届毕业生(程序员)如何工作更顺利、步步高升
  19. 杰理之实现 AUX 的功能【篇】
  20. MATLAB下载处理.nii文件资源包(NIfTI_20140122zip)

热门文章

  1. 趋势:TypeScript - 一种思维方式
  2. (几何方面:正六边形面积)编写一个程序,提示用户输入正六边形的边长并显示它的面积。
  3. Win10 不支持 Miracast 无法投影解决方案
  4. 直播APP搭建常见难点的解决方案
  5. Ubuntu系统配置花生壳内网穿透
  6. 抓包分析,一条Linux命令实现路由器自动登录深大校园网认证(Drcom Pt版)
  7. 华为人报:实事求是科研方向与20年艰苦努力
  8. Reflections 反射api使用总结
  9. OC : NSMeasurement (物理单位换算)
  10. 计算机桌面进入安全模式,win7安全模式无法入桌面怎么办?无法进入桌面解法...