中断与数码管动态显示代码[未验证版]

news/2024/11/8 15:35:10/文章来源:https://www.cnblogs.com/EricsT/p/18535183

数码管从0-999999且高位0显示


#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 LedChar[] = //数码管显示字符转换表
{0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};unsigned char LedBuff[] = //数码管显示缓冲区,初值为0xFF确保启动时都不亮
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};unsigned char i = 0;//动态扫描的索引
unsigned int cnt = 0;//记录T0中断次数
unsigned char isFlag = 0;//1s标志位void main(void)
{unsigned long sec = 0;//记录经过的秒数ENLED = 0;//使能U3,选择控制数码管ADDR3 = 1;//因为需要动态改变ADDR0-2的值,所以不需要再初始化了TMOD = 0x01;//设置T0为模式1TH0 = 0xFC;//设置T0赋初值为0xFC67,定时1msTL0 = 0x67;TR0 = 1;//启动T0EA = 1;//使能总中断ET0 = 1;//使能T0中断while (1){if (1 == isFlag)//判断1秒定时标志{isFlag = 0;//1秒定时标志清零if (999999 == sec)sec = 0;elsesec++;//秒计数加1//以下代码将sec按十进制位从低到高依次提取并转为数码管显示字符LedBuff[0] = LedChar[sec % 10];LedBuff[1] = LedChar[sec / 10 % 10];LedBuff[2] = LedChar[sec / 100 % 10];LedBuff[3] = LedChar[sec / 1000 % 10];LedBuff[4] = LedChar[sec / 10000 % 10];LedBuff[5] = LedChar[sec / 100000 % 10];}}
}/* 定时器中断服务函数 */
void interrupt0 (void) interrupt 1//T0中断
{TH0 = 0xFC;//重新赋初值TL0 = 0x67;cnt++;//计数值加1if (cnt > 1000){cnt = 0;//清零计数值以重新开始下一秒计时isFlag = 1;	   //设置1秒定时标志位1}P0 = 0xFF;//显示消隐//以下代码完成数码管动态扫描刷新switch (i){case 0: ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;i++;P0 = LedBuff[0];break;case 1: ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;i++;P0 = LedBuff[1];break;case 2: ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;i++;P0 = LedBuff[2];break;case 3: ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;i++;P0 = LedBuff[3];break;case 4: ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;i++;P0 = LedBuff[4];break;case 5: ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;i = 0;P0 = LedBuff[5];break;default:break;}
}

数码管从0-999999且高位0不显示

#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 LedChar[] = //数码管显示字符转换表
{0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};unsigned char LedBuff[] = //数码管显示缓冲区,初值为0xFF确保启动时都不亮
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};unsigned char i = 0;//动态扫描的索引
unsigned int cnt = 0;//记录T0中断次数
unsigned char isFlag = 0;//1s标志位void main(void)
{unsigned long sec = 0;//记录经过的秒数ENLED = 0;//使能U3,选择控制数码管ADDR3 = 1;//因为需要动态改变ADDR0-2的值,所以不需要再初始化了TMOD = 0x01;//设置T0为模式1TH0 = 0xFC;//设置T0赋初值为0xFC67,定时1msTL0 = 0x67;TR0 = 1;//启动T0EA = 1;//使能总中断ET0 = 1;//使能T0中断while (1){if (1 == isFlag)//判断1秒定时标志{isFlag = 0;//1秒定时标志清零if (999999 == sec)sec = 0;elsesec++;//秒计数加1//以下代码将sec按十进制位从低到高依次提取并转为数码管显示字符LedBuff[0] = LedChar[sec % 10];LedBuff[1] = LedChar[sec / 10 % 10];LedBuff[2] = LedChar[sec / 100 % 10];LedBuff[3] = LedChar[sec / 1000 % 10];LedBuff[4] = LedChar[sec / 10000 % 10];LedBuff[5] = LedChar[sec / 100000 % 10];}}
}/* 定时器中断服务函数 */
void interrupt0 (void) interrupt 1//T0中断
{TH0 = 0xFC;//重新赋初值TL0 = 0x67;cnt++;//计数值加1if (cnt > 1000){cnt = 0;//清零计数值以重新开始下一秒计时isFlag = 1;	   //设置1秒定时标志位1}P0 = 0xFF;//显示消隐//以下代码完成数码管动态扫描刷新switch (i){case 0: if (x >= 0){ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;i++;P0 = LedBuff[0];}break;case 1: if (x >= 10){ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;i++;P0 = LedBuff[1];}break;case 2: if (x >= 100){ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;i++;P0 = LedBuff[2];}break;case 3: if (x >= 1000){ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;i++;P0 = LedBuff[3];}break;case 4: if (x >= 10000){ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;i++;P0 = LedBuff[4];}break;case 5: if (x >= 100000){ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;i = 0;P0 = LedBuff[5];}break;default:break;}
}

数码管从999999-0且高位0显示


