基于uCOSII的LCD驱动实验
- 实验目的
- 掌握在 UCOsH操作系统下编写应用程序 的基本方法
- 实验内容
- 在移植好的UCOsII项 目中添加串口、LCD、 键盘的驱动程序
- 学习在UCOSII下 ,多应用任务的简单编程实例
- 实验设备
- EL-RAM-860教 学 实验 箱 ,PentiumII以上 的 PC机 ,仿 真 调试 电缆 ,串 口直 连 电 缆 。
- PC操 作 系统 WIN98或 WIN⒛00或 WINXP, ADs1.2集 成 开发环 坑 , 仿真 调试 驱动程 序 。
- 实验步骤
实验题目1:
- 在界面显示一个半径为20的红色圆圈,且该圆圈随着上、下、左、右键的按下往该方向平移6个单位。
- 当捕获回车按键后串口输出当前激活按键的值如"Left Button Pressed!"等
实验代码:
代码说明:
Main:此函数创建并启动了任务一,利用“邮箱”来进行多任务间的通信。
Task1:创建并启动了任务2,3,4,也是利用“邮箱” 来进行多任务间的通信。通过设置任务的优先级来控制任务的调度。
Task2:主要是控制LED灯的交替闪烁效果
Task3:主要是向超级终端中输出键盘上的按键值,代码只变动了输出内容。
Task4:是进行GUI任务,代码变动主要是改写此函数,函数编写代码已经进行了相关的注释。
void Task_4(void *pdata)
{ I32 number;INT8U Loop;for(;;) { number = GUI_WaitKey();Loop = TRUE;do{switch (number){case GUI_KEY_START: // 得到开始命令 Set_Color(GUI_BLUE);Fill_Rect(0,0,639,479); //画窗口的边框Set_Color(GUI_WHITE);Set_BkColor (GUI_BLUE); //设置窗口的背景颜色Fill_Rect(0,0,639,2); Fill_Rect(0,0,2,479);Fill_Rect(0,477,639,479);Fill_Rect(637,0,639,479); Set_Color(GUI_YELLOW);Set_Font (&CHINESE_FONT16);Disp_String (CN_start"这是一个多任务显示的例程"CN_end,50,30); Set_Color(GUI_RED); //画红色的圆,Fill_Circle (320, 240, 20); //圆心坐标、半径为20Loop = FALSE;number = 0;break;default: // 等待主任务发送的键值命令number = GUI_WaitKey(); Loop = TRUE;break;}}while(Loop==TRUE);do{switch (number) {case GUI_KEY_UP: //选择上移Set_Color(GUI_BLUE); //将原先的圆消失掉Fill_Rect(0,0,639,479); //重新绘制窗口Set_Color(GUI_WHITE);Set_BkColor (GUI_BLUE);Fill_Rect(0,0,639,2); //窗口的四条边框的绘制Fill_Rect(0,0,2,479);Fill_Rect(0,477,639,479);Fill_Rect(637,0,639,479);Set_Color(GUI_RED);if(y-20<=1){y=240; //如果圆要超过上边界,将圆设置到中心}else{y=y-6;}Fill_Circle(x, y, 20);Loop = TRUE;number = 0;break; case GUI_KEY_DOWN: //选择下移Set_Color(GUI_BLUE); //将原先的圆消失掉Fill_Rect(0,0,639,479); //重新绘制窗口Set_Color(GUI_WHITE);Set_BkColor (GUI_BLUE); Fill_Rect(0,0,639,2); //窗口的四条边框的绘制Fill_Rect(0,0,2,479);Fill_Rect(0,477,639,479);Fill_Rect(637,0,639,479);Set_Color(GUI_RED);if(y+20>=479){ //如果圆要超过下边界,将圆设置到中心y=240;}else{y=y+6;}Fill_Circle(x, y, 20); Loop = TRUE;number = 0;break;case GUI_KEY_RIGHT: //选择右移Set_Color(GUI_BLUE); //将原先的圆消失掉Fill_Rect(0,0,639,479); //重新绘制窗口Set_Color(GUI_WHITE); Set_BkColor (GUI_BLUE);Fill_Rect(0,0,639,2); //窗口的四条边框的绘制Fill_Rect(0,0,2,479);Fill_Rect(0,477,639,479);Fill_Rect(637,0,639,479);Set_Color(GUI_RED); //x为全局变量if(x+20>=639){ //如果圆要超过右边界x=320; //将圆心重新设置到中间}else{ x=x+6; //每一次右移,x值加6}Fill_Circle(x, y, 20); Loop = TRUE;number = 0; break; case GUI_KEY_LEFT: //选择左移 Set_Color(GUI_BLUE); //将原先的圆消失掉Fill_Rect(0,0,639,479); //重新绘制窗口Set_Color(GUI_WHITE);Set_BkColor (GUI_BLUE);Fill_Rect(0,0,639,2); //窗口的四条边框的绘制Fill_Rect(0,0,2,479);Fill_Rect(0,477,639,479); Fill_Rect(637,0,639,479);Set_Color(GUI_RED);if(x-20<=1){ //如果圆要超过左边界x=320; //将圆心重新设置到中间}else{ x=x-6;}Fill_Circle(x, y, 20);Loop = TRUE;number = 0;break;case GUI_KEY_ESCAPE: // 得到退出命令Set_Color(GUI_BLUE);Fill_Rect(0,0,639,479);Set_Color(GUI_WHITE);Fill_Rect(0,0,639,2);Fill_Rect(0,0,2,479);Fill_Rect(0,477,639,479);Fill_Rect(637,0,639,479);Loop = FALSE;number = 0;break; default: // 等待主任务发送的键值命令number = GUI_WaitKey();Loop = TRUE;break;}}while(Loop == TRUE);}
}
void Task_3(void *pdata)
{for(;;){if(key_number!=0xff){ Uart_Printf("key_number=%x Button Pressed!\n",key_number); //任务的干得活儿就是向超级终端发送内容key_number=0xff;OSTimeDly(30); //延时100个节拍}}
}
实验题目2:
在编写一个任务5,此任务中完成,设置其优先级为60,绘制一个圆,此圆的初始半径为2,然后扩大到50之后缩小为半径为2的圆。扩大的频率为LED灯闪烁的频率的1/2.
代码的实现:
在task1中创建并启动任务task5,在task2中设置让task2闪烁完一回,线程睡眠OSTimeDly(30); ,让低优先级的task5得到执行,task2中创建一个信号量,让task2运行两次,往信号量中扔一把钥匙,达到灯闪烁频率的1/2是圆扩大的频率,task5负责接受取出钥匙得到运行。
void Task_5(void *pdata)
{ I32 number;INT8U Loop;for(;;) { Key_P = OSMboxPend(Key_Mbox1, 0, &err); //取钥匙获取执行机会number = GUI_WaitKey();// 得到开始命令 Set_Color(GUI_BLUE);Fill_Rect(0,0,639,479); //画窗口的边框Set_Color(GUI_WHITE);Set_BkColor (GUI_BLUE); //设置窗口的背景颜色Fill_Rect(0,0,639,2); Fill_Rect(0,0,2,479);Fill_Rect(0,477,639,479);Fill_Rect(637,0,639,479); Set_Color(GUI_YELLOW);Set_Font (&CHINESE_FONT16);Disp_String (CN_start"这是一个多任务显示的例程"CN_end,50,30); R+=2; //此处R是全局变量If(R>50){R=2; //当圆半径到达了50时,圆半径回到2}Set_Color(GUI_RED); //画红色的圆,Fill_Circle (320, 240, R); //圆心坐标、半径为20Loop = FALSE;number = 0;
Loop = TRUE;number = GUI_WaitKey(); Loop = TRUE;}}
void Task_2(void *pdata)
{INT32U i,flag=0;K=1; //k是全局变量,控制代码执行两次往信号量里//面扔一把钥匙Key_Mbox1 = OSMboxCreate((void *)0);//创建信号量Key_Mbox1for(;;){k++;
If(k%2==0)
OSMboxPost(Key_Mbox1,&key_number);//往信号量Key_Mbox1仍钥匙OSTimeDly(30); if(flag==0){for(i=0;i<100000;i++);rGPGDAT = rGPGDAT&~(0x3<<8)|(0x1<<8);for(i=0;i<100000;i++);flag = 1;}else{for(i=0;i<100000;i++);rGPGDAT = rGPGDAT&~(0x3<<8)|(0x2<<8);for(i=0;i<100000;i++);flag = 0;}OSTimeDly(30); //延时30个节拍}
}
实验结果截图:
问题以及总结:
本次实验过程中绘制红心圆的时候往上移,左移、右移发现之前的圆不会消失,于是就造成了圆移动的过程中绘画成一条线,于是我就想到每次点击上下移动之前把原先这个圆给删除掉,但是GUI中又没有提供相关的函数,于是借鉴了一下别人的做法,每一移动触发之前,先把面板上的组件清空,把原先的窗口设置成白色,然后重新绘制窗口,这样之前的圆就消失了。
在任务二中,task5老是得不到机会运行,因为task5的优先级太低,而task2中总是在运行,导致低优先级的task5得不到机会运行,后来在老师的帮助下,将task任务线程睡眠,也就是延迟30个节拍,让task5得到机会能够运行。
基于uCOSII的LCD驱动实验相关推荐
- 【正点原子MP157连载】第三十九章 LCD驱动实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7
1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...
- Linux LCD 驱动实验
目录 Linux 下LCD 驱动简析 1 Framebuffer 设备 LCD 驱动简析 硬件原理图分析 LCD 驱动程序编写 运行测试 LCD 屏幕基本测试 设置LCD 作为终端控制台 LCD 背光 ...
- rk3288 基于qemu学习lcd驱动
qemu中的LCD相关的芯片手册 100ask修改了qemu的源码,实现了一个虚拟的LCD控制器,只有4个寄存器 地址 寄存器 说明 0x021C8000 fb_base_phys 用于设置Frame ...
- 【Linux驱动开发】LCD 驱动实验
一.简介 Framebuffer 设备,Framebuffer(帧缓冲),简称 fb. LCD 对应的设备文件是 /dev/fbX(X=0~n). 在 Linux 中应用程序也是通过操作 RGB LC ...
- 基于Exynos4412的lcd驱动1
用于温故而知新,也希望能够帮到大家,当中也许会有错误,欢迎大家帮我纠错. 驱动层(控制器层):一般由芯片原厂提供,实现了LCD控制器通用的操作接口和配置接口,本章用到的是三星提供的s3cfb_main ...
- Barebox for Tiny6410(LCD驱动移植)
一.目的 熟悉Barebox的Frame buffer框架.LCD驱动的移植和测试命令的编写. 二.主要内容 1.1 为Barebox移植基于Tiny6410的LCD驱动. 1.2 编写lcd命令测试 ...
- 基于正点原子F103精英板和CubeIDE的Hal库LCD驱动移植(从零开始)
最近在学习王维波老师的<STM32Cube高效开发教程>,王老师移植的是普中科技的驱动,而我手动移植了一下正点原子的lcd驱动,看了网上的诸多教程,有的博客存在一些bug,于是乎手动整理了 ...
- ESP8266-Arduino编程实例-ILI9341-TFT LCD驱动(基于TFT_eSPI库)
ILI9341-TFT LCD驱动(基于TFT_eSPI库) 液晶显示器 (LCD) 是一种平板显示器或其他电子调制光学设备,它利用液晶与偏振器的光调制特性.液晶不直接发光,而是使用背光或反射器来产生 ...
- 基于STM32F407的摄像头(不带FIFO的OV7670)图像采集及LCD显示实验-笔记整理
硬件说明 STM32F4开发板 stm32f4系列的芯片处理的能力可以说非常强大了的,而且内部还自带有数字摄像头接口(DCMI),可以说stm32f407的核心板和不带FIFO的摄像头模块OV7670 ...
最新文章
- poj 3984 迷宫问题 BFS
- 前端参数无法转为后端实体内部类_Spring Boot返回前端Long型丢失精度
- 纪年法:公元和公元前
- csp怎么给线条描边_PS的四种“描边”方式你都知道吗?Photoshop小知识
- (Step2-500题)POJ训练计划+SGU
- 决策树 结构_决策树模型是什么?5步了解好看模型图
- koa 接口返回数据_node和koa实现数据mock接口
- python中的append()有什么功能_在python中append()函数能做什么
- android 找不到类文件,Android库:当“实现项目”用于库的模块依赖时,找不到类文件...
- MDF文件查看器(SQL MDF Viewer) 1.0 绿色版
- 短视频解析去水印在线 伪原创视频如何搬运
- Could not create the Java Virtual Machine
- android killer使用方法,AndroidKiller安装、设置及使用教程
- SpringBoot 开发案例之各种参数传递,以及前端代码和postman测试(完整版)
- ctab法提取dna流程图_CTAB法提取DNA
- Designing Machine Learning Systems with Python
- 吉尼斯官方确认火狐首日下载世界记录
- IT项目开发团队建设与管理总结(转)
- 如果一只股票退市,那么里面所持有这只股票人的钱该怎么办?
- 常用的报表工具有哪些?目前最流行的报表工具?