首页 > 其他分享 >ZYNQ使用XGPIO驱动外设模块(后半部分)

ZYNQ使用XGPIO驱动外设模块(后半部分)

时间:2024-10-13 23:19:51浏览次数:3  
标签:XGpio char set unsigned XGPIO LCD ZYNQ WrCmd 外设

目录

注意重点:

一、SDK代码开发部分:

显示所需的字符编码:

1.用于显示8x16的字符函数:

2.绘制图片:

3.清楚给定两个坐标之间的显示:

4.显示16*32的阿拉伯数字字符:

5.显示16*32的整型数字,最大显示到万位:

Debug运行

二、取模显示图片

三、调试效果:


注意重点:

1.我们运行代码,注意,DEBUG配置需勾选烧写FLASH,具体配置参考《03arm开发之 ARM使用AXI_GPIO》

2.重要的几个函数

字符编码oled_code_tab.c

初始化OLED的GPIO函数:GPIO_OLED_INIT()

OLED初始化函数,LCD_init()

显示8x16的字符函数LCD_P8x16Str()

绘制图片Draw_BMP()

清楚给定两个坐标之间的显示:clear_display_area()

显示闪烁的8*16字符串display_blk_str()

显示16*32的阿拉伯数字字符LCD_P16x32

显示16*32的整型数字dis_int16_num()

一、SDK代码开发部分:

根据oled显示代码

显示功能的代码由oled_display.c部分实现

显示三个图像Draw_BMP(0,0,128,8,test_bmp);

sleep(1):延时0.5s;

dis_int16_num(0,0,count);

count++;//显示图像翻动次数

代码提供了三种显示,图片,大数字和字符串

图片:Draw_BMP(0,0,128,8,test_bmp);

大数字:

字符串

显示所需的字符编码:

位于oled_code_tab.c 里面,是一些数组编码。其中F8X16[]是我们的普通小字符号编码:

以及我们自己取模,16*32大小分辨率的数字0-9编码F16X32[]:

上面的字符编码也就是我们显示的基础字符库。我们这里展示的是显示数字和字符。 后面我们在讲解一下如何自己取模,显示简单的图形图片等等。

回到我们oled096_driver.c。这个是我们的驱动代码。首先看一下我们一些宏定义:

XGpio sdaInst;

XGpio sclInst;

XGpio dcInst;

XGpio rstInst;

#define SCL_L XGpio_DiscreteWrite(&sclInst, 1, 0)

#define SCL_H XGpio_DiscreteWrite(&sclInst, 1, 1)

#define SDA_L XGpio_DiscreteWrite(&sdaInst, 1, 0)

#define SDA_H XGpio_DiscreteWrite(&sdaInst, 1, 1)

#define DC_L XGpio_DiscreteWrite(&dcInst, 1, 0)

#define DC_H XGpio_DiscreteWrite(&dcInst, 1, 1)

#define RST_L XGpio_DiscreteWrite(&rstInst, 1, 0)

#define RST_H XGpio_DiscreteWrite(&rstInst, 1, 1)

#define XLevelL 0x00

#define XLevelH 0x10

#define XLevel ((XLevelH&0x0F)*16+XLevelL)
#define Max_Column 128

#define Max_Row 64

#define Brightness 0xCF

#define X_WIDTH 128

#define Y_WIDTH 64

        代码中,首先是GPIO初始化的几个引脚结构体,然后是我们操作几个引脚电平高低的函数宏定 义。接着是OLED一些参数,比如level定义,最大行列数,以及宽度,高度等等。可以看出我们OLED 的宽度和高度是128和64.也就是这个分辨率。接着我们讲解一下几个主要的初始化函数。

        接着我们看一下初始化OLED的GPIO函数:

