Error[8]: Undefined offset: 4157, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

1.背景说明

最近在搞一个DTU 的小项目,使用的是中移动的ML302,关于ML302的相关资料,在中移动的官网(http://iot.10086.cn 、http://onemo10086.com)上就有很多教程,而且配套的openCPU SDK里面也有相关的demo示例,一般应付大部分的开发都没有问题了

在我开发的时候,被安排配置一款LCD的屏,我查了一下openCPU里有自带的lcd接口,按照一般的剧情发展,硬件参考硬件设计,软件参考lcd接口开发,十拿九稳的事情,有什么好写的。


但是这次硬件剑走偏锋,没有接在lcd的硬件引脚上,而且普通的GPIO上,GPIO需要模拟SPI进行与屏的通信,进而点亮屏幕。


第一次这样开发 *** 作,收获颇多,必须记录一下。


当时没有拍照,实物就是如图我点亮时候的拍的

2.SPI简介

SPI(Serial Peripheral Interface)是串行外围接口,是Motorola 首先在MC68HCXX 系列处理器上定义的,是一种高速、全双工、同步的通信总线,主要应用在EEPROM、FLASH、实时时钟、AD 转换器,还有数字信号处理器和数字信号解码器之间

SPI总线是一种4线总线,通常由一个主模块和一个或者多个从模块组成,主模块选择一个从模块进行同步通信,从而完成数据的交互。


其是一个环形结构,以主从方式工作,通信时需要至少4根线

当有多个SPI 从设备与SPI 主机相连时,采用“三加一”的连接方式,如下:
(1) 设备的其它信号线SCLK、MOSI及MISO 同时并联到相同的SPI 总线上,即无论有多少个从设备,都共同只使用这3 条总线;
(2) 每个从设备都有独立的这一条CS 信号线,CS信号线独占主机的一个引脚,即有多少个从设备,就有多少条CS信号线。



综上可知,SPI 通信以CS 线置低电平为开始信号,以CS 线被拉高作为结束信号。


主机与从机连接方式如下图所示:

以Cat.1模组 ML302为例,SPI主设备与从机连接示意图如下:

(上述简介引用中移动官方SPI接口介绍)

3.配置流程 3.1 查阅屏资料

配置屏幕,当然是先把屏的资料看一遍先,首先重点关注一下屏的相关引脚与引脚的定义。


如下图所示

3.2 查看项目硬件原理图

查看硬件原理图一般先从屏接口座子开始看,一直看到ML302主控上面,看看接的是什么脚


3.3 ML302引脚资料查看

然后查看官方给的ML302资料,看看相关硬件接的引脚在openCPU里面对应的分别为多少,以便于后面研发编写代码

4.代码的编写 4.1 查看与熟悉GPIO接口 4.2 GPIO模拟SPI编写 定义相关宏
#define LcmXPixel 128 //横向宽度 
#define LcmYPixel 64 //纵向高度

#define SPI_SCK_PIN     CM_GPIO_3//GPIO_Pin_22
#define SPI_MOSI_PIN    CM_GPIO_2//GPIO_Pin_21
#define SPI_A0_PIN      CM_GPIO_1//GPIO_Pin_23
#define SPI_CS_PIN      CM_GPIO_0//GPIO_Pin_24
#define LCD_RST         CM_GPIO_11//GPIO_Pin_12

#define SCK_H           cm_gpio_write(SPI_SCK_PIN,CM_GPIO_HIGH);
#define SCK_L           cm_gpio_write(SPI_SCK_PIN,CM_GPIO_LOW);

#define MOSI_H          cm_gpio_write(SPI_MOSI_PIN,CM_GPIO_HIGH);
#define MOSI_L          cm_gpio_write(SPI_MOSI_PIN,CM_GPIO_LOW);

#define A0_H            cm_gpio_write(SPI_A0_PIN,CM_GPIO_HIGH);
#define A0_L            cm_gpio_write(SPI_A0_PIN,CM_GPIO_LOW);

#define CS_H            cm_gpio_write(SPI_CS_PIN,CM_GPIO_HIGH);
#define CS_L            cm_gpio_write(SPI_CS_PIN,CM_GPIO_LOW);

#define RST_H           cm_gpio_write(LCD_RST,CM_GPIO_HIGH);
#define RST_L           cm_gpio_write(LCD_RST,CM_GPIO_LOW);
初始化相关GPIO口
cm_gpio_cfg_t cfg_sck,cfg_si,cfg_ao,cfg_cs,cfg_rst;

static void lcd_hal_init(void)
{
	cfg_sck.id=SPI_SCK_PIN,cfg_sck.dir=CM_GPIO_OUT,cfg_sck.irq_enable = 0;
	cfg_si.id=SPI_MOSI_PIN,cfg_si.dir=CM_GPIO_OUT,cfg_si.irq_enable = 0;
	cfg_ao.id=SPI_A0_PIN,cfg_ao.dir=CM_GPIO_OUT,cfg_ao.irq_enable = 0;
	cfg_cs.id=SPI_CS_PIN,cfg_cs.dir=CM_GPIO_OUT,cfg_cs.irq_enable = 0;
	cfg_rst.id=LCD_RST,cfg_rst.dir=CM_GPIO_OUT,cfg_rst.irq_enable = 0;
	cm_gpio_init(&cfg_sck);
	cm_gpio_init(&cfg_si);
	cm_gpio_init(&cfg_ao);
	cm_gpio_init(&cfg_cs);
	cm_gpio_init(&cfg_rst);
    CS_H
}
LCD复位
static void lcd_reset(void)
{
    RST_H
    osDelay(1000);
    RST_L
    osDelay(1000);
}
LCD写指令
void lcd_write_com(uint8_t com)
{
	uint8_t i;

	SCK_H//第一个需要是下降沿
    A0_L//COMM  0是写指令
    CS_L//拉低片选
    for( i = 0; i < 8; i++ )
    {
        SCK_H//下降沿准备数据
        SCK_L//下降沿准备数据
        if( com & 0x80 )//1000 0000
         {
            MOSI_H;
         }
        else
         {
            MOSI_L;
         }
        SCK_L//上升沿采样数据
        SCK_H//上升沿采样数据
        com <<= 1;
    }

    CS_H//释放片选
    SCK_H
}
LCD写数据
void lcd_write_data(uint8_t data)
{
	uint8_t i;

    SCK_H//第一个需要是下降沿
    A0_H//COMM  1是写数据
    CS_L//拉低片选
    for( i = 0; i < 8; i++ )
    {
        SCK_H//下降沿准备数据
        SCK_L//下降沿准备数据
        if( data & 0x80 )//1000 0000
        {
            MOSI_H;
        }
        else
        {
            MOSI_L;
        }
        SCK_L//上升沿采样数据
        SCK_H//上升沿采样数据
        data <<= 1;
    }
    CS_H//释放片选
    SCK_H
}
5. demo code

最后附上全部的点屏代码,供学习参考,以上如有不对的地方,麻烦请指正了

LCD.c
#include "lcd.h"
#include "cm/cm_gpio.h"

#define LcmXPixel 128 //横向宽度 
#define LcmYPixel 64 //纵向高度

#define SPI_SCK_PIN     CM_GPIO_3//GPIO_Pin_22
#define SPI_MOSI_PIN    CM_GPIO_2//GPIO_Pin_21
#define SPI_A0_PIN      CM_GPIO_1//GPIO_Pin_23
#define SPI_CS_PIN      CM_GPIO_0//GPIO_Pin_24
#define LCD_RST         CM_GPIO_11//GPIO_Pin_12

#define SCK_H           cm_gpio_write(SPI_SCK_PIN,CM_GPIO_HIGH);
#define SCK_L           cm_gpio_write(SPI_SCK_PIN,CM_GPIO_LOW);

#define MOSI_H          cm_gpio_write(SPI_MOSI_PIN,CM_GPIO_HIGH);
#define MOSI_L          cm_gpio_write(SPI_MOSI_PIN,CM_GPIO_LOW);

#define A0_H            cm_gpio_write(SPI_A0_PIN,CM_GPIO_HIGH);
#define A0_L            cm_gpio_write(SPI_A0_PIN,CM_GPIO_LOW);

#define CS_H            cm_gpio_write(SPI_CS_PIN,CM_GPIO_HIGH);
#define CS_L            cm_gpio_write(SPI_CS_PIN,CM_GPIO_LOW);

#define RST_H           cm_gpio_write(LCD_RST,CM_GPIO_HIGH);
#define RST_L           cm_gpio_write(LCD_RST,CM_GPIO_LOW);

cm_gpio_cfg_t cfg_sck,cfg_si,cfg_ao,cfg_cs,cfg_rst;

/* ASICC 字库代码 8x16 点阵 */ 
unsigned char ASCIIchardot[16*96] = { 
/*-- 文字:    --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
/*-- 文字: ! --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x0E,0x1F,0x1F,0x0E,0x00,0x00,0x00,0x00,0x00,0xB0,0xB0,0x00,0x00,0x00, 
/*-- 文字: " --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1C,0x1C,0x00,0x00,0x1C,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
/*-- 文字: # --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x04,0x1F,0x1F,0x04,0x1F,0x1F,0x04,0x00,0x40,0xF0,0xF0,0x40,0xF0,0xF0,0x40, 
/*-- 文字: $ --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x0C,0x1E,0x73,0x71,0x18,0x08,0x00,0x00,0x20,0x30,0x1C,0x9C,0xF0,0x60,0x00, 
/*-- 文字: % --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x18,0x3C,0x24,0x3D,0x1B,0x06,0x0C,0x00,0x00,0x60,0xC0,0xB0,0x78,0x48,0x78,0x30, 
/*-- 文字: & --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x0D,0x1F,0x12,0x1E,0x0C,0x00,0x00,0x00,0xE0,0xF0,0x10,0x90,0xE0,0xF0,0x90, 
/*-- 文字: ' --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x00,0x1C,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
/*-- 文字: ( --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x03,0x0F,0x1C,0x10,0x00,0x00,0x00,0x00,0xE0,0xF8,0x1C,0x04,0x00,0x00, 
/*-- 文字: ) --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x10,0x1C,0x0F,0x03,0x00,0x00,0x00,0x00,0x04,0x1C,0xF8,0xE0,0x00,0x00, 
/*-- 文字: * --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x01,0x05,0x07,0x03,0x07,0x05,0x01,0x00,0x00,0x40,0xC0,0x80,0xC0,0x40,0x00, 
/*-- 文字: + --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x01,0x01,0x07,0x07,0x01,0x01,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00, 
/*-- 文字: , --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x3C,0x38,0x00,0x00, 
/*-- 文字: - --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
/*-- 文字: . --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00, 
/*-- 文字: / --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x00,0x01,0x07,0x1E,0x18,0x00,0x00,0x18,0x78,0xE0,0x80,0x00,0x00,0x00, 
/*-- 文字: 0 --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x0F,0x1F,0x10,0x16,0x1F,0x0F,0x00,0x00,0xE0,0xF0,0xD0,0x10,0xF0,0xE0, 
/*-- 文字: 1 --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x04,0x04,0x0C,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x00, 
/*-- 文字: 2 --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x0C,0x1C,0x10,0x11,0x1F,0x0E,0x00,0x00,0x30,0x70,0xD0,0x90,0x10,0x10,0x00, 
/*-- 文字: 3 --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x0C,0x1C,0x11,0x11,0x1F,0x0E,0x00,0x00,0x60,0x70,0x10,0x10,0xF0,0xE0,0x00, 
/*-- 文字: 4 --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x1F,0x1F,0x00,0x07,0x07,0x00,0x00,0xC0,0xC0,0x40,0x40,0xF0,0xF0,0x40, 
/*-- 文字: 5 --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x11,0x11,0x11,0x10,0x00,0x00,0x10,0x10,0x10,0x30,0xE0,0xC0,0x00, 
/*-- 文字: 6 --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x03,0x07,0x1E,0x1A,0x13,0x01,0x00,0x00,0xE0,0xF0,0x10,0x10,0xF0,0xE0,0x00, 
/*-- 文字: 7 --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x10,0x10,0x11,0x17,0x1E,0x18,0x00,0x00,0x00,0x70,0xF0,0x80,0x00,0x00,0x00, 
/*-- 文字: 8 --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x0E,0x1F,0x13,0x11,0x1F,0x0E,0x00,0x00,0xE0,0xF0,0x10,0x90,0xF0,0xE0,0x00, 
/*-- 文字: 9 --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x0F,0x1F,0x10,0x10,0x1F,0x0F,0x00,0x00,0x00,0x90,0xB0,0xF0,0xC0,0x80,0x00, 
/*-- 文字: : --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x00,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00, 
/*-- 文字: ; --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x00,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x34,0x3C,0x38,0x00,0x00, 
/*-- 文字: < --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x01,0x03,0x06,0x0C,0x18,0x10,0x00,0x00,0x00,0x80,0xC0,0x60,0x30,0x10,0x00, 
/*-- 文字: = --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00, 
/*-- 文字: > --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x10,0x18,0x0C,0x06,0x03,0x01,0x00,0x00,0x10,0x30,0x60,0xC0,0x80,0x00,0x00, 
/*-- 文字: ? --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x0C,0x1C,0x11,0x13,0x1E,0x0C,0x00,0x00,0x00,0x00,0xB0,0xB0,0x00,0x00,0x00, 
/*-- 文字: @ --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x0F,0x1F,0x10,0x11,0x13,0x12,0x1F,0x0F,0xE0,0xF0,0x10,0x90,0xD0,0x50,0xD0,0xD0, 
/*-- 文字: A --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x07,0x0F,0x18,0x18,0x0F,0x07,0x00,0x00,0xF0,0xF0,0x80,0x80,0xF0,0xF0,0x00, 
/*-- 文字: B --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x11,0x11,0x1F,0x0E,0x00,0x00,0xF0,0xF0,0x10,0x10,0xF0,0xE0,0x00, 
/*-- 文字: C --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x0F,0x1F,0x10,0x10,0x1C,0x0C,0x00,0x00,0xE0,0xF0,0x10,0x10,0x70,0x60,0x00, 
/*-- 文字: D --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x10,0x18,0x0F,0x07,0x00,0x00,0xF0,0xF0,0x10,0x30,0xE0,0xC0,0x00, 
/*-- 文字: E --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x11,0x11,0x11,0x10,0x00,0x00,0xF0,0xF0,0x10,0x10,0x10,0x10,0x00, 
/*-- 文字: F --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x11,0x11,0x11,0x10,0x00,0x00,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00, 
/*-- 文字: G --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x0F,0x1F,0x10,0x10,0x1C,0x0C,0x00,0x00,0xE0,0xF0,0x10,0x90,0xF0,0xF0,0x00, 
/*-- 文字: H --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x01,0x01,0x1F,0x1F,0x00,0x00,0xF0,0xF0,0x00,0x00,0xF0,0xF0,0x00, 
/*-- 文字: I --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x10,0x1F,0x1F,0x10,0x00,0x00,0x00,0x00,0x10,0xF0,0xF0,0x10,0x00,0x00, 
/*-- 文字: J --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x60,0x70,0x10,0x10,0xF0,0xE0,0x00, 
/*-- 文字: K --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x01,0x07,0x1E,0x18,0x00,0x00,0xF0,0xF0,0x00,0xC0,0xF0,0x30,0x00, 
/*-- 文字: L --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x10,0x10,0x10,0x10,0x00, 
/*-- 文字: M --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x04,0x03,0x04,0x1F,0x1F,0x00,0xF0,0xF0,0x00,0x80,0x00,0xF0,0xF0, 
/*-- 文字: N --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x06,0x03,0x01,0x1F,0x1F,0x00,0xF0,0xF0,0x00,0x00,0x80,0xF0,0xF0, 
/*-- 文字: O --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x0F,0x1F,0x10,0x10,0x1F,0x0F,0x00,0x00,0xE0,0xF0,0x10,0x10,0xF0,0xE0,0x00, 
/*-- 文字: P --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x11,0x11,0x1F,0x0E,0x00,0x00,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00, 
/*-- 文字: Q --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x0F,0x1F,0x10,0x10,0x1F,0x0F,0x00,0x00,0xE0,0xF0,0x10,0x18,0xFC,0xE4,0x00, 
/*-- 文字: R --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x11,0x11,0x1F,0x0E,0x00,0x00,0xF0,0xF0,0x00,0x80,0xF0,0x70,0x00, 
/*-- 文字: S --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x0C,0x1E,0x13,0x11,0x18,0x08,0x00,0x00,0x20,0x30,0x10,0x90,0xF0,0x60,0x00, 
/*-- 文字: T --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x10,0x10,0x1F,0x1F,0x10,0x10,0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x00,0x00, 
/*-- 文字: U --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x00,0x00,0x1F,0x1F,0x00,0x00,0xE0,0xF0,0x10,0x10,0xF0,0xE0,0x00, 
/*-- 文字: V --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x00,0x00,0x1F,0x1F,0x00,0x00,0xC0,0xE0,0x30,0x30,0xE0,0xC0,0x00, 
/*-- 文字: W --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x00,0x03,0x00,0x1F,0x1F,0x00,0x80,0xF0,0x70,0x80,0x70,0xF0,0x80, 
/*-- 文字: X --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x18,0x1C,0x07,0x03,0x1C,0x18,0x00,0x00,0x70,0xF0,0x00,0x80,0xF0,0x70,0x00, 
/*-- 文字: Y --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1E,0x1F,0x01,0x01,0x1F,0x1E,0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x00,0x00, 
/*-- 文字: Z --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x10,0x10,0x11,0x13,0x1E,0x1C,0x00,0x00,0x70,0xF0,0x90,0x10,0x10,0x10,0x00, 
/*-- 文字: [ --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x1F,0x1F,0x10,0x10,0x00,0x00,0x00,0x00,0xFE,0xFE,0x02,0x02,0x00,0x00, 
/*-- 文字: \ --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x18,0x1E,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0x78,0x18,0x00, 
/*-- 文字: ] --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x10,0x10,0x1F,0x1F,0x00,0x00,0x00,0x00,0x02,0x02,0xFE,0xFE,0x00,0x00, 
/*-- 文字: ^ --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x10,0x30,0x60,0x60,0x30,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
/*-- 文字: _ --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 
/*-- 文字: ` --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x40,0x60,0x70,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
/*-- 文字: a --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x04,0x04,0x04,0x07,0x03,0x00,0x00,0x60,0xF0,0x90,0x90,0xF0,0xF0,0x00, 
/*-- 文字: b --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x04,0x04,0x07,0x03,0x00,0x00,0xF0,0xF0,0x10,0x10,0xF0,0xE0,0x00, 
/*-- 文字: c --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x03,0x07,0x04,0x04,0x06,0x02,0x00,0x00,0xE0,0xF0,0x10,0x10,0x30,0x20,0x00, 
/*-- 文字: d --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x03,0x07,0x04,0x04,0x1F,0x1F,0x00,0x00,0xE0,0xF0,0x10,0x10,0xF0,0xF0,0x00, 
/*-- 文字: e --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x03,0x07,0x04,0x04,0x07,0x03,0x00,0x00,0xE0,0xF0,0x90,0x90,0x90,0x80,0x00, 
/*-- 文字: f --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x01,0x0F,0x1F,0x11,0x11,0x11,0x00,0x00,0x00,0xF0,0xF0,0x00,0x00,0x00,0x00, 
/*-- 文字: g --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x03,0x07,0x04,0x04,0x07,0x07,0x00,0x00,0xE2,0xF2,0x12,0x12,0xFE,0xFC,0x00, 
/*-- 文字: h --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x04,0x04,0x07,0x03,0x00,0x00,0xF0,0xF0,0x00,0x00,0xF0,0xF0,0x00, 
/*-- 文字: i --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x04,0x04,0x37,0x37,0x00,0x00,0x00,0x00,0x10,0x10,0xF0,0xF0,0x10,0x10,0x00, 
/*-- 文字: j --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x04,0x04,0x37,0x37,0x00,0x00,0x00,0x02,0x02,0x02,0xFE,0xFC,0x00,0x00, 
/*-- 文字: k --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x00,0x01,0x07,0x06,0x00,0x00,0xF0,0xF0,0x80,0xC0,0x70,0x30,0x00, 
/*-- 文字: l --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x10,0x10,0x1F,0x1F,0x00,0x00,0x00,0x00,0x10,0x10,0xF0,0xF0,0x10,0x10,0x00, 
/*-- 文字: m --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x07,0x07,0x04,0x07,0x04,0x07,0x03,0x00,0xF0,0xF0,0x00,0xE0,0x00,0xF0,0xF0, 
/*-- 文字: n --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x07,0x07,0x04,0x04,0x07,0x03,0x00,0x00,0xF0,0xF0,0x00,0x00,0xF0,0xF0,0x00, 
/*-- 文字: o --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x03,0x07,0x04,0x04,0x07,0x03,0x00,0x00,0xE0,0xF0,0x10,0x10,0xF0,0xE0,0x00, 
/*-- 文字: p --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x07,0x07,0x04,0x04,0x07,0x03,0x00,0x00,0xFE,0xFE,0x10,0x10,0xF0,0xE0,0x00, 
/*-- 文字: q --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x03,0x07,0x04,0x04,0x07,0x07,0x00,0x00,0xE0,0xF0,0x10,0x10,0xFE,0xFE,0x00, 
/*-- 文字: r --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x07,0x07,0x01,0x02,0x06,0x06,0x00,0x00,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00, 
/*-- 文字: s --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x03,0x07,0x04,0x04,0x04,0x04,0x00,0x00,0x10,0x90,0x90,0x90,0xF0,0x60,0x00, 
/*-- 文字: t --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x04,0x1F,0x1F,0x04,0x04,0x04,0x00,0x00,0x00,0xE0,0xF0,0x10,0x10,0x10,0x00, 
/*-- 文字: u --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x07,0x07,0x00,0x00,0x07,0x07,0x00,0x00,0xE0,0xF0,0x10,0x10,0xF0,0xF0,0x00, 
/*-- 文字: v --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x07,0x07,0x00,0x00,0x07,0x07,0x00,0x00,0xC0,0xE0,0x30,0x30,0xE0,0xC0,0x00, 
/*-- 文字: w --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x07,0x07,0x00,0x03,0x00,0x07,0x07,0x00,0xC0,0xF0,0x30,0xC0,0x30,0xF0,0xC0, 
/*-- 文字: x --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x06,0x07,0x01,0x01,0x07,0x06,0x00,0x00,0x30,0x70,0xC0,0xC0,0x70,0x30,0x00, 
/*-- 文字: y --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x07,0x07,0x00,0x00,0x07,0x07,0x00,0x02,0xE2,0xF2,0x16,0x1C,0xF8,0xE0,0x00, 
/*-- 文字: z --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x04,0x04,0x04,0x05,0x07,0x06,0x00,0x00,0x30,0x70,0xD0,0x90,0x10,0x10,0x00, 
/*-- 文字: { --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x01,0x0F,0x1E,0x10,0x00,0x00,0x00,0x80,0xC0,0x78,0x3C,0x04,0x00,0x00, 
/*-- 文字: | --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x00,0x00,0x00, 
/*-- 文字: } --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x10,0x1E,0x0F,0x01,0x00,0x00,0x00,0x00,0x04,0x3C,0x78,0xC0,0x80,0x00, 
/*-- 文字: ~ --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x0C,0x18,0x10,0x18,0x0C,0x04,0x0C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
/*-- 文字:   --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x00,0x00,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0x00, 
};

static void lcd_hal_init(void)
{
	cfg_sck.id=SPI_SCK_PIN,cfg_sck.dir=CM_GPIO_OUT,cfg_sck.irq_enable = 0;
	cfg_si.id=SPI_MOSI_PIN,cfg_si.dir=CM_GPIO_OUT,cfg_si.irq_enable = 0;
	cfg_ao.id=SPI_A0_PIN,cfg_ao.dir=CM_GPIO_OUT,cfg_ao.irq_enable = 0;
	cfg_cs.id=SPI_CS_PIN,cfg_cs.dir=CM_GPIO_OUT,cfg_cs.irq_enable = 0;
	cfg_rst.id=LCD_RST,cfg_rst.dir=CM_GPIO_OUT,cfg_rst.irq_enable = 0;
	cm_gpio_init(&cfg_sck);
	cm_gpio_init(&cfg_si);
	cm_gpio_init(&cfg_ao);
	cm_gpio_init(&cfg_cs);
	cm_gpio_init(&cfg_rst);
    CS_H
}

static void lcd_reset(void)
{
    RST_H
    osDelay(1000);
    RST_L
    osDelay(1000);
}

void lcd_write_com(uint8_t com)
{
	uint8_t i;

	SCK_H//第一个需要是下降沿
    A0_L//COMM  0是写指令
    CS_L//拉低片选
    for( i = 0; i < 8; i++ )
    {
        SCK_H//下降沿准备数据
        SCK_L//下降沿准备数据
        if( com & 0x80 )//1000 0000
         {
            MOSI_H;
         }
        else
         {
            MOSI_L;
         }
        SCK_L//上升沿采样数据
        SCK_H//上升沿采样数据
        com <<= 1;
    }

    CS_H//释放片选
    SCK_H
}

void lcd_write_data(uint8_t data)
{
	uint8_t i;

    SCK_H//第一个需要是下降沿
    A0_H//COMM  1是写数据
    CS_L//拉低片选
    for( i = 0; i < 8; i++ )
    {
        SCK_H//下降沿准备数据
        SCK_L//下降沿准备数据
        if( data & 0x80 )//1000 0000
        {
            MOSI_H;
        }
        else
        {
            MOSI_L;
        }
        SCK_L//上升沿采样数据
        SCK_H//上升沿采样数据
        data <<= 1;
    }
    CS_H//释放片选
    SCK_H
}

void lcd_clear_screen()
{
    uint8_t i,j;
    for(i = 0; i < 8; i++)
    {
        CS_L;
        lcd_write_com(0x40);
        lcd_write_com(0xb0 + i);    //SET PAGE 0---8
        lcd_write_com(0x10);        //SET COLUMN MSB
        lcd_write_com(0x00);        //SET CLUMN LSB
        for(j = 0; j < 128; j++)
        {
            lcd_write_data(0xff);
        }
    }
}

void lcd_init(void)
{
    lcd_hal_init();
    lcd_reset();
    lcd_write_com(0xa2);
    lcd_write_com(0xD1);
    lcd_write_com(0xa0);
    lcd_write_com(0xc8);
    lcd_write_com(0xa6);
    lcd_write_com(0x2f);
    lcd_write_com(0x25);
    lcd_write_com(0x81);
    lcd_write_com(18);
    lcd_write_com(0x40);
    lcd_write_com(0xaf);
    lcd_clear_screen();
}

void lcd_deinit(void)
{
    cm_gpio_deinit(LCD_RST);
	cm_gpio_deinit(SPI_CS_PIN);
	cm_gpio_deinit(SPI_A0_PIN);
	cm_gpio_deinit(SPI_SCK_PIN);
	cm_gpio_deinit(SPI_MOSI_PIN);
}

uint8_t lcd_buf[1024];

uint8_t ComTable[8]={3,2,1,0,7,6,5,4};//设置行表,如想显示在第三行,实际上代码是用ComTable[3&0x07]=00000111

void LcmPutChar(uint8_t col,uint8_t page,uint8_t Order) //显示 ASICC 字符的函数   参数1起始x像素(0~127);参数2起始y行(0~7);参数3(字模起始地址)
{
    uint8_t i;
    uint32_t x;
    //(Order-0x20)*0x10这个式子是用来计算含有整个SCII码表的地址的。


x = (Order-0x20)*0x10; //ASICC 字符从 0x20 开始,每个 16 byte lcd_write_com(ComTable[page&0x07]|0xB0); //Set Page Address 设置页地址 lcd_write_com( ((col+1)>>4) | 0x10); //Set Column Address High Byte lcd_write_com( (col+1)&0x0F ); //Low Byte Colum from S128 -> S1 auto add for(i=0;i<8;i++) { lcd_write_data( ASCIIchardot[x] ); x++; } page++; //下半字符 page+1 lcd_write_com(ComTable[page&0x07]|0xB0); //Set Page Address lcd_write_com( ((col+1)>>4) | 0x10); //Set Column Address High Byte lcd_write_com( (col+1)&0x0F ); //Low Byte Colum from S128 -> S1 auto add for(i=0;i<8;i++) { lcd_write_data( ASCIIchardot[x] ); x++; } page--; //写完一个字符 page 还原 } } //显示字符串的函数 void LcmPutStr(uint8_t col,uint8_t page,uint8_t *puts) { while(*puts != ')'//判断字符串时候显示完毕 if { ((col>-LcmXPixel8))//判断行末空间是否足够放一个字符,自动换行 = { page+page2;= col0;} if ((page>/LcmYPixel8-2))//到了屏幕最下角,自动返回左上角 = { page0;= col0;} LcmPutChar (,col,page*)puts;++ puts;= col+col8;//下一个字符 8 列之后 } } void lcd_proc (void)LcmPutStr { (0,0,"ABCDEFG");LcmPutStr (0,2,"1234567");} ifndef

LCD.h
#define __LCD_H__
#typedef __LCD_H__

unsigned char ;       uint8_ttypedef
signed char ;         int8_ttypedef
unsigned short ;      uint16_ttypedef
signed short ;        int16_ttypedef
unsigned int ;        uint32_ttypedef
signed int ;          int32_ttypedef
unsigned long int ;   uint64_ttypedef
signed long int ;     int64_ttypedef
unsigned int ;        uintptr_t//初始化LCD屏

void
lcd_init (void);//关闭屏,关闭释放GPIO口
void
lcd_deinit (void);//显示 *** 作演示
void
lcd_proc (void);endif

#[+++]
)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
ML302 GPIO模拟SPI适配LX12864T5B屏_PHP_内存溢出

ML302 GPIO模拟SPI适配LX12864T5B屏

ML302 GPIO模拟SPI适配LX12864T5B屏,第1张

1.背景说明

最近在搞一个DTU 的小项目,使用的是中移动的ML302,关于ML302的相关资料,在中移动的官网(http://iot.10086.cn 、http://onemo10086.com)上就有很多教程,而且配套的openCPU SDK里面也有相关的demo示例,一般应付大部分的开发都没有问题了

在我开发的时候,被安排配置一款LCD的屏,我查了一下openCPU里有自带的lcd接口,按照一般的剧情发展,硬件参考硬件设计,软件参考lcd接口开发,十拿九稳的事情,有什么好写的。


但是这次硬件剑走偏锋,没有接在lcd的硬件引脚上,而且普通的GPIO上,GPIO需要模拟SPI进行与屏的通信,进而点亮屏幕。


第一次这样开发 *** 作,收获颇多,必须记录一下。


当时没有拍照,实物就是如图我点亮时候的拍的

2.SPI简介

SPI(Serial Peripheral Interface)是串行外围接口,是Motorola 首先在MC68HCXX 系列处理器上定义的,是一种高速、全双工、同步的通信总线,主要应用在EEPROM、FLASH、实时时钟、AD 转换器,还有数字信号处理器和数字信号解码器之间

SPI总线是一种4线总线,通常由一个主模块和一个或者多个从模块组成,主模块选择一个从模块进行同步通信,从而完成数据的交互。


其是一个环形结构,以主从方式工作,通信时需要至少4根线

  • MISO:主设备输入/从设备输出
    主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为:从机到主机

  • MOSI:主设备输出/从设备输入
    主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为:主机到从机

  • SCLK:时钟信号线
    它由主设备控制,用于通信数据同步,其决定了通信的速率,不同的设备支持的最高时钟频率不一样,两个设备之间通讯时,通讯速率受限于低速设备

  • CS:从设备选择信号线
    常称为片选信号线,由主设备控制。


    当主机要选择从设备时,把该从设备的CS 信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行SPI 通信

当有多个SPI 从设备与SPI 主机相连时,采用“三加一”的连接方式,如下:
(1) 设备的其它信号线SCLK、MOSI及MISO 同时并联到相同的SPI 总线上,即无论有多少个从设备,都共同只使用这3 条总线;
(2) 每个从设备都有独立的这一条CS 信号线,CS信号线独占主机的一个引脚,即有多少个从设备,就有多少条CS信号线。



综上可知,SPI 通信以CS 线置低电平为开始信号,以CS 线被拉高作为结束信号。


主机与从机连接方式如下图所示:

以Cat.1模组 ML302为例,SPI主设备与从机连接示意图如下:

(上述简介引用中移动官方SPI接口介绍)

3.配置流程 3.1 查阅屏资料

配置屏幕,当然是先把屏的资料看一遍先,首先重点关注一下屏的相关引脚与引脚的定义。


如下图所示

3.2 查看项目硬件原理图

查看硬件原理图一般先从屏接口座子开始看,一直看到ML302主控上面,看看接的是什么脚


3.3 ML302引脚资料查看

然后查看官方给的ML302资料,看看相关硬件接的引脚在openCPU里面对应的分别为多少,以便于后面研发编写代码

4.代码的编写 4.1 查看与熟悉GPIO接口 4.2 GPIO模拟SPI编写 定义相关宏
#define LcmXPixel 128 //横向宽度 
#define LcmYPixel 64 //纵向高度

#define SPI_SCK_PIN     CM_GPIO_3//GPIO_Pin_22
#define SPI_MOSI_PIN    CM_GPIO_2//GPIO_Pin_21
#define SPI_A0_PIN      CM_GPIO_1//GPIO_Pin_23
#define SPI_CS_PIN      CM_GPIO_0//GPIO_Pin_24
#define LCD_RST         CM_GPIO_11//GPIO_Pin_12

#define SCK_H           cm_gpio_write(SPI_SCK_PIN,CM_GPIO_HIGH);
#define SCK_L           cm_gpio_write(SPI_SCK_PIN,CM_GPIO_LOW);

#define MOSI_H          cm_gpio_write(SPI_MOSI_PIN,CM_GPIO_HIGH);
#define MOSI_L          cm_gpio_write(SPI_MOSI_PIN,CM_GPIO_LOW);

#define A0_H            cm_gpio_write(SPI_A0_PIN,CM_GPIO_HIGH);
#define A0_L            cm_gpio_write(SPI_A0_PIN,CM_GPIO_LOW);

#define CS_H            cm_gpio_write(SPI_CS_PIN,CM_GPIO_HIGH);
#define CS_L            cm_gpio_write(SPI_CS_PIN,CM_GPIO_LOW);

#define RST_H           cm_gpio_write(LCD_RST,CM_GPIO_HIGH);
#define RST_L           cm_gpio_write(LCD_RST,CM_GPIO_LOW);
初始化相关GPIO口
cm_gpio_cfg_t cfg_sck,cfg_si,cfg_ao,cfg_cs,cfg_rst;

static void lcd_hal_init(void)
{
	cfg_sck.id=SPI_SCK_PIN,cfg_sck.dir=CM_GPIO_OUT,cfg_sck.irq_enable = 0;
	cfg_si.id=SPI_MOSI_PIN,cfg_si.dir=CM_GPIO_OUT,cfg_si.irq_enable = 0;
	cfg_ao.id=SPI_A0_PIN,cfg_ao.dir=CM_GPIO_OUT,cfg_ao.irq_enable = 0;
	cfg_cs.id=SPI_CS_PIN,cfg_cs.dir=CM_GPIO_OUT,cfg_cs.irq_enable = 0;
	cfg_rst.id=LCD_RST,cfg_rst.dir=CM_GPIO_OUT,cfg_rst.irq_enable = 0;
	cm_gpio_init(&cfg_sck);
	cm_gpio_init(&cfg_si);
	cm_gpio_init(&cfg_ao);
	cm_gpio_init(&cfg_cs);
	cm_gpio_init(&cfg_rst);
    CS_H
}
LCD复位
static void lcd_reset(void)
{
    RST_H
    osDelay(1000);
    RST_L
    osDelay(1000);
}
LCD写指令
void lcd_write_com(uint8_t com)
{
	uint8_t i;

	SCK_H//第一个需要是下降沿
    A0_L//COMM  0是写指令
    CS_L//拉低片选
    for( i = 0; i < 8; i++ )
    {
        SCK_H//下降沿准备数据
        SCK_L//下降沿准备数据
        if( com & 0x80 )//1000 0000
         {
            MOSI_H;
         }
        else
         {
            MOSI_L;
         }
        SCK_L//上升沿采样数据
        SCK_H//上升沿采样数据
        com <<= 1;
    }

    CS_H//释放片选
    SCK_H
}
LCD写数据
void lcd_write_data(uint8_t data)
{
	uint8_t i;

    SCK_H//第一个需要是下降沿
    A0_H//COMM  1是写数据
    CS_L//拉低片选
    for( i = 0; i < 8; i++ )
    {
        SCK_H//下降沿准备数据
        SCK_L//下降沿准备数据
        if( data & 0x80 )//1000 0000
        {
            MOSI_H;
        }
        else
        {
            MOSI_L;
        }
        SCK_L//上升沿采样数据
        SCK_H//上升沿采样数据
        data <<= 1;
    }
    CS_H//释放片选
    SCK_H
}
5. demo code

最后附上全部的点屏代码,供学习参考,以上如有不对的地方,麻烦请指正了

LCD.c
#include "lcd.h"
#include "cm/cm_gpio.h"

#define LcmXPixel 128 //横向宽度 
#define LcmYPixel 64 //纵向高度

#define SPI_SCK_PIN     CM_GPIO_3//GPIO_Pin_22
#define SPI_MOSI_PIN    CM_GPIO_2//GPIO_Pin_21
#define SPI_A0_PIN      CM_GPIO_1//GPIO_Pin_23
#define SPI_CS_PIN      CM_GPIO_0//GPIO_Pin_24
#define LCD_RST         CM_GPIO_11//GPIO_Pin_12

#define SCK_H           cm_gpio_write(SPI_SCK_PIN,CM_GPIO_HIGH);
#define SCK_L           cm_gpio_write(SPI_SCK_PIN,CM_GPIO_LOW);

#define MOSI_H          cm_gpio_write(SPI_MOSI_PIN,CM_GPIO_HIGH);
#define MOSI_L          cm_gpio_write(SPI_MOSI_PIN,CM_GPIO_LOW);

#define A0_H            cm_gpio_write(SPI_A0_PIN,CM_GPIO_HIGH);
#define A0_L            cm_gpio_write(SPI_A0_PIN,CM_GPIO_LOW);

#define CS_H            cm_gpio_write(SPI_CS_PIN,CM_GPIO_HIGH);
#define CS_L            cm_gpio_write(SPI_CS_PIN,CM_GPIO_LOW);

#define RST_H           cm_gpio_write(LCD_RST,CM_GPIO_HIGH);
#define RST_L           cm_gpio_write(LCD_RST,CM_GPIO_LOW);

cm_gpio_cfg_t cfg_sck,cfg_si,cfg_ao,cfg_cs,cfg_rst;

/* ASICC 字库代码 8x16 点阵 */ 
unsigned char ASCIIchardot[16*96] = { 
/*-- 文字:    --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
/*-- 文字: ! --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x0E,0x1F,0x1F,0x0E,0x00,0x00,0x00,0x00,0x00,0xB0,0xB0,0x00,0x00,0x00, 
/*-- 文字: " --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1C,0x1C,0x00,0x00,0x1C,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
/*-- 文字: # --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x04,0x1F,0x1F,0x04,0x1F,0x1F,0x04,0x00,0x40,0xF0,0xF0,0x40,0xF0,0xF0,0x40, 
/*-- 文字: $ --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x0C,0x1E,0x73,0x71,0x18,0x08,0x00,0x00,0x20,0x30,0x1C,0x9C,0xF0,0x60,0x00, 
/*-- 文字: % --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x18,0x3C,0x24,0x3D,0x1B,0x06,0x0C,0x00,0x00,0x60,0xC0,0xB0,0x78,0x48,0x78,0x30, 
/*-- 文字: & --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x0D,0x1F,0x12,0x1E,0x0C,0x00,0x00,0x00,0xE0,0xF0,0x10,0x90,0xE0,0xF0,0x90, 
/*-- 文字: ' --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x00,0x1C,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
/*-- 文字: ( --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x03,0x0F,0x1C,0x10,0x00,0x00,0x00,0x00,0xE0,0xF8,0x1C,0x04,0x00,0x00, 
/*-- 文字: ) --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x10,0x1C,0x0F,0x03,0x00,0x00,0x00,0x00,0x04,0x1C,0xF8,0xE0,0x00,0x00, 
/*-- 文字: * --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x01,0x05,0x07,0x03,0x07,0x05,0x01,0x00,0x00,0x40,0xC0,0x80,0xC0,0x40,0x00, 
/*-- 文字: + --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x01,0x01,0x07,0x07,0x01,0x01,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00, 
/*-- 文字: , --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x3C,0x38,0x00,0x00, 
/*-- 文字: - --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
/*-- 文字: . --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00, 
/*-- 文字: / --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x00,0x01,0x07,0x1E,0x18,0x00,0x00,0x18,0x78,0xE0,0x80,0x00,0x00,0x00, 
/*-- 文字: 0 --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x0F,0x1F,0x10,0x16,0x1F,0x0F,0x00,0x00,0xE0,0xF0,0xD0,0x10,0xF0,0xE0, 
/*-- 文字: 1 --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x04,0x04,0x0C,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x00, 
/*-- 文字: 2 --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x0C,0x1C,0x10,0x11,0x1F,0x0E,0x00,0x00,0x30,0x70,0xD0,0x90,0x10,0x10,0x00, 
/*-- 文字: 3 --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x0C,0x1C,0x11,0x11,0x1F,0x0E,0x00,0x00,0x60,0x70,0x10,0x10,0xF0,0xE0,0x00, 
/*-- 文字: 4 --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x1F,0x1F,0x00,0x07,0x07,0x00,0x00,0xC0,0xC0,0x40,0x40,0xF0,0xF0,0x40, 
/*-- 文字: 5 --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x11,0x11,0x11,0x10,0x00,0x00,0x10,0x10,0x10,0x30,0xE0,0xC0,0x00, 
/*-- 文字: 6 --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x03,0x07,0x1E,0x1A,0x13,0x01,0x00,0x00,0xE0,0xF0,0x10,0x10,0xF0,0xE0,0x00, 
/*-- 文字: 7 --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x10,0x10,0x11,0x17,0x1E,0x18,0x00,0x00,0x00,0x70,0xF0,0x80,0x00,0x00,0x00, 
/*-- 文字: 8 --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x0E,0x1F,0x13,0x11,0x1F,0x0E,0x00,0x00,0xE0,0xF0,0x10,0x90,0xF0,0xE0,0x00, 
/*-- 文字: 9 --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x0F,0x1F,0x10,0x10,0x1F,0x0F,0x00,0x00,0x00,0x90,0xB0,0xF0,0xC0,0x80,0x00, 
/*-- 文字: : --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x00,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00, 
/*-- 文字: ; --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x00,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x34,0x3C,0x38,0x00,0x00, 
/*-- 文字: < --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x01,0x03,0x06,0x0C,0x18,0x10,0x00,0x00,0x00,0x80,0xC0,0x60,0x30,0x10,0x00, 
/*-- 文字: = --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00, 
/*-- 文字: > --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x10,0x18,0x0C,0x06,0x03,0x01,0x00,0x00,0x10,0x30,0x60,0xC0,0x80,0x00,0x00, 
/*-- 文字: ? --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x0C,0x1C,0x11,0x13,0x1E,0x0C,0x00,0x00,0x00,0x00,0xB0,0xB0,0x00,0x00,0x00, 
/*-- 文字: @ --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x0F,0x1F,0x10,0x11,0x13,0x12,0x1F,0x0F,0xE0,0xF0,0x10,0x90,0xD0,0x50,0xD0,0xD0, 
/*-- 文字: A --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x07,0x0F,0x18,0x18,0x0F,0x07,0x00,0x00,0xF0,0xF0,0x80,0x80,0xF0,0xF0,0x00, 
/*-- 文字: B --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x11,0x11,0x1F,0x0E,0x00,0x00,0xF0,0xF0,0x10,0x10,0xF0,0xE0,0x00, 
/*-- 文字: C --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x0F,0x1F,0x10,0x10,0x1C,0x0C,0x00,0x00,0xE0,0xF0,0x10,0x10,0x70,0x60,0x00, 
/*-- 文字: D --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x10,0x18,0x0F,0x07,0x00,0x00,0xF0,0xF0,0x10,0x30,0xE0,0xC0,0x00, 
/*-- 文字: E --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x11,0x11,0x11,0x10,0x00,0x00,0xF0,0xF0,0x10,0x10,0x10,0x10,0x00, 
/*-- 文字: F --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x11,0x11,0x11,0x10,0x00,0x00,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00, 
/*-- 文字: G --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x0F,0x1F,0x10,0x10,0x1C,0x0C,0x00,0x00,0xE0,0xF0,0x10,0x90,0xF0,0xF0,0x00, 
/*-- 文字: H --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x01,0x01,0x1F,0x1F,0x00,0x00,0xF0,0xF0,0x00,0x00,0xF0,0xF0,0x00, 
/*-- 文字: I --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x10,0x1F,0x1F,0x10,0x00,0x00,0x00,0x00,0x10,0xF0,0xF0,0x10,0x00,0x00, 
/*-- 文字: J --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x60,0x70,0x10,0x10,0xF0,0xE0,0x00, 
/*-- 文字: K --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x01,0x07,0x1E,0x18,0x00,0x00,0xF0,0xF0,0x00,0xC0,0xF0,0x30,0x00, 
/*-- 文字: L --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x10,0x10,0x10,0x10,0x00, 
/*-- 文字: M --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x04,0x03,0x04,0x1F,0x1F,0x00,0xF0,0xF0,0x00,0x80,0x00,0xF0,0xF0, 
/*-- 文字: N --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x06,0x03,0x01,0x1F,0x1F,0x00,0xF0,0xF0,0x00,0x00,0x80,0xF0,0xF0, 
/*-- 文字: O --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x0F,0x1F,0x10,0x10,0x1F,0x0F,0x00,0x00,0xE0,0xF0,0x10,0x10,0xF0,0xE0,0x00, 
/*-- 文字: P --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x11,0x11,0x1F,0x0E,0x00,0x00,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00, 
/*-- 文字: Q --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x0F,0x1F,0x10,0x10,0x1F,0x0F,0x00,0x00,0xE0,0xF0,0x10,0x18,0xFC,0xE4,0x00, 
/*-- 文字: R --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x11,0x11,0x1F,0x0E,0x00,0x00,0xF0,0xF0,0x00,0x80,0xF0,0x70,0x00, 
/*-- 文字: S --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x0C,0x1E,0x13,0x11,0x18,0x08,0x00,0x00,0x20,0x30,0x10,0x90,0xF0,0x60,0x00, 
/*-- 文字: T --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x10,0x10,0x1F,0x1F,0x10,0x10,0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x00,0x00, 
/*-- 文字: U --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x00,0x00,0x1F,0x1F,0x00,0x00,0xE0,0xF0,0x10,0x10,0xF0,0xE0,0x00, 
/*-- 文字: V --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x00,0x00,0x1F,0x1F,0x00,0x00,0xC0,0xE0,0x30,0x30,0xE0,0xC0,0x00, 
/*-- 文字: W --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x00,0x03,0x00,0x1F,0x1F,0x00,0x80,0xF0,0x70,0x80,0x70,0xF0,0x80, 
/*-- 文字: X --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x18,0x1C,0x07,0x03,0x1C,0x18,0x00,0x00,0x70,0xF0,0x00,0x80,0xF0,0x70,0x00, 
/*-- 文字: Y --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1E,0x1F,0x01,0x01,0x1F,0x1E,0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x00,0x00, 
/*-- 文字: Z --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x10,0x10,0x11,0x13,0x1E,0x1C,0x00,0x00,0x70,0xF0,0x90,0x10,0x10,0x10,0x00, 
/*-- 文字: [ --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x1F,0x1F,0x10,0x10,0x00,0x00,0x00,0x00,0xFE,0xFE,0x02,0x02,0x00,0x00, 
/*-- 文字: \ --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x18,0x1E,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0x78,0x18,0x00, 
/*-- 文字: ] --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x10,0x10,0x1F,0x1F,0x00,0x00,0x00,0x00,0x02,0x02,0xFE,0xFE,0x00,0x00, 
/*-- 文字: ^ --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x10,0x30,0x60,0x60,0x30,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
/*-- 文字: _ --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, 
/*-- 文字: ` --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x40,0x60,0x70,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
/*-- 文字: a --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x04,0x04,0x04,0x07,0x03,0x00,0x00,0x60,0xF0,0x90,0x90,0xF0,0xF0,0x00, 
/*-- 文字: b --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x04,0x04,0x07,0x03,0x00,0x00,0xF0,0xF0,0x10,0x10,0xF0,0xE0,0x00, 
/*-- 文字: c --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x03,0x07,0x04,0x04,0x06,0x02,0x00,0x00,0xE0,0xF0,0x10,0x10,0x30,0x20,0x00, 
/*-- 文字: d --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x03,0x07,0x04,0x04,0x1F,0x1F,0x00,0x00,0xE0,0xF0,0x10,0x10,0xF0,0xF0,0x00, 
/*-- 文字: e --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x03,0x07,0x04,0x04,0x07,0x03,0x00,0x00,0xE0,0xF0,0x90,0x90,0x90,0x80,0x00, 
/*-- 文字: f --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x01,0x0F,0x1F,0x11,0x11,0x11,0x00,0x00,0x00,0xF0,0xF0,0x00,0x00,0x00,0x00, 
/*-- 文字: g --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x03,0x07,0x04,0x04,0x07,0x07,0x00,0x00,0xE2,0xF2,0x12,0x12,0xFE,0xFC,0x00, 
/*-- 文字: h --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x04,0x04,0x07,0x03,0x00,0x00,0xF0,0xF0,0x00,0x00,0xF0,0xF0,0x00, 
/*-- 文字: i --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x04,0x04,0x37,0x37,0x00,0x00,0x00,0x00,0x10,0x10,0xF0,0xF0,0x10,0x10,0x00, 
/*-- 文字: j --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x04,0x04,0x37,0x37,0x00,0x00,0x00,0x02,0x02,0x02,0xFE,0xFC,0x00,0x00, 
/*-- 文字: k --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x00,0x01,0x07,0x06,0x00,0x00,0xF0,0xF0,0x80,0xC0,0x70,0x30,0x00, 
/*-- 文字: l --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x10,0x10,0x1F,0x1F,0x00,0x00,0x00,0x00,0x10,0x10,0xF0,0xF0,0x10,0x10,0x00, 
/*-- 文字: m --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x07,0x07,0x04,0x07,0x04,0x07,0x03,0x00,0xF0,0xF0,0x00,0xE0,0x00,0xF0,0xF0, 
/*-- 文字: n --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x07,0x07,0x04,0x04,0x07,0x03,0x00,0x00,0xF0,0xF0,0x00,0x00,0xF0,0xF0,0x00, 
/*-- 文字: o --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x03,0x07,0x04,0x04,0x07,0x03,0x00,0x00,0xE0,0xF0,0x10,0x10,0xF0,0xE0,0x00, 
/*-- 文字: p --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x07,0x07,0x04,0x04,0x07,0x03,0x00,0x00,0xFE,0xFE,0x10,0x10,0xF0,0xE0,0x00, 
/*-- 文字: q --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x03,0x07,0x04,0x04,0x07,0x07,0x00,0x00,0xE0,0xF0,0x10,0x10,0xFE,0xFE,0x00, 
/*-- 文字: r --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x07,0x07,0x01,0x02,0x06,0x06,0x00,0x00,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00, 
/*-- 文字: s --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x03,0x07,0x04,0x04,0x04,0x04,0x00,0x00,0x10,0x90,0x90,0x90,0xF0,0x60,0x00, 
/*-- 文字: t --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x04,0x1F,0x1F,0x04,0x04,0x04,0x00,0x00,0x00,0xE0,0xF0,0x10,0x10,0x10,0x00, 
/*-- 文字: u --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x07,0x07,0x00,0x00,0x07,0x07,0x00,0x00,0xE0,0xF0,0x10,0x10,0xF0,0xF0,0x00, 
/*-- 文字: v --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x07,0x07,0x00,0x00,0x07,0x07,0x00,0x00,0xC0,0xE0,0x30,0x30,0xE0,0xC0,0x00, 
/*-- 文字: w --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x07,0x07,0x00,0x03,0x00,0x07,0x07,0x00,0xC0,0xF0,0x30,0xC0,0x30,0xF0,0xC0, 
/*-- 文字: x --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x06,0x07,0x01,0x01,0x07,0x06,0x00,0x00,0x30,0x70,0xC0,0xC0,0x70,0x30,0x00, 
/*-- 文字: y --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x07,0x07,0x00,0x00,0x07,0x07,0x00,0x02,0xE2,0xF2,0x16,0x1C,0xF8,0xE0,0x00, 
/*-- 文字: z --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x04,0x04,0x04,0x05,0x07,0x06,0x00,0x00,0x30,0x70,0xD0,0x90,0x10,0x10,0x00, 
/*-- 文字: { --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x01,0x0F,0x1E,0x10,0x00,0x00,0x00,0x80,0xC0,0x78,0x3C,0x04,0x00,0x00, 
/*-- 文字: | --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x00,0x00,0x00, 
/*-- 文字: } --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x00,0x10,0x1E,0x0F,0x01,0x00,0x00,0x00,0x00,0x04,0x3C,0x78,0xC0,0x80,0x00, 
/*-- 文字: ~ --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x0C,0x18,0x10,0x18,0x0C,0x04,0x0C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
/*-- 文字:   --*/ 
/*-- Fixedsys12; 此字体下对应的点阵为:宽 x 高=8x16 --*/
0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x00,0x00,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0x00, 
};

static void lcd_hal_init(void)
{
	cfg_sck.id=SPI_SCK_PIN,cfg_sck.dir=CM_GPIO_OUT,cfg_sck.irq_enable = 0;
	cfg_si.id=SPI_MOSI_PIN,cfg_si.dir=CM_GPIO_OUT,cfg_si.irq_enable = 0;
	cfg_ao.id=SPI_A0_PIN,cfg_ao.dir=CM_GPIO_OUT,cfg_ao.irq_enable = 0;
	cfg_cs.id=SPI_CS_PIN,cfg_cs.dir=CM_GPIO_OUT,cfg_cs.irq_enable = 0;
	cfg_rst.id=LCD_RST,cfg_rst.dir=CM_GPIO_OUT,cfg_rst.irq_enable = 0;
	cm_gpio_init(&cfg_sck);
	cm_gpio_init(&cfg_si);
	cm_gpio_init(&cfg_ao);
	cm_gpio_init(&cfg_cs);
	cm_gpio_init(&cfg_rst);
    CS_H
}

static void lcd_reset(void)
{
    RST_H
    osDelay(1000);
    RST_L
    osDelay(1000);
}

void lcd_write_com(uint8_t com)
{
	uint8_t i;

	SCK_H//第一个需要是下降沿
    A0_L//COMM  0是写指令
    CS_L//拉低片选
    for( i = 0; i < 8; i++ )
    {
        SCK_H//下降沿准备数据
        SCK_L//下降沿准备数据
        if( com & 0x80 )//1000 0000
         {
            MOSI_H;
         }
        else
         {
            MOSI_L;
         }
        SCK_L//上升沿采样数据
        SCK_H//上升沿采样数据
        com <<= 1;
    }

    CS_H//释放片选
    SCK_H
}

void lcd_write_data(uint8_t data)
{
	uint8_t i;

    SCK_H//第一个需要是下降沿
    A0_H//COMM  1是写数据
    CS_L//拉低片选
    for( i = 0; i < 8; i++ )
    {
        SCK_H//下降沿准备数据
        SCK_L//下降沿准备数据
        if( data & 0x80 )//1000 0000
        {
            MOSI_H;
        }
        else
        {
            MOSI_L;
        }
        SCK_L//上升沿采样数据
        SCK_H//上升沿采样数据
        data <<= 1;
    }
    CS_H//释放片选
    SCK_H
}

void lcd_clear_screen()
{
    uint8_t i,j;
    for(i = 0; i < 8; i++)
    {
        CS_L;
        lcd_write_com(0x40);
        lcd_write_com(0xb0 + i);    //SET PAGE 0---8
        lcd_write_com(0x10);        //SET COLUMN MSB
        lcd_write_com(0x00);        //SET CLUMN LSB
        for(j = 0; j < 128; j++)
        {
            lcd_write_data(0xff);
        }
    }
}

void lcd_init(void)
{
    lcd_hal_init();
    lcd_reset();
    lcd_write_com(0xa2);
    lcd_write_com(0xD1);
    lcd_write_com(0xa0);
    lcd_write_com(0xc8);
    lcd_write_com(0xa6);
    lcd_write_com(0x2f);
    lcd_write_com(0x25);
    lcd_write_com(0x81);
    lcd_write_com(18);
    lcd_write_com(0x40);
    lcd_write_com(0xaf);
    lcd_clear_screen();
}

void lcd_deinit(void)
{
    cm_gpio_deinit(LCD_RST);
	cm_gpio_deinit(SPI_CS_PIN);
	cm_gpio_deinit(SPI_A0_PIN);
	cm_gpio_deinit(SPI_SCK_PIN);
	cm_gpio_deinit(SPI_MOSI_PIN);
}

uint8_t lcd_buf[1024];

uint8_t ComTable[8]={3,2,1,0,7,6,5,4};//设置行表,如想显示在第三行,实际上代码是用ComTable[3&0x07]=00000111

void LcmPutChar(uint8_t col,uint8_t page,uint8_t Order) //显示 ASICC 字符的函数   参数1起始x像素(0~127);参数2起始y行(0~7);参数3(字模起始地址)
{
    uint8_t i;
    uint32_t x;
    //(Order-0x20)*0x10这个式子是用来计算含有整个SCII码表的地址的。


x = (Order-0x20)*0x10; //ASICC 字符从 0x20 开始,每个 16 byte lcd_write_com(ComTable[page&0x07]|0xB0); //Set Page Address 设置页地址 lcd_write_com( ((col+1)>>4) | 0x10); //Set Column Address High Byte lcd_write_com( (col+1)&0x0F ); //Low Byte Colum from S128 -> S1 auto add for(i=0;i<8;i++) { lcd_write_data( ASCIIchardot[x] ); x++; } page++; //下半字符 page+1 lcd_write_com(ComTable[page&0x07]|0xB0); //Set Page Address lcd_write_com( ((col+1)>>4) | 0x10); //Set Column Address High Byte lcd_write_com( (col+1)&0x0F ); //Low Byte Colum from S128 -> S1 auto add for(i=0;i<8;i++) { lcd_write_data( ASCIIchardot[x] ); x++; } page--; //写完一个字符 page 还原 } } //显示字符串的函数 void LcmPutStr(uint8_t col,uint8_t page,uint8_t *puts) { while(*puts != ')'//判断字符串时候显示完毕 if { ((col>-LcmXPixel8))//判断行末空间是否足够放一个字符,自动换行 = { page+page2;= col0;} if ((page>/LcmYPixel8-2))//到了屏幕最下角,自动返回左上角 = { page0;= col0;} LcmPutChar (,col,page*)puts;++ puts;= col+col8;//下一个字符 8 列之后 } } void lcd_proc (void)LcmPutStr { (0,0,"ABCDEFG");LcmPutStr (0,2,"1234567");} ifndef

LCD.h
#define __LCD_H__
#typedef __LCD_H__

unsigned char ;       uint8_ttypedef
signed char ;         int8_ttypedef
unsigned short ;      uint16_ttypedef
signed short ;        int16_ttypedef
unsigned int ;        uint32_ttypedef
signed int ;          int32_ttypedef
unsigned long int ;   uint64_ttypedef
signed long int ;     int64_ttypedef
unsigned int ;        uintptr_t//初始化LCD屏

void
lcd_init (void);//关闭屏,关闭释放GPIO口
void
lcd_deinit (void);//显示 *** 作演示
void
lcd_proc (void);endif

#

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/567297.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存