基于uCOSII的LCD驱动实验

  • 实验目的
  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得到机会能够运行。

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

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

相关文章

LeetCode 659. 分割数组为连续子序列(哈希)

文章目录1. 题目2. 解题1. 题目 给你一个按升序排序的整数数组 num&#xff08;可能包含重复数字&#xff09;&#xff0c;请你将它们分割成一个或多个子序列&#xff0c;其中每个子序列都由连续整数组成且长度至少为 3 。 如果可以完成上述分割&#xff0c;则返回 true &…

autotools入门笔记(二)——创建和使用静态库、动态库

带有静态库或者动态库的工程的构建过程与上一节&#xff08;&#xff09;只包含一个源文件的工程的构建过程是类似的。只是对于复杂的工程&#xff0c;如果包含多个还有源文件的目录时&#xff0c;需要对每个包含源文件的目录执行构建过程&#xff0c;另外创建和使用库文件时需…

LeetCode 1520. 最多的不重叠子字符串(贪心)

文章目录1. 题目2. 解题1. 题目 给你一个只包含小写字母的字符串 s &#xff0c;你需要找到 s 中最多数目的非空子字符串&#xff0c;满足如下条件&#xff1a; 这些字符串之间互不重叠&#xff0c;也就是说对于任意两个子字符串 s[i…j] 和 s[k…l] &#xff0c;要么 j <…

LeetCode 679. 24 点游戏(回溯)

文章目录1. 题目2. 解题1. 题目 你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通过 *&#xff0c;/&#xff0c;&#xff0c;-&#xff0c;(&#xff0c;) 的运算得到 24。 示例 1: 输入: [4, 1, 8, 7] 输出: True 解释: (8-4) * (7-1) 24示例 2: 输入: [1, 2, 1, 2] 输…

LeetCode 第 33 场双周赛(511/3304,前15.5%,第4次全部通过)

文章目录1. 比赛结果2. 题目1. LeetCode 5479. 千位分隔数 easy2. LeetCode 5480. 可以到达所有点的最少点数目 medium3. LeetCode 5481. 得到目标数组的最少函数调用次数 medium4. LeetCode 5482. 二维网格图中探测环 hard1. 比赛结果 题目比较简单&#xff0c;全部做出来了。…

Apache Commons IO: 简化文件和IO操作

第1章&#xff1a;引言 咱们在做Java编程的时候&#xff0c;经常会遇到各种文件操作和输入输出&#xff08;IO&#xff09;的问题。不论是读取一个配置文件&#xff0c;还是把数据写入日志&#xff0c;这些看似简单的任务有时候会让人头疼。传统的Java IO操作&#xff0c;虽然…

LeetCode 1560. 圆形赛道上经过次数最多的扇区

文章目录1. 题目2. 解题2.1 模拟2.2 脑筋急转弯1. 题目 给你一个整数 n 和一个整数数组 rounds 。有一条圆形赛道由 n 个扇区组成&#xff0c;扇区编号从 1 到 n 。 现将在这条赛道上举办一场马拉松比赛&#xff0c;该马拉松全程由 m 个阶段组成。其中&#xff0c;第 i 个阶段…

如何用jar命令对java工程进行打包

如何用jar命令对java工程进行打包有时候为了更方便快捷的部署和执行Java程序&#xff0c;要把java应用程序打包成一个jar包。而这个基础的操作有时候也很麻烦&#xff0c;为了方便java程序员们能够方便的打包java应用程序&#xff0c;下面对jar命令进行介绍&#xff0c;并举出几…

Android 行程APP简单介绍

登录模块 数据库设计如图所示创建了如上的数据库由于没有注册功能人为添加了两个用户&#xff1a; 数据库创建语句&#xff1a; public static final String CREATE_task "create table user (" "id integer primary key autoincrement, ""remenber…

LeetCode 1561. 你可以获得的最大硬币数目