void GPIO_OLED_INIT()
{

int status;
status = XGpio_Initialize(&sdaInst, OLED_SDA_DEVICE_ID); // initial KEY

if(status != XST_SUCCESS) return XST_FAILURE;
status = XGpio_Initialize(&sclInst, OLED_SCL_DEVICE_ID); // initial KEY

if(status != XST_SUCCESS) return XST_FAILURE;
status = XGpio_Initialize(&dcInst, OLED_DC_DEVICE_ID); // initial KEY

if(status != XST_SUCCESS) return XST_FAILURE;
status = XGpio_Initialize(&rstInst, OLED_RST_DEVICE_ID); // initial KEY

if(status != XST_SUCCESS) return XST_FAILURE;
XGpio_SetDataDirection(&sdaInst, 1, 0); // set output

XGpio_SetDataDirection(&sclInst, 1, 0); // set output

XGpio_SetDataDirection(&dcInst, 1, 0); // set output

XGpio_SetDataDirection(&rstInst, 1, 0); // set output

XGpio_DiscreteWrite(&sdaInst, 1, 0x0);
XGpio_DiscreteWrite(&sclInst, 1, 0x0);
XGpio_DiscreteWrite(&dcInst, 1, 0x0);
XGpio_DiscreteWrite(&rstInst, 1, 0x0);
}

函数中,初始化了几个结构体对应的GPIO引脚,然后设置IO方向输出。最后全部输出设置为 0。关于GPIO的初始化,其设备ID我们在oled096_driver.h中有定义:

这几个ID还可以追溯到我们的xparameters.h头文件中:

我们的OLED初始化函数,LCD_init(),这个函数负责初始化GPIO调用,复位OLED,配 置初始化显示屏基本参数:

void LCD_Init(void)
{
 GPIO_OLED_INIT();
SCL_H;
delay_oled(100);
RST_L;
delay_oled(50000);
RST_H; //

delay_oled(100);
LCD_WrCmd(0xae);//--turn off oled panel

LCD_WrCmd(0x00);//---set low column address

LCD_WrCmd(0x10);//---set high column address

LCD_WrCmd(0x40);//--set start line address Set Mapping RAM Display Start Line
(0x00~0x3F)

LCD_WrCmd(0xB0);//--set contrast control register

LCD_WrCmd(0x81); // Set SEG Output Current Brightness

LCD_WrCmd(0xFF);//--Set SEG/Column Mapping 0xa0鈩呰粖杌婅景锕炩埄?? 0xa1?y3銖�

LCD_WrCmd(0xA1);//Set COM/Row Scan Direction 0xc0璋�???锕炩埄?? 0xc8?y3銖�

LCD_WrCmd(0xa6);//--set normal display

LCD_WrCmd(0xA8);//--set multiplex ratio(1 to 64)

LCD_WrCmd(0x3f);//--1/64 duty 璞�?閭�?128*32 LCD_WrCmd(0x1F);

LCD_WrCmd(0xC8);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)

LCD_WrCmd(0xD3);//-not offset

LCD_WrCmd(0x00);//--set display clock divide ratio/oscillator frequency

LCD_WrCmd(0xD5);//--set divide ratio, Set Clock as 100 Frames/Sec

LCD_WrCmd(0x80);//--set pre-charge period

LCD_WrCmd(0xD8);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock

LCD_WrCmd(0x05);//--set com pins hardware configuration

LCD_WrCmd(0xD9);
LCD_WrCmd(0xF1);//--set vcomh

LCD_WrCmd(0xDA);//Set VCOM Deselect Level

LCD_WrCmd(0x12);//-Set Page Addressing Mode (0x00/0x01/0x02) 璞�?閭�?128*32
LCD_WrCmd(0x02);*/

LCD_WrCmd(0xDB);//

LCD_WrCmd(0x30);//--set Charge Pump enable/disable

LCD_WrCmd(0x8D);//--set(0x10) disable

LCD_WrCmd(0x14);// Disable Entire Display On (0xa4/0xa5)

LCD_WrCmd(0xaf);//--turn on oled panel

