• 实验目的
  1. 掌握在 UCOsH操作系统下编写应用程序 的基本方法
  • 实验内容
  1. 在移植好的UCOsII项 目中添加串口、LCD、 键盘的驱动程序
  2. 学习在UCOSII下 ,多应用任务的简单编程实例
  • 实验设备
  1. EL-RAM-860教 学 实验 箱 ,PentiumII以上 的 PC机 ,仿 真 调试 电缆 ,串 口直 连 电 缆 。
  2. PC操 作 系统 WIN98或 WIN⒛00或 WINXP, ADs1.2集 成 开发环 坑 , 仿真 调试 驱动程 序 。
  • 实验步骤

实验题目1:

  1. 在界面显示一个半径为20的红色圆圈,且该圆圈随着上、下、左、右键的按下往该方向平移6个单位。
  2. 当捕获回车按键后串口输出当前激活按键的值如"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驱动实验相关推荐

  1. 【正点原子MP157连载】第三十九章 LCD驱动实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  2. Linux LCD 驱动实验

    目录 Linux 下LCD 驱动简析 1 Framebuffer 设备 LCD 驱动简析 硬件原理图分析 LCD 驱动程序编写 运行测试 LCD 屏幕基本测试 设置LCD 作为终端控制台 LCD 背光 ...

  3. rk3288 基于qemu学习lcd驱动

    qemu中的LCD相关的芯片手册 100ask修改了qemu的源码,实现了一个虚拟的LCD控制器,只有4个寄存器 地址 寄存器 说明 0x021C8000 fb_base_phys 用于设置Frame ...

  4. 【Linux驱动开发】LCD 驱动实验

    一.简介 Framebuffer 设备,Framebuffer(帧缓冲),简称 fb. LCD 对应的设备文件是 /dev/fbX(X=0~n). 在 Linux 中应用程序也是通过操作 RGB LC ...

  5. 基于Exynos4412的lcd驱动1

    用于温故而知新,也希望能够帮到大家,当中也许会有错误,欢迎大家帮我纠错. 驱动层(控制器层):一般由芯片原厂提供,实现了LCD控制器通用的操作接口和配置接口,本章用到的是三星提供的s3cfb_main ...

  6. Barebox for Tiny6410(LCD驱动移植)

    一.目的 熟悉Barebox的Frame buffer框架.LCD驱动的移植和测试命令的编写. 二.主要内容 1.1 为Barebox移植基于Tiny6410的LCD驱动. 1.2 编写lcd命令测试 ...

  7. 基于正点原子F103精英板和CubeIDE的Hal库LCD驱动移植(从零开始)

    最近在学习王维波老师的<STM32Cube高效开发教程>,王老师移植的是普中科技的驱动,而我手动移植了一下正点原子的lcd驱动,看了网上的诸多教程,有的博客存在一些bug,于是乎手动整理了 ...

  8. ESP8266-Arduino编程实例-ILI9341-TFT LCD驱动(基于TFT_eSPI库)

    ILI9341-TFT LCD驱动(基于TFT_eSPI库) 液晶显示器 (LCD) 是一种平板显示器或其他电子调制光学设备,它利用液晶与偏振器的光调制特性.液晶不直接发光,而是使用背光或反射器来产生 ...

  9. 基于STM32F407的摄像头(不带FIFO的OV7670)图像采集及LCD显示实验-笔记整理

    硬件说明 STM32F4开发板 stm32f4系列的芯片处理的能力可以说非常强大了的,而且内部还自带有数字摄像头接口(DCMI),可以说stm32f407的核心板和不带FIFO的摄像头模块OV7670 ...

最新文章

  1. poj 3984 迷宫问题 BFS
  2. 前端参数无法转为后端实体内部类_Spring Boot返回前端Long型丢失精度
  3. 纪年法:公元和公元前
  4. csp怎么给线条描边_PS的四种“描边”方式你都知道吗?Photoshop小知识
  5. (Step2-500题)POJ训练计划+SGU
  6. 决策树 结构_决策树模型是什么?5步了解好看模型图
  7. koa 接口返回数据_node和koa实现数据mock接口
  8. python中的append()有什么功能_在python中append()函数能做什么
  9. android 找不到类文件,Android库:当“实现项目”用于库的模块依赖时,找不到类文件...
  10. MDF文件查看器(SQL MDF Viewer) 1.0 绿色版
  11. 短视频解析去水印在线 伪原创视频如何搬运
  12. Could not create the Java Virtual Machine
  13. android killer使用方法,AndroidKiller安装、设置及使用教程
  14. SpringBoot 开发案例之各种参数传递,以及前端代码和postman测试(完整版)
  15. ctab法提取dna流程图_CTAB法提取DNA
  16. Designing Machine Learning Systems with Python
  17. 吉尼斯官方确认火狐首日下载世界记录
  18. IT项目开发团队建设与管理总结(转)
  19. 如果一只股票退市,那么里面所持有这只股票人的钱该怎么办?
  20. 常用的报表工具有哪些?目前最流行的报表工具?

热门文章

  1. 【习题 5-8 UVA - 230】Borrowers
  2. 利用Python对文件进行批量重命名——以图片文件为例
  3. 【收集】Python 微优化
  4. [转]html超链接打开的窗口大小
  5. C语言宏定义取得两数的最大值和最小值
  6. 微软Webcast课程下载软件iReaper正式登陆Android平台
  7. vbs调用WebService -- 使用xmlhttp
  8. 福州公交车与拖拉机相撞1人死亡
  9. 如何:通过现有代码创建 C++ 项目
  10. 面向对象的思想是什么?