文章目录1. 题目2. 解题1. 题目 有 3n 堆数目不一的硬币&#xff0c;你和你的朋友们打算按以下方式分硬币&#xff1a; 每一轮中&#xff0c;你将会选出 任意 3 堆硬币&#xff08;不一定连续&#xff09;。Alice 将会取走硬币数量最多的那一堆。你将会取走硬币数量第二多的那…

微信小程序 地图组件使用

本地图程序利用map组件&#xff0c;以及使用它的markers,polyline属性分别设置地图两个位置的标志以及他们之间的连线&#xff0c;利用腾讯地图的API对两个地点进行查询&#xff0c;动态设置地图的经纬度&#xff0c;以及动态初始化markers,polyline属性。 程序运行截图如下&a…

LeetCode 1562. 查找大小为 M 的最新分组

文章目录1. 题目2. 解题1. 题目 给你一个数组 arr &#xff0c;该数组表示一个从 1 到 n 的数字排列。有一个长度为 n 的二进制字符串&#xff0c;该字符串上的所有位最初都设置为 0 。 在从 1 到 n 的每个步骤 i 中&#xff08;假设二进制字符串和 arr 都是从 1 开始索引的情…

DurOS语音开发

DuerOS语音开发项目&#xff0c;该项目通过搭载DuerOS开发者平台&#xff0c;利用平台开发的一组API规范&#xff0c;实现实时的语音播报功能。 整体流程示意图&#xff1a; 所用设备&#xff1a;树莓派微机系统、arduino与74HC595单片机、地图彩灯控制沙盘、小度语音。 数据流…

LeetCode 1563. 石子游戏 V(DP)

文章目录1. 题目2. 解题2.1 区间DP1. 题目 几块石子 排成一行 &#xff0c;每块石子都有一个关联值&#xff0c;关联值为整数&#xff0c;由数组 stoneValue 给出。 游戏中的每一轮&#xff1a; Alice 会将这行石子分成两个 非空行&#xff08;即&#xff0c;左侧行和右侧行…

个人简历小程序

为了熟练掌握微信小程序开发的一些基本技巧&#xff0c;熟悉微信小程序开发流程&#xff0c;特此&#xff0c;运用所学知识&#xff0c;做了一个个人简历小程序。 效果图如下&#xff1a; 代码如下&#xff1a; ① index.jsconst app getApp() Page({ data: { userInfo: {}…

Android的Fragment介绍

前言 fragment是从android3.0开始提出来的&#xff0c;用来支持大屏幕设备的ui设计。通过将activity划分为多个fragment&#xff0c;不仅提高了设计的灵活性&#xff0c;而且可以在程序运行时改变它们的特征&#xff0c;比如动态的修改&#xff0c;替换已有的fragment等等。 fr…

[Kaggle] Heart Disease Prediction

文章目录1. 数据探索2. 特征处理管道3. 训练模型4. 预测kaggle项目地址1. 数据探索 import pandas as pd train pd.read_csv(./train.csv) test pd.read_csv(./test.csv)train.info() test.info() abs(train.corr()[target]).sort_values(ascendingFalse)<class pandas.c…

01.神经网络和深度学习 W2.神经网络基础

文章目录1. 二分类2. 逻辑回归3. 逻辑回归损失函数4. 梯度下降5. 导数6. 计算图导数计算7. 逻辑回归中的梯度下降8. m个样本的梯度下降9. 向量化10. 向量化的更多例子11. 向量化 logistic 回归12. 向量化 logistic 回归梯度输出13. numpy 广播机制14. 关于 python / numpy 向量…

Oracle数据库物理存储结构管理遇到的问题与解决

问题一&#xff1a;当我创建一个重做日志文件放入重做日志文件组中的时候&#xff0c;查询数据字典发现新创建的重做日志文件的状态为“不合法”。 解决方案&#xff1a; 通过查阅相关资料了解到 新建的重做日志文件组成员状态为INVALID,这是由于新建的成员文件还没有被…