LCD_Fill(0x00); //3?閭�????鑺�

}

以上函数调用之后我们就可以使用显示函数进行显示。 我们显示函数有如下几种,字符显示相关函数,其中x,y为显示起点坐标。x左边1为单位,增量 一个像素;y为8个增量单位,每加1,y增加8。

1.用于显示8x16的字符函数:

void LCD_P8x16Str(unsigned char x, unsigned char y,unsigned char ch[]);

绘制图片,图片x0 y0为起点,x1,y1为终点,bmp为要绘制的指针。大家注意,绘制图片, 坐标之间像素点要和取模的bmp数组对得上。

2.绘制图片:

void Draw_BMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char

y1,const unsigned char bmp[]);

3.清楚给定两个坐标之间的显示:

void clear_display_area(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1);

显示闪烁的8*16字符串,period为周期,此参数越长,闪烁越慢。周期跟物理时间不对应,跟 次函数调用快慢周期数对应:

void display_blk_str(unsigned char x,unsigned char y,unsigned char *data,short period);

4.显示16*32的阿拉伯数字字符:

void LCD_P16x32(unsigned char x, unsigned char y, unsigned char N)

5.显示16*32的整型数字,最大显示到万位:

void dis_int16_num(int x,int y,unsigned int num);

我们配置好DEBUG,勾选烧写FPGA,然后开发板连接JTAG到电脑,通电启动,然后开始 DEBUG运行。可以看到,三种显示轮流切换演示。如何配置DEBUG请参考ARM部分教程《arm开发之 ARM使用AXI_GPIO》。

Debug运行

二、取模显示图片

回到我们的oled096_driver.c ,我们如果要显示图片怎么取模呢?资料中的《01硬件资料目录 下的OLED模块和工具》中,我们给大家网盘例程里面提供类一个取模工具和oled的厂家指南,大家可 以按照文档说明深入了解这个OLED,包括取模。文件名:《中景园电子0.96寸OLED使用文档新手必 看V2.0.pdf》。这里要说明一下,这个取模工具不太好用。打开之后把工具窗口最大化再打开图片。大 家根据刚提到的文档来操作就可以了。

我们提供了几张一张12864单位bmp图,以(12864_demo_picture.Bmp)为例。记 住,只能是单色BMP,尺寸小于等于我们的分辨率的图片才可以使用!!软件配置如下:

配置好后,回到主界面可以点击生成,就可以在下方窗口看到我们生成的数组,我们 复制到自己代码中就可以使用了。

        我们代码oled096_driver.c里面函数:

void Draw_BMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,const unsigned char bmp[])

        就是我们图片显示的函数,首先是x0 y0 x1 y1,这几个参数是我们图片起始坐标和终点坐标, 一般x以像素为单位,横向有0-128取值范围;y为垂直坐标,只能是以0-8。

三、调试效果:

我们运行代码,注意,DEBUG配置需勾选烧写FLASH,具体配置参考《03arm开发之 ARM使用AXI_GPIO》,这里不再重复。运行后,可以看到oled轮训显示图片,大数字,字符 串等:

标签:XGpio,char,set,unsigned,XGPIO,LCD,ZYNQ,WrCmd,外设
From: https://blog.csdn.net/confront66/article/details/142905329

