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

news2024/11/24 22:33:52

目录

注意重点:

一、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轮训显示图片,大数字,字符 串等:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2212069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Excel:vlookup函数实现查找

1.要查找宋江的英语,把鼠标放在对应单元格然后开始编辑 2.选中所选区域,点击F4锁定区域,不然下拉填充的时候会变VLOOKUP 在查找时有严格要求,查找值必须在所选区域的第一列,因此如果你的查找值不在第一列,可…

TGRS 2024 面向雾天遥感图像的定向目标检测算法

TGRS 2024 | 面向雾天遥感图像的定向目标检测算法 论文信息 摘要 目前,大量工作集中在航空目标检测上,并取得了良好的结果。尽管这些方法在传统数据集上取得了有希望的结果,但在恶劣天气条件下捕获的低质量图像中定位对象仍然具有挑战性。目…

RabbitMQ 入门(四)SpringAMQP五种消息类型

一、WorkQueue(工作消息队列) Work queues,也被称为(Task queues),任务模型。简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息。 当消息处理比较耗时的时候,可能生产消息的速度会远远大于…

【亲测可行】ubuntu下载安装c++版opencv4.7.0和4.5.0 安装opencv4.5.0报错及解决方法

文章目录 🌕系统配置🌕打开终端,退出anacoda激活环境(如果有的话)🌕安装依赖🌙安装g, cmake, make, wget, unzip,若已安装,此步跳过🌙安装opencv依赖的库🌙安装可选依赖 …

关于md5强比较和弱比较绕过的实验

在ctf比赛题中我们的md5强弱比较的绕过题型很多,大部分都是结合了PHP来进行一个考核。这一篇文章我将讲解一下最基础的绕过知识。 MD5弱比较 比较的步骤 在进行弱比较时,PHP会按照以下步骤执行: 确定数据类型:检查参与比较的两…

要笑死了java

有一天,Java开发者Jack对他的朋友说:“最近我总感觉自己被逼得喘不过气。” 朋友问:“为什么啊?” Jack叹了口气道:“因为我一直在try里,但从来没有catch到过break!” 为什么程序员总是分不清圣…

【Ubuntu】“Linux版PhotoShop”绘图软件的安装和汉化

【Ubuntu】“Linux版PhotoShop”绘图软件的安装和汉化 零、前言 最近换了Linux系统,但是写教程做PPT的时候还是得用到绘图软件,上网一查,总结对比之后发现Krita比较好用,故此讲解一下如何安装和汉化Krita。 壹、安装 安装很简…

spring 如何将mutipartFile转存到本地磁盘

两者的区别和联系 MutipartFile是spring的一部分,File则是java的标准类MutipartFile用于接收web传递的文件,File操作本地系统的文件 MutipartFile 转换File的三种方式 使用MutipartFile 自带的transferTo方法使用java自带的FileOutPutStream流使用java自…

AirServer v7.2.7 破解版 – iPhone屏幕镜像工具

AirServer v7.2.7 破解版 – iPhone屏幕镜像工具可以将你的Mac转变为一个通用的镜像接收器,除了无法接收Miracast外,你可以使用内置的AirPlay或Google Cast基于屏幕投影功能来镜像你的设备屏幕;一次一个或同时投影到AirServer。用户可以从任何…

基于stm32的HAL库的串口实现不定长中断(空闲中断)(四)

串口实现不定长中断(空闲中断) 目录 串口实现不定长中断(空闲中断) 1、串口头文件 2、串口初始化配置 3、msp公用的一个函数这里有三个串口,都会调用msp先进行一个判断 4、对接收数组进行清空 5、中断服务函数--…

HDLBits中文版,标准参考答案 | 3.2.5 Finite State Machines | 有限状态机(5)

关注 望森FPGA 查看更多FPGA资讯 这是望森的第 20 期分享 作者 | 望森 来源 | 望森FPGA 目录 1 Q6b: FSM next-state logic | Q6b:FSM 下一状态逻辑 2 Q6c: FSM one-hot next-state logic | Q6c:FSM 独热下一状态逻辑 3 Q6: FSM 4 Q2a: FSM 5 Q2b…

R编程环境的搭建

【图书推荐】《R语言医学数据分析实践》-CSDN博客 R语言对编程环境的要求不高,可以在多种操作系统平台上运行,包括Windows、macOS和Linux。要运行R语言,需要安装R解释器。可以从R语言的官方网站下载和安装最新版本。R语言还需要一个集成开发…

【可答疑】基于51单片机的水位检测系统(含仿真、代码、报告、演示视频等)

✨哈喽大家好,这里是每天一杯冰美式oh,985电子本硕,大厂嵌入式在职0.3年,业余时间做做单片机小项目,有需要也可以提供就业指导(免费)~ 🐱‍🐉这是51单片机毕业设计100篇…

postman变量,断言,参数化

环境变量 1.创建环境变量 正式环境是错误的,方便验证环境变化 2.在请求中添加变量 3.运行前选择环境变量 全局变量 能够在任何接口访问的变量 console中打印日志 console.log(responseBody);//将数据解析为json格式 var data JSON.parse(responseBody); conso…

HTML(七)表格

在HTML中&#xff0c;表格的标准形式如下&#xff1a; <table></table> 使用上面的语言&#xff0c;就已经生成了一个表格&#xff0c;只不过这个表格什么都没有 那么&#xff0c;该如何让表格存在东西呢&#xff1f; 首先&#xff0c;我们需要使用到<tr> …

sqli-labs less-26 空格绕过

空格绕过 过滤空格 用Tab代替空格%20 %09 %0a %0b %0c %0d %a0 //() 绕过空格注释符绕过//–%20//#–- -;%00; 空白字符绕过SQLite3 —— 0A,0D,0c,09,20 MYSQL 09,0A,0B,0B,0D,A0,20 PosgressSQL 0A,0D,0C,09,20 Oracle_11g 00,0A,0D,0C,09,20 MSSQL 01,02,03,04,05,06,07,…

python爬虫案例——selenium爬取淘宝商品信息,实现翻页抓取(14)

文章目录 1、任务目标2、网页分析3、代码编写3.1 代码分析3.2 完整代码1、任务目标 目标网站:淘宝(https://www.taobao.com/) 任务要求:通过selenium实现自动化抓取 淘宝美食 板块下的所有商品信息,并实现翻页抓取,最后以csv格式将数据保存至本地;如: 2、网页分析 首先…

Servlet[springmvc]的Servlet.init()引发异常

报错&#xff1a; 原因之一&#xff1a; web.xml配置文件中监听器导入依赖项错误

android——自定义控件(不停变化的textview、开关switch、动画效果的打勾)

一、从开始数字到结束数字&#xff0c;不断变化 import android.animation.TypeEvaluator; import android.animation.ValueAnimator; import android.content.Context; import android.util.AttributeSet; import android.view.animation.AccelerateDecelerateInterpolator;i…

OpenCV答题卡识别

文章目录 一、基本流程二、代码实现1.定义函数2.图像预处理&#xff08;1&#xff09;高斯模糊、边缘检测&#xff08;2&#xff09;轮廓检测&#xff08;3&#xff09;透视变换&#xff08;4&#xff09;阈值处理和轮廓检测 3.筛选和排序选项轮廓4.判断答案5.显示结果 三、总结…