#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 LedChar[] = //数码管显示字符转换表
{0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};unsigned char LedBuff[] = //数码管显示缓冲区,初值为0xFF确保启动时都不亮
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};unsigned char i = 0;//动态扫描的索引
unsigned int cnt = 0;//记录T0中断次数
unsigned char isFlag = 0;//1s标志位void main(void)
{unsigned long sec = 999999;//秒数ENLED = 0;//使能U3,选择控制数码管ADDR3 = 1;//因为需要动态改变ADDR0-2的值,所以不需要再初始化了TMOD = 0x01;//设置T0为模式1TH0 = 0xFC;//设置T0赋初值为0xFC67,定时1msTL0 = 0x67;TR0 = 1;//启动T0EA = 1;//使能总中断ET0 = 1;//使能T0中断while (1){if (1 == isFlag)//判断1秒定时标志{isFlag = 0;//1秒定时标志清零if (0 == sec)sec = 999999;elsesec--;//秒计数减1//以下代码将sec按十进制位从低到高依次提取并转为数码管显示字符LedBuff[0] = LedChar[sec % 10];LedBuff[1] = LedChar[sec / 10 % 10];LedBuff[2] = LedChar[sec / 100 % 10];LedBuff[3] = LedChar[sec / 1000 % 10];LedBuff[4] = LedChar[sec / 10000 % 10];LedBuff[5] = LedChar[sec / 100000 % 10];}}
}/* 定时器中断服务函数 */
void interrupt0 (void) interrupt 1//T0中断
{TH0 = 0xFC;//重新赋初值TL0 = 0x67;cnt++;//计数值加1if (cnt > 1000){cnt = 0;//清零计数值以重新开始下一秒计时isFlag = 1;	   //设置1秒定时标志位1}P0 = 0xFF;//显示消隐//以下代码完成数码管动态扫描刷新switch (i){case 0: ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;i++;P0 = LedBuff[0];break;case 1: ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;i++;P0 = LedBuff[1];break;case 2: ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;i++;P0 = LedBuff[2];break;case 3: ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;i++;P0 = LedBuff[3];break;case 4: ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;i++;P0 = LedBuff[4];break;case 5: ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;i = 0;P0 = LedBuff[5];break;default:break;}
}

数码管从999999-0且高位0不显示


#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 LedChar[] = //数码管显示字符转换表
{0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};unsigned char LedBuff[] = //数码管显示缓冲区,初值为0xFF确保启动时都不亮
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};unsigned char i = 0;//动态扫描的索引
unsigned int cnt = 0;//记录T0中断次数
unsigned char isFlag = 0;//1s标志位void main(void)
{unsigned long sec = 999999;//秒数ENLED = 0;//使能U3,选择控制数码管ADDR3 = 1;//因为需要动态改变ADDR0-2的值,所以不需要再初始化了TMOD = 0x01;//设置T0为模式1TH0 = 0xFC;//设置T0赋初值为0xFC67,定时1msTL0 = 0x67;TR0 = 1;//启动T0EA = 1;//使能总中断ET0 = 1;//使能T0中断while (1){if (1 == isFlag)//判断1秒定时标志{isFlag = 0;//1秒定时标志清零if (0 == sec)sec = 999999;elsesec--;//秒计数减1//以下代码将sec按十进制位从低到高依次提取并转为数码管显示字符LedBuff[0] = LedChar[sec % 10];LedBuff[1] = LedChar[sec / 10 % 10];LedBuff[2] = LedChar[sec / 100 % 10];LedBuff[3] = LedChar[sec / 1000 % 10];LedBuff[4] = LedChar[sec / 10000 % 10];LedBuff[5] = LedChar[sec / 100000 % 10];}}
}/* 定时器中断服务函数 */
void interrupt0 (void) interrupt 1//T0中断
{TH0 = 0xFC;//重新赋初值TL0 = 0x67;cnt++;//计数值加1if (cnt > 1000){cnt = 0;//清零计数值以重新开始下一秒计时isFlag = 1;	   //设置1秒定时标志位1}P0 = 0xFF;//显示消隐//以下代码完成数码管动态扫描刷新switch (i){case 0: if (x >= 0){ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;i++;P0 = LedBuff[0];}break;case 1: if (x >= 10){ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;i++;P0 = LedBuff[1];}break;case 2: if (x >= 100){ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;i++;P0 = LedBuff[2];}break;case 3: if (x >= 1000){ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;i++;P0 = LedBuff[3];}break;case 4: if (x >= 10000){ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;i++;P0 = LedBuff[4];}break;case 5: if (x >= 100000){ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;i = 0;P0 = LedBuff[5];}break;default:break;}
}

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

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

相关文章

央国企“严选”!天翼云夺得IaaS+PaaS市场桂冠!