相关文章

  • 通信工程学习:什么是SPI串行外设接口
    SPI:串行外设接口    SPI,即串行外设接口(SerialPeripheralInterface),是一种由Motorola公司首先在其MC68HCXX系列处理器上定义的同步串行接口技术。SPI接口主要用于微控制器(MCU)与外部设备之间的通信,如存储器、传感器、显示屏等。以下是关于SPI接口的详细介绍:一、SPI......
  • 外设管控是什么,都有哪些方法可以管控外设(外设管控的六个小技巧)
    外设管控是指通过技术手段和管理策略,控制外接设备的使用,防止数据泄露或安全风险。以下是一些常见的外设管控方法:1.USB端口管控USB接口是最常见的外设连接方式,也是数据泄露的高风险途径之一。以下是针对USB接口的管控方法:禁用或限制USB端口:使用软件禁用未授权的USB设备,仅......
  • ZYNQ学习笔记----------bd文件
    工具:Vivado18.3所用芯片:ZYNQ7000系列  作为一个刚入职的fpga工程师,不可避免地接触到公司前辈的工程项目(Vivado)。在看工程及分析其结构时,发现了design_1.bd文件;双击打开后发现其内部拥有多个模块,不解之下特意搜索相关资料进行学习。根据网上教程及相关资料,对bd文件的总结如......
  • 在Zynq平台上实现神经网络的思路、方案
    Zynq平台结合了PS(ProcessingSystem)和PL(ProgrammableLogic)的异构架构,适用于高效实现神经网络。通过合理分配计算任务,可以提升整体性能。以下是详细的思路、方案和设计。一、Zynq架构概述1.Zynq架构组成PS(处理系统):基于ARMCortex-A9处理器,负责控制、管理和执行复杂的任......
  • 1. ZYNQ 2. MPSOC 3. FPGA 4. Vitis 5. 项目
    ###1.建立VitisSDK自带的HelloWorld工程首先,我们需要在VitisSDK中创建一个基本的HelloWorld工程。这是学习FPGA开发和ZYNQMPSOC平台的重要第一步。HelloWorld工程的主要目的是验证开发环境的正确性以及熟悉基本的编程流程。####步骤:-打开VitisSDK。-创建一......
  • 设计资料原理图:622-基于ADRV9002 +ZYNQ7020 的软件无线电 SDR(升级AD9361)
    一、板卡概述   板卡由ADIADRV9002+XilinxXC7Z020-CLG484芯片设计的整板,包含双路射频输入输出通道,支持千兆网络,RS232,触摸屏等接口,双核ARM支持Linux操作系统。板卡功耗很低,适合自定义的无线协议开发,如Loar、Wifi、4G平台等,也适合无线手持机、图传模块的产品开发。二、主要......
  • 【新品上市】正点原子ZYNQ7015开发板发布!ZYNQ 7000系列、双核ARM、PCIe2.0、SFPX2,性能
    【新品发布】正点原子ZYNQ7015开发板发布!ZYNQ7000系列、双核ARM、PCIe2.0、SFPX2,性能强悍,资料丰富!正点原子Z15ZYNQ开发板,搭载XilinxZynq7000系列芯片,核心板主控芯片的型号是XC7Z015CLG485-2。开发板由核心板+底板组成,外设资源丰富,板载1路PS端千兆以太网接口、PCle2.0x2、SFP光......
  • stm32 SPI通信外设(硬件SPI读写W25Q64)
    理论1.SPI外设简介STM32内部集成了硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻CPU的负担可配置8位/16位数据帧、高位先行/低位先行时钟频率:fPCLK/(2,4,8,16,32,64,128,256)支持多主机模型、主或从操作可精简为半双工/单工通信支持DMA兼......
  • STM32-ADC外设
    1.通道.规则通道.注入通道2.规则序列寄存器配置通道的采样顺序3.ADC周期4.ADC转换方式*单次转换:adc每次只采集某个通道的一个点,如果需要再次采集,就需要重新使能。*连续转换:adc采集某个通道一个点,转换完成后,再采集第二点。依次类推4.扫描模式*单次扫描模式:多个通道只扫......
  • STM32F7外设FMC控制LCD显示屏
    STM32F7外设FMC控制LCD显示屏,显示屏的点阵LCD控制器(DotMatrixLCDController/Driver)是ST7066U。配置在CubeMX中选择图1根据实际情况选择,Bank几,LCD片选引脚。图2FMC原理对于FMC如何控制LCD,我的理解:FMC能自动发送数据读写RAM,通过FMC读写LCD的显存就可以完成显示的......