第七章 变量进阶与点阵LED 练习题
题目:
练习题1:
关于变量的作用域和存储类别,这些关于C语言的一些基础知识在 浙大版《C语言程序设计(第三版)》中已经全面涉及,在此不一一赘述。
练习题2:
如图所示,为8*8LED点阵的外观和8*8点阵结构原理图
类似数码管动态显示,LED点阵的动画显示也是类似,通过不断地刷新,利用人眼的“余辉效应”,来让人感觉到就是一副图画在显示。
练习题3:
#include <reg52.h> sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;unsigned char code imag[]={
0xFF,0xFF,0x81,0x81,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0x81,0x81,0xFF,0xFF,0xFF,
0xFF,0xC3,0x81,0x00,0x00,0x00,0x81,0xC3,0xE7,0xFF,0xFF,0xFF,0xFF,0x99,0x99,0x99,
0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x81,0x81,0xC3,0xC3,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF
}; #通过字模软件生成相应的
void main()
{EA = 1; //使能总中断ENLED = 0; //使能U3ADDR3 = 0; //因为需要动态改变ADDR0-2的值,所以不需要再初始化了TMOD = 0x10; //设置T1为模式1TH1 = 0xFC; //为T1赋初值0xFC67,定时1msTL1 = 0x67;ET1 = 1; //使能T1中断TR1 = 1; //启动T1while (1);
}
// 定时器1中断服务函数,利用定时器实现动态的刷新LED点阵屏幕
void InterruptTimer1() interrupt 3
{static unsigned char i=0;static unsigned char tmr=0;static unsigned char index=0;TH1=0xfc;TL1=0x67;P0=0XFF;switch(i){case 0:ADDR2=0;ADDR1=0;ADDR0=0;i++;P0=imag[0+index];break;case 1:ADDR2=0;ADDR1=0;ADDR0=1;i++;P0=imag[1+index];break;case 2:ADDR2=0;ADDR1=1;ADDR0=0;i++;P0=imag[2+index];break;case 3:ADDR2=0;ADDR1=1;ADDR0=1;i++;P0=imag[3+index];break;case 4:ADDR2=1;ADDR1=0;ADDR0=0;i++;P0=imag[4+index];break;case 5:ADDR2=1;ADDR1=0;ADDR0=1;i++;P0=imag[5+index];break;case 6:ADDR2=1;ADDR1=1;ADDR0=0;i++;P0=imag[6+index];break;case 7:ADDR2=1;ADDR1=1;ADDR0=1;i=0;P0=imag[7+index];break;}tmr++;if(tmr>=250){tmr=0;index++;if(index>=43){index=0;}}
}
效果:
LED点阵动画显示
练习题4:
本练习题要求让LED显示屏显示向右的动画,因为该开发板为横向扫描,所以有两种方式让LED点阵显示向右的动画。第一种方法:将LED点阵屏幕转置,然后按照练习题3中的方法进行设计以及编写代码进行运行。第二种方法:利用二维数组的知识,就是将每一帧的数值都存在一个数组里面,因为代码比较繁琐,仅仅给出作者资料中给出的源码。
/*
*******************************************************************************
* 《手把手教你学51单片机(C语言版)》
* 配套 KST-51 单片机开发板 示例源代码
*
* (c) 版权所有 2014 金沙滩工作室/清华大学出版社 保留所有权利
* 获取更多资料请访问:http://www.kingst.org
*
* 文件名:main.c
* 描 述:第7章 作业题4
* 版本号:v1.0.0
* 备 注:lesson7_7的向左移动改为向右移动
*******************************************************************************
*/#include <reg52.h>sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;unsigned char code image[30][8] = {{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},{0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE},{0xFF,0xFC,0xFE,0xFE,0xFE,0xFE,0xFE,0xFC},{0xFF,0xF8,0xFC,0xFC,0xFC,0xFC,0xFC,0xF8},{0xFF,0xF0,0xF9,0xF9,0xF9,0xF9,0xF9,0xF0},{0xFF,0xE1,0xF3,0xF3,0xF3,0xF3,0xF3,0xE1},{0xFF,0xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC3},{0xFF,0x87,0xCE,0xCE,0xCE,0xCF,0xCF,0x87},{0xFF,0x0E,0x9C,0x9C,0x9C,0x9E,0x9F,0x0F},{0xFF,0x1C,0x38,0x38,0x38,0x3C,0x3E,0x1F},{0xFF,0x39,0x70,0x70,0x70,0x78,0x7C,0x3E}, {0xFF,0x73,0xE0,0xE0,0xE0,0xF0,0xF8,0x7C},{0xFF,0xE6,0xC0,0xC0,0xC0,0xE0,0xF0,0xF9},{0xFF,0xCC,0x80,0x80,0x80,0xC0,0xE1,0xF3},{0xFF,0x99,0x00,0x00,0x00,0x81,0xC3,0xE7},{0xFF,0x33,0x01,0x01,0x01,0x03,0x87,0xCF},{0xFF,0x67,0x03,0x03,0x03,0x07,0x0F,0x9F},{0xFF,0xCE,0x06,0x06,0x06,0x0E,0x1E,0x3F},{0xFF,0x9C,0x0C,0x0C,0x0C,0x1C,0x3C,0x7E},{0xFF,0x39,0x19,0x19,0x19,0x39,0x78,0xFC},{0xFF,0x73,0x33,0x33,0x33,0x73,0xF0,0xF8},{0xFF,0xE6,0x66,0x66,0x66,0xE6,0xE0,0xF0},{0xFF,0xCC,0xCC,0xCC,0xCC,0xCC,0xC0,0xE1},{0xFF,0x99,0x99,0x99,0x99,0x99,0x81,0xC3},{0xFF,0x33,0x33,0x33,0x33,0x33,0x03,0x87},{0xFF,0x67,0x67,0x67,0x67,0x67,0x07,0x0F},{0xFF,0xCF,0xCF,0xCF,0xCF,0xCF,0x0F,0x1F},{0xFF,0x9F,0x9F,0x9F,0x9F,0x9F,0x1F,0x3F},{0xFF,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x7F},{0xFF,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0xFF},
};void main()
{EA = 1; //使能总中断ENLED = 0; //使能U4,选择LED点阵ADDR3 = 0;TMOD = 0x01; //设置T0为模式1TH0 = 0xFC; //为T0赋初值0xFC67,定时1msTL0 = 0x67;ET0 = 1; //使能T0中断TR0 = 1; //启动T0while (1);
}
/* 定时器0中断服务函数 */
void InterruptTimer0() interrupt 1
{static unsigned char i = 0; //动态扫描的索引static unsigned char tmr = 0; //250ms软件定时器static unsigned char index = 0; //图片刷新索引TH0 = 0xFC; //重新加载初值TL0 = 0x67;//以下代码完成LED点阵动态扫描刷新P0 = 0xFF; //显示消隐switch (i){case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=image[index][0]; break;case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=image[index][1]; break;case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=image[index][2]; break;case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=image[index][3]; break;case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=image[index][4]; break;case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=image[index][5]; break;case 6: ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=image[index][6]; break;case 7: ADDR2=1; ADDR1=1; ADDR0=1; i=0; P0=image[index][7]; break;default: break;}//以下代码完成每250ms改变一帧图像tmr++;if (tmr >= 250) //达到250ms时改变一次图片索引{tmr = 0;index++;if (index >= 30) //图片索引达到30后归零{index = 0;}}
}
效果:
LED点阵右移
练习五:因为在练习四和练习三中,已经了解了LED点阵屏幕如何左右和上下动态显示。该练习题也是类似的做法,不详细解答。
练习题六:尝试实现流水灯,数码管和点阵同时显示,也是通过单片机的定时器作用,利用余辉效应,感觉是在同时显示。对于每一种效果的显示,可以单独设计函数来进行实现,这里就不详细解答了。
第七章 变量进阶与点阵LED 练习题相关推荐
- (学习笔记)手把手教你学51单片机:变量进阶与点阵LED
一.变量的作用域 作用域:变量的有效范围.分为:局部变量和全局变量. 1.1局部变量 在函数内部声明的变量,只在本函数内部可以使用. 1.2全局变量 在函数外声明的变量就是全局变量. 二.变量的存储类 ...
- 手把手教你学51单片机-变量进阶与点阵LED
变量的作用域 所谓的作用域就是指变量起作用的范围,也是变量的有效范围.变量按他的作用域可以 分为局部变量和全局变量. 局部变量 在一个函数内部声明的变量是内部变量,它只在本函数内有效,在本函数以外是不 ...
- 第七章 项目进阶,构建安全高效的企业服务
第七章 项目进阶,构建安全高效的企业服务 1.Spring Security 1.1 基本介绍 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案 ...
- Python学习入门基础 -- 第四章 列表、元组、字典、字符串变量使用、变量进阶
Python基础入门知识点总结传送门 第一章 认识Python.Python常用集成开发环境PyCharm 第二章 注释.变量基本使用.变量的命名 第三章 运算符.判断if语句.while和for循环 ...
- JavaSE进阶 第七章 常用类 (一) String
目录 1.注意点 2.String类的构造方法 3.String类的常用方法 传送门 1.注意点 java中用双引号括起来的都是String对象,且字符串是不可变的 java中用双引号括起来的字符串都 ...
- stata:第七章 使用指示变量
应用stata学习计量经济学原理 第七章 使用指示变量 本章代码 第七章 使用指示变量 本章代码 * setup version 11.1 capture log close set more off ...
- c语言下标法改为指针变量法,C语言教材第七章指针实验.doc
C语言教材第七章指针实验.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文 ...
- AcWing进阶算法课Level-4 第七章 基础算法
AcWing进阶算法课Level-4 第七章 基础算法 启发式合并 AcWing 2154. 梦幻布丁73人打卡 AcWing 3189. Lomsat gelral54人打卡 manacher算法 ...
- 第七章 LED将为我闪烁:控制发光二极管
该Linux驱动用来控制开发板上的4个LED灯,即通过向Linux驱动发送数据可以控制LED灯的开关.LED驱动提供两种交互方式:命令和读写设备文件. 测试LED驱动之前需用USB线连接开发板,然后打 ...
- stm32 工业按键检测_「正点原子STM32Mini板资料连载」第七章 按键输入实验
1)实验平台:正点原子STM32mini开发板 2)摘自<正点原子STM32 不完全手册(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第七章 按键输入实验 上一章,我们介 ...
最新文章
- 政府安全资讯精选 2017年第六期 车联网和移动安全可能成为未来监管重点
- 最简单的kafka demo案例
- 电子设计竞赛(三)-SPWM与PID
- 一个 人 的 态度 决定 他 成功 的 高度
- LeetCode 778. 水位上升的泳池中游泳(二分查找+dfs)
- mysql和python先学哪个_Python数据库操作 初识mysql和mysql基本操作#学习猿地
- 打开tomcat的管理平台,管理应用
- java接口返回类,Java接口和返回类型 - java
- cpu频率_CPU频率的提升到底会产生哪些影响?
- Requests 高级用法 —2.18.1 文档
- 捷信达酒店管理系统使用说明-前言
- Solidworks教程:solidworks常用的十个技巧
- ppt设置外观样式_幻灯片的外观设置
- 2021-7-28-自动化运维Ansible
- 大气辐射学期中知识点总结
- 【庖丁解牛】configure: error: Please reinstall the libzip distribution
- 如果一个女人喜欢你,又不跟你在一起,而且只跟你很暧昧,那代表什么
- js 对象转数组 数组转对象
- Django作业管理系统(1)
- JS: 填充指定长度字符串到目标字符串