10月17日,赛迪顾问发布的《2024中国央国企云市场研究报告》显示,2023年,在中国央国企云“IaaS+PaaS”市场中,中国电信天翼云凭借行业云和全栈服务能力、渠道优势位居第一。10月17日,赛迪顾问发布的《2024中国央国企云市场研究报告》显示,2023年,在中国央国企云“IaaS+Pa…

舞台已就位!坐等AI玩家集结!

舞台已就位!坐等AI玩家集结!舞台已就位!坐等AI玩家集结!

Nuxt.js 应用中的 prepare:types 事件钩子详解

title: Nuxt.js 应用中的 prepare:types 事件钩子详解 date: 2024/11/8 updated: 2024/11/8 author: cmdragon excerpt: prepare:types 钩子为 Nuxt.js 开发者提供了灵活定制 TypeScript 配置和声明的能力。通过使用此钩子,开发者能够确保 TypeScript 配置和类型声明能够满…

线段树的好朋友,平衡复杂度的好帮手——多叉堆

多叉堆,和 另外一个 是好兄弟,在某些 dijkstra 中用于阳间地平衡复杂度。 本质上是控制堆的高度,用一个 \(V^{\frac 1 k}\) 叉树来维护堆,当元素的值减小时只需要 \(O(k)\),弹出最小值也只需要 \(O(k + V^{\frac{1}{k}})\),当 \(k\) 取 \(\ge 2\) 的常数(根据题目来)就…

BERT 微调实战

带着问题来学习BERT 的预训练过程是如何完成的,在预训练过程中,采用了哪两种任务?本次实战是用 SQuAD 数据集微调 BERT, 来完成我们的问答任务,你能否用 IMDB 影评数据集来微调 BERT,改进 BERT 的结果准确率?文章最后会公布问题的参考答案~一、BERT 简介 BERT 全称 Bidi…

视频智能分析网关视频分析网关区域人数统计检测算法探析

随着城市化进程的加快和公共安全管理需求的提升,对公共场所、工业区域等人流量密集场所的监控和管理变得尤为重要。传统的视频监控系统已经无法满足现代智能化管理的需求,市场迫切需要一种能够实现实时监控、智能分析和自动报警的高效解决方案。基于此,区域人数统计视频分析…

SDN实验报告

SDN上机实验 实验目的能够使用Mininet的实现网络拓扑构建;熟悉Open vSwitch交换机的基本配置;熟悉OpenFlow协议的通信原理掌握pox控制器的基本使用方法;掌握Ryu控制期的基本使用方法;掌握北向应用的基本开发方法实验环境 基础环境选择ubuntu-20.04.6-desktop-amd64 实验内容…

双11买ToDesk远程控制&云电脑,看这一篇就够了!

今年双十一各大商家实在是太卷了,预售定金满减凑单一堆花活。但小编发现ToDesk远程控制&云电脑的双十一活动不一般。 囊括了远程控制各种会员版本的年包优惠,云电脑的计时机包时机活动,充值还送钱,优惠力度大,而且直接减钱,不费脑子就拿下超值价格。小编给大家简单整理了…

Java 面试用什么项目?全是商场秒杀 RPC,我吐了

看了几百份简历,真的超过 90% 的小伙伴的项目是商城、RPC、秒杀、论坛、外卖、点评等等烂大街的项目,人人都知道这些项目烂大街了,但大部分同学还是得硬着头皮做,没办法,网络上能找到的、教程比较完善的就这些项目了,做的话好歹有个项目,不做那就真能写学校做的垃圾学生…

极狐GitLab 签约某清洁能源高科技企业,助力零碳技术开创更加美好的零碳世界

客户背景 该客户是一家全球领先的清洁能源高科技公司,总部位于江苏省。公司自成立之初就致力于为全球客户提供清洁、高效、安全的能源解决方案,希望能用高科技技术让新能源发挥更大价值,让世界变得更加美好。当前,该客户在多个能源领域都有领先的产品和成熟的解决方案,也一…

DAC8568IAPWR 数据手册 具有 2.5V、2ppm/C 内部基准电压的 DAC7568、DAC8168、DAC8568 12/14/16 位、8 通道、超低毛刺、电压输出数模转换器芯片

DAC7568、DAC8168 和 DAC8568 分别为 12 位、14位和 16 位低功耗、电压输出、八通道数模转换器(DAC)。这些器件包括一个 2.5V、2ppm/C 内部基准电压(默认禁用),可提供 2.5V 或 5V 的满量程输出电压范围。内部基准电压初始精度为 0.004%,而且可在 VREFIN/VREFOUT 引脚上提供…

ue4资产序列化从入门到精通: 第一章 初识序列化

一、写作目的:(全文字数4926,阅读大约需25min) 首先,我有一个相关的需求要做,然后在拜读了网络上各大UE4序列化解析的文章后,发现大都讲的很模糊,对新入序列化大门的小白非常不友好。有的直接贴上一大段代码(好似直接糊脸上的不解释连招),也有的讲着讲着嘎然而止,也有的…