基于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,一经查实,立即删除!

相关文章

python中的__slots__

为了达到限制的⽬的&#xff0c;Python允许在定义class的时候&#xff0c;定义一个特殊的 __slots__变量&#xff0c;来限制该class实例能添加的属性&#xff1a; class Foo(object): __slots__ ("a", "b") # 限制动态使用对象名添加东西&#xff08;属性…

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

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

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

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

等价类测试与决策表测试

问题&#xff1a;输入年月日year、month、day&#xff0c;其中年份的有效取值范围为[1818,2018]&#xff0c;请输出输入日期的前一天&#xff0c;例如输入2018年9月18日&#xff0c;输出为2018年9月17日。若输入日期非法&#xff0c;例如输入2013年2月30日&#xff0c;则输出“…

python中的私有化

1、xx: 公有变量2、_x: 单前置下划线,私有化属性或方法&#xff0c;from somemodule import * 禁止导入,类对象和子类可以访问。3、__xx&#xff1a;双前置下划线,避免与子类中的属性命名冲突&#xff0c;无法在外部直接访问(名字重整所以访问不到&#xff09;4、__xx__:双…

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

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

一个网页设计师应该考虑的9件事

1、永远都不要停止学习新的东西 在一个领域的趋势很容易成为过去&#xff0c;一个网页设计师应该不断尝试跟上最新的方法。从标志设计到用户界面&#xff0c;你应该寻找各种样品&#xff0c;并看看什么是新的&#xff0c;什么不是。此外&#xff0c;即使自己是不是对你有用&…

边界值测试

问题描述——找零钱最佳组合&#xff1a; 假设商店货品价格(R)皆不大于100元&#xff08;且为整数&#xff09;&#xff0c;若顾客付款在100元内(P)&#xff0c;求找给顾客之最少货币个&#xff08;张&#xff09;数&#xff1f;&#xff08;货币面值50元(N50)&#xff0c;10元…

python中的@property(get与set作用

class Bank(object): def__init__(self): self.__money 100 property defmoney(self): returnself.__money #raise AttributeError("该属性不支持读取操作") # 如果只提供了读取操作&#xff0c;而不提供设置操作的&#xff0c;这样的属性叫做只读属性 money.sette…

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] 输…

C++ Primer 有感(重载操作符)

1.用于内置类型的操作符&#xff0c;其含义不能改变。也不能为任何内置类型定义额外的新的操作符。&#xff08;重载操作符必须具有至少一个类类型或枚举类型的操作数。这条规则强制重载操作符不能重新定义用于内置类型对象的操作符的含义&#xff09;2.重载操作符&#xff0c;…

等价类测试

某直辖市的电话号码由三部分组成&#xff0c;这三部分的名称和内容分别是&#xff1a; &#xff08;1&#xff09;地区码&#xff1a;空白或3位数字&#xff1b; &#xff08;2&#xff09;前缀&#xff1a;非“0”和非“1”开头的4位数字&#xff1b; &#xff08;3&#xff0…

元类及创建元类的方法(面试用

元类就是类的类&#xff0c;type就是Python中创建所有类的元类。type就是创建类对象的类。Python中所有的东西——都是对象。这包括整数、字符串、函数以及类。它们全部都是对象&#xff0c;并且它们都是从一个类创建来&#xff0c;这个类就是type。# class Foo(object):# …

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

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

Oracle存储过程单步调试方法

oracle存储过程单步调试的方法 1.在要调试的过程上单击test&#xff0c;如下图所示&#xff1a; 2.出现如下界面时单击最左上方的按钮&#xff1a;&#xff0c;如下图所示&#xff1a; 3.单击后呈现如下画面&#xff1a; 其中&#xff1a; 表示要停止test; 表示要全部运行完这…

等价类、决策表测试

问题&#xff1a;输入年月日year、month、day&#xff0c;其中年份的有效取值范围为[1818,2018]&#xff0c;请输出输入日期的前一天&#xff0c;例如输入2018年9月18日&#xff0c;输出为2018年9月17日。若输入日期非法&#xff0c;例如输入2013年2月30日&#xff0c;则输出“…

小大整数对象池及intern机制

1. 小整数对象池 Python 对⼩整数的定义是[-5, 256] 2. 大整数对象池 每⼀个⼤整数&#xff0c;均创建⼀个新的对象。 a 100 b 100 # print(a is b) True # 代码块 c 1000 d 1000 print(c is d) # True class Foo(object): a 1000 c 1000 class …

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;并举出几…