编写用138编码器控制动态数码管位选的数字钟程序

时间: 2023-08-11 09:03:54 浏览: 49
好的,以下是使用138编码器控制动态数码管位选的数字钟程序示例: ```C // 引入所需的库 #include <reg51.h> // 定义端口和引脚 sbit EN1 = P2^0; // 138译码器的使能端1 sbit EN2 = P2^1; // 138译码器的使能端2 sbit EN3 = P2^2; // 138译码器的使能端3 sbit A = P1^0; // 数码管A段 sbit B = P1^1; // 数码管B段 sbit C = P1^2; // 数码管C段 sbit D = P1^3; // 数码管D段 sbit E = P1^4; // 数码管E段 sbit F = P1^5; // 数码管F段 sbit G = P1^6; // 数码管G段 // 常量定义 #define DELAY_MS 1 // 数码管刷新时间间隔(毫秒) // 数码管显示的数字对应的编码(共阳极数码管) unsigned char code digitPatterns[] = { 0x3F, // 0 0x06, // 1 0x5B, // 2 0x4F, // 3 0x66, // 4 0x6D, // 5 0x7D, // 6 0x07, // 7 0x7F, // 8 0x6F // 9 }; // 数码管显示的位选对应的编码 unsigned char code digitSelect[] = { 0xFE, // 第一位选中 0xFD, // 第二位选中 0xFB // 第三位选中 }; // 延时函数 void delay(unsigned int ms) { unsigned int i, j; for (i = 0; i < ms; i++) { for (j = 0; j < 120; j++) { // 根据实际情况调整延时时间 } } } // 数码管显示函数 void displayDigit(unsigned int num) { unsigned int digit1, digit2, digit3; digit1 = num % 10; // 获取个位数 digit2 = (num / 10) % 10; // 获取十位数 digit3 = (num / 100) % 10; // 获取百位数 // 分别显示三个数码管的数字 A = digitPatterns[digit1] & 0x01; B = digitPatterns[digit1] & 0x02; C = digitPatterns[digit1] & 0x04; D = digitPatterns[digit1] & 0x08; E = digitPatterns[digit1] & 0x10; F = digitPatterns[digit1] & 0x20; G = digitPatterns[digit1] & 0x40; EN1 = 0; // 选中第一个数码管 delay(DELAY_MS); EN1 = 1; A = digitPatterns[digit2] & 0x01; B = digitPatterns[digit2] & 0x02; C = digitPatterns[digit2] & 0x04; D = digitPatterns[digit2] & 0x08; E = digitPatterns[digit2] & 0x10; F = digitPatterns[digit2] & 0x20; G = digitPatterns[digit2] & 0x40; EN2 = 0; // 选中第二个数码管 delay(DELAY_MS); EN2 = 1; A = digitPatterns[digit3] & 0x01; B = digitPatterns[digit3] & 0x02; C = digitPatterns[digit3] & 0x04; D = digitPatterns[digit3] & 0x08; E = digitPatterns[digit3] & 0x10; F = digitPatterns[digit3] & 0x20; G = digitPatterns[digit3] & 0x40; EN3 = 0; // 选中第三个数码管 delay(DELAY_MS); EN3 = 1; } // 主函数 void main() { unsigned int num = 0; while (1) { displayDigit(num); // 显示数字 num++; // 数字递增 if (num > 999) { num = 0; // 数字归零 } } } ``` 这是一个简单的数字钟程序,使用了138译码器来控制动态数码管的位选。程序中定义了数码管显示的数字模式和位选模式,并通过循环不断刷新数码管显示的数字。你可以根据实际连接的硬件进行适当的修改和调整。 注意:此程序是基于单片机8051的,使用Keil C编译器进行编译。如果你使用其他平台或编译器,请适当进行修改。 希望对你有帮助!如果有任何问题,请随时提问。

相关推荐

最新推荐

recommend-type

基于FPGA的数字时钟数码管显示

这是两年前开始学习FPGA的时候做的实验,已经好久没有接触FPGA了,板卡也积灰不少了,是时候安排时间重新拾起曾经美好的回忆了。下面是曾经的实验笔记。
recommend-type

单片机C语言程序设计:定时器控制数码管动态显示

名称:定时器控制数码管动态显示 说明:8 个数码管上分两组动态显示年月日与时分秒,本例的位显示延时用定时器实现。
recommend-type

基于51单片机DS1302四位数码管可调时钟

基于51单片机DS1302四位数码管可调1时钟设计,含有原理图及配套程序。
recommend-type

单片机控制74HC595动态扫描数码管显示

74HC595是具有8位移位寄存器和一个存储器,三态输出功能。移位寄存器和存储器是分别的时钟。数据在SCK的上升沿输入,在RCK的上升沿进入的存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个...
recommend-type

PLC实现LED数码管动态扫描数据显示

设计主要是将一个两位数分成两组数据分别在十位和个位数码管上显示,程序采用循环控制方式,则一个扫描周期显示一组数据,即两组数据循环显示。
recommend-type

STC89C51 简单时钟

STC89C51 简单时钟,叫你从基础开始学习单片机,
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB归一化方法大比拼:5种方法,哪种最适合你的数据?

![MATLAB归一化方法大比拼:5种方法,哪种最适合你的数据?](https://www.finebi.com/wp-content/uploads/2019/11/FineBI%E8%A1%8C%E4%B8%9A%E9%A9%BE%E9%A9%B6%E8%88%B1-1024x510.png) # 1. MATLAB归一化概述 归一化是一种数据预处理技术,用于将数据缩放到特定范围内,从而消除不同特征之间的尺度差异。在MATLAB中,有各种归一化方法可用于不同类型的数据和应用程序。 归一化的主要目的是: - 提高模型的训练效率和准确性,通过消除特征之间的尺度差异,使模型能够更有效地学习
recommend-type

failed to register layer: ApplyLayer exit status 1 stdout: stderr: archive/tar: invalid tar header

很抱歉听到这个问题。这个错误通常是由于Docker镜像损坏或Docker存储库中缺少所需的图层引起的。您可以尝试以下几种方法来解决这个问题: 1. 清理Docker镜像和容器:使用命令“docker system prune”清理不再使用的Docker对象。 2. 检查Docker存储库:确保您正在使用可靠的Docker存储库,并检查是否存在所有必需的图层。 3. 重新下载Docker镜像:如果您确定问题是由于损坏的Docker镜像引起的,则可以尝试重新下载Docker镜像。 4. 更新Docker版本:如果您使用的是旧版Docker,则可能会出现此问题。尝试更新到最新版本的Docke
recommend-type

Linux系统常用操作命令大全手册

附件是Linux系统常用操作命令大全手册,是 markdown格式,其中覆盖了Linux系统管理、文件操作、网络配置等多个方面,都是日常工作中非常常用的命令,欢迎大家下载学习使用!