单片机C语言开发学习笔记---动态的数码管
在郭天祥的那本书中,有一个通过按键控制数码管的例子,在运行这个例子的时候,我发现当按键按下的时候,第一位数码管会熄掉,这是为什么呢?
后来在网上找到了原因,当我按下按键不松开的时候,接下来要运行的代码会阻塞,因为多位数码管是动态扫描显示的,所以就会发生上述问题。
修改后的代码如下(未验证)
#include "mylib.h"
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
/**
* Global Value
*/
sbit key1 = P3 ^ 4; //increase the number
sbit key2 = P3 ^ 5; //decrease the number
sbit key3 = P3 ^ 6; //start
sbit key4 = P3 ^ 7; //clear
uchar key1Flag = 0;
uchar key2Flag = 0;
uchar key3Flag = 0;
uchar key4Flag = 0;
sbit dula = P2 ^ 6;
sbit wula = P2 ^ 7;
uchar numt0, num;
uchar pressed = 0;
void Init();
void ScanKey();
void Display(uchar numdis);
void main()
{
Init();
while (1)
{
ScanKey();
Display(num);
}
}
void Init()
{
TMOD = 0x01; //set the counter mode
TH0 = (65536 - 45872) / 256;
TL0 = (65536 - 45872) % 256;
EA = 1;
ET0 = 1;
}
void ScanKey()
{
if (key1 == 0)
{
Delay(10);
if ((key1 == 0))
{
key1Flag = 1;
}
}
else if (key1 == 1)
{
if (key1Flag == 1)
{
key1Flag = 0;
num++;
if (num == 60)
{
num = 0;
}
}
}
if (key2 == 0)
{
Delay(10);
if ((key2 == 0))
{
key2Flag = 1;
}
}
else if (key2 == 1)
{
if (key2Flag == 1)
{
key2Flag = 0;
if (num == 0)
{
num = 60;
}
num--;
}
}
if (key3 == 0)
{
Delay(10);
if ((key3 == 0) && (pressed == 0))
{
pressed = 1;
num = 0;
}
}
else
{
if (pressed == 1)
{
pressed = 0;
}
}
if (key4 == 0)
{
Delay(10);
if ((key4 == 0) && (pressed == 0))
{
pressed = 1;
TR0 = ~TR0;
}
}
else
{
if (pressed == 1)
{
pressed = 0;
}
}
}
void Display(uchar numdis)
{
uchar tens, ones;
tens = numdis / 10;
ones = numdis % 10;
dula = 1;
P0 = digCode[tens];
dula = 0;
P0 = 0xff;
wula = 1;
P0 = 0xef;
wula = 0;
Delay(4);
dula = 1;
P0 = digCode[ones];
dula = 0;
P0 = 0xff;
wula = 1;
P0 = 0xdf;
wula = 0;
Delay(4);
}
void T0_time() interrupt 1
{
TH0 = (65536 - 45872) / 256;
TL0 = (65536 - 45872) % 256;
numt0++;
if (numt0 == 20)
{
numt0 = 0;
num++;
if (num == 60)
{
num = 0;
}
}
}
原谅我没加上注释,毕竟这段代码还是不够完美。
解决方案详解
当第一次扫描到按键按下的信号,延时10ms(去抖),再次判断信号是否存在,如果存在,设置该按键的被按下的旗帜为1。在没有检测到按键按下的信号的时候,判断该按键的被按下的旗帜是否为1,如果是的话,执行按键的功能,否则,继续检测下一个按键
仍然存在的问题
第一位的数码管在按键按下的时候会变暗
推测的原因
扫描函数又臭又长,可能导致第一位数码管的扫描显示间隔比较大
单片机C语言开发学习笔记---动态的数码管的更多相关文章
- 西门子PLC-1200 SCL语言开发学习笔记 (一)
一.简介和背景 PLC一般使用梯形图开发,但是梯形图适合电工使用而不是程序员使用,对我们来说开发困难,门槛高,幸好PLC的开发标准还带了类pascal的高级语言,在西门子这里叫SCL语言,这对于我们程 ...
- <WP8开发学习笔记>动态修改启动时导航的第一个页面(如登录前启动页为LoginPage,登录后变为MainPage)
很多时候我们需要在启动程序的时候根据状态改变初始导航页面,比如程序在启动的时候判断用户是否登录, 如果未登录则跳转到LoginPage.xaml否则跳转到MainPage界面. 这时候就要分析程序的启 ...
- 西门子PLC SCL语言开发学习笔记(二)
今天来讲下scl两个关键的点 一.按键事件 比如地址I0.0是某个按钮的状态,他只有True和False两个状态,所以我们要获得按下事件需要我们自己模拟. #KeyPress := "Btn ...
- Kinect开发学习笔记之(一)Kinect介绍和应用
Kinect开发学习笔记之(一)Kinect介绍和应用 zouxy09@qq.com http://blog.csdn.net/zouxy09 一.Kinect简单介绍 Kinectfor Xbox ...
- Rest API 开发 学习笔记(转)
Rest API 开发 学习笔记 概述 REST 从资源的角度来观察整个网络,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表示方式.获得这些表徵致使这些应用程序转变了其状态.随着 ...
- ASP.NET Core Web开发学习笔记-1介绍篇
ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...
- 【前端】移动端Web开发学习笔记【2】 & flex布局
上一篇:移动端Web开发学习笔记[1] meta标签 width设置的是layout viewport 的宽度 initial-scale=1.0 自带 width=device-width 最佳实践 ...
- 【前端】移动端Web开发学习笔记【1】
下一篇:移动端Web开发学习笔记[2] Part 1: 两篇重要的博客 有两篇翻译过来的博客值得一看: 两个viewport的故事(第一部分) 两个viewport的故事(第二部分) 这两篇博客探讨了 ...
- 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址
驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...
随机推荐
- PostgreSQL应用相关问题解决
PostgreSQL中是否区分聚簇索引与非聚簇索引的问题? 答:PostgreSQL中区分聚簇索引与非聚簇索引. 示例如下: 创建聚族索引: CREATE INDEX test_ind ON yy ( ...
- [转] JAVA多线程和并发基础面试问答
JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...
- 禁用cookie后session是如何设置的
我们都知道当在session 会话有基于cookie和基于url两种传递SESSIONID的方法.为了实现客户端禁止cookie发送的情况也不影响客户登陆网站,可以设置 php.ini中 sessio ...
- kafka 0.8.x producer Example(scala)
Producer 最简配置 metadata.broker.list参数指定broker地址,这里不需要填上所有的broker地址,但是如果只写一个,这个broker挂掉后就无法往topic中写入信息 ...
- kafka管理器kafka-manager部署安装
运行的环境要求 Kafka 0.8.1.1+ sbt 0.13.x Java 7+ 功能 为了简化开发者和服务工程师维护Kafka集群的工作,yahoo构建了一个叫做Kafka管理器的基于Web工具, ...
- Win7旗舰版中的IIS配置asp.net的运行环境
Win7旗舰版中的IIS配置asp.net的运行环境 以前弄过好多次,都没有成功,昨天晚上不知怎么地就成功了,借用我同学的一句话,这叫“灵光一闪”,废话不多说了,这个成功是有图有视频有真相地哈! ...
- [转]通过PowerShell工具跨多台服务器执行SQL脚本
转至:http://www.cnblogs.com/SameZhao/p/4743692.html 有时候,当我们并没有合适的第三方工具(大部分需要付费)去管理多台数据库服务器,那么如何做最省力.省心 ...
- drupal 做301跳转(删除url里的www), 关键代码 可用到任何网站
//hook_init(); function ex_init(){ //删除 url 前面的 www if (substr($_SERVER['HTTP_HOST'],0,3) == 'www'){ ...
- java运算符优先级记忆口诀
尊重原创:(口诀)转自http://lasombra.iteye.com/blog/991662 今天看到<java编程思想>中的运算符优先级助记口诀,不过"Ulcer Addi ...
- 160927、用jquery 重置表单的方法
清空 我们项目小小部分的搜索条件: 客户要做的是,只要一键 "清空搜索条件" 即可清空维护地点.订单ID等条件. js函数 //重置表单 function resetform(){ ...