采用P0口设计一个4*4行列式按键,采用P1 P2口设计8个8段数码管,P1作公共的段选线,送出显示数字的编码;P2口作为数码管的位选线,负责数码管的分时显示,每位数码管显示2ms。通过按键,可以输入0-9 A-F 不同的值,在数码管上显示最高8位的值。给我写代码

时间: 2024-04-21 07:28:48 浏览: 6
下面是一个简单的基于51单片机的程序,实现了上述功能。本程序使用定时器中断实现了分时显示,使用了一个16*8的编码表将要显示的数字转换为了段选编码值。 ``` #include <reg51.h> // 定义IO口 sbit P0_0 = P0^0; sbit P0_1 = P0^1; sbit P0_2 = P0^2; sbit P0_3 = P0^3; sbit P1_0 = P1^0; sbit P1_1 = P1^1; sbit P1_2 = P1^2; sbit P1_3 = P1^3; sbit P1_4 = P1^4; sbit P1_5 = P1^5; sbit P1_6 = P1^6; sbit P1_7 = P1^7; sbit P2_0 = P2^0; sbit P2_1 = P2^1; sbit P2_2 = P2^2; sbit P2_3 = P2^3; sbit P2_4 = P2^4; sbit P2_5 = P2^5; sbit P2_6 = P2^6; sbit P2_7 = P2^7; // 定义变量 unsigned char key = 0; // 按键值 unsigned char disp[8] = {0}; // 要显示的数字(BCD码) unsigned char code seg_table[16][8] = { // 编码表 {1,1,1,1,1,1,0,0}, // 0 {0,1,1,0,0,0,0,0}, // 1 {1,1,0,1,1,0,1,0}, // 2 {1,1,1,1,0,0,1,0}, // 3 {0,1,1,0,0,1,1,0}, // 4 {1,0,1,1,0,1,1,0}, // 5 {1,0,1,1,1,1,1,0}, // 6 {1,1,1,0,0,0,0,0}, // 7 {1,1,1,1,1,1,1,0}, // 8 {1,1,1,1,0,1,1,0}, // 9 {1,1,1,0,1,1,1,0}, // A {0,0,1,1,1,1,1,0}, // B {1,0,0,1,1,1,0,0}, // C {0,1,1,1,1,0,1,0}, // D {1,0,0,1,1,1,1,0}, // E {1,0,0,0,1,1,1,0}, // F }; // 定时器中断 void timer0_isr(void) interrupt 1 { static unsigned char cnt = 0; // 计数器 static unsigned char pos = 0; // 当前显示的数码管位置 // 分时显示 P2_0 = (pos == 0); P2_1 = (pos == 1); P2_2 = (pos == 2); P2_3 = (pos == 3); P2_4 = (pos == 4); P2_5 = (pos == 5); P2_6 = (pos == 6); P2_7 = (pos == 7); // 显示数字 P1 = seg_table[disp[pos]][cnt]; // 更新计数器和位置 cnt++; if (cnt == 8) { cnt = 0; pos++; if (pos == 8) { pos = 0; } } } // 读取按键 unsigned char read_key(void) { unsigned char key_value = 0; P0_0 = 0; if (P0_4 == 0) key_value = 1; if (P0_5 == 0) key_value = 2; if (P0_6 == 0) key_value = 3; if (P0_7 == 0) key_value = 0; P0_0 = 1; P0_1 = 0; if (P0_4 == 0) key_value = 4; if (P0_5 == 0) key_value = 5; if (P0_6 == 0) key_value = 6; if (P0_7 == 0) key_value = 0; P0_1 = 1; P0_2 = 0; if (P0_4 == 0) key_value = 7; if (P0_5 == 0) key_value = 8; if (P0_6 == 0) key_value = 9; if (P0_7 == 0) key_value = 0; P0_2 = 1; P0_3 = 0; if (P0_4 == 0) key_value = 0; if (P0_5 == 0) key_value = 0; if (P0_6 == 0) key_value = 0; if (P0_7 == 0) key_value = 0; P0_3 = 1; return key_value; } // 延时函数 void delay(unsigned int t) { while (t--); } // 主函数 void main() { // 初始化端口 P0 = 0xff; P1 = 0xff; P2 = 0xff; TMOD = 0x01; TH0 = 0xfc; TL0 = 0x66; TR0 = 1; ET0 = 1; EA = 1; while (1) { // 读取按键 key = read_key(); // 处理按键 if (key != 0) { delay(1000); // 消抖 if (key != 0) { // 显示按键值 if (key <= 9) { disp[7] = key; } else { disp[7] = key - 7; } } } // 更新显示 delay(1000); // 延时 } } ```

相关推荐

最新推荐

recommend-type

C语言计算行列式 4 段程序

搜集了4个用C语言计算行列式的程序,基本算法都是用高斯消元法,不过在消元之前,先把绝对值最大的元素进行适当的位置调整。希望能对C语言编程初学者有所帮助。
recommend-type

行列式计算以及解线性方程.docx

基于 VB开发平台的代码 ,分别有递归法,初等变换法计算行列式的值;利用行列式计算解线性方程和矩阵初等变换法解线性方程等代码。其中初等变换法计算行列式及解线性方程不限价数,可解无限多价齐次方程。递归法因为...
recommend-type

4*4矩阵键盘设计(绝对好)

矩阵键盘又称行列键盘,它是用四条I/O线作为行线,四条I/O线作为列线组成的...在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4*4个。这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。
recommend-type

随机过程联合概率密度函数坐标系转换中的雅各比行列式及其与重积分坐标转换中雅各比行列式的比较.docx

在通信系统中,多径传播的包络一维分布为...典型案例是由同相分量和正交分量的联合概率密度函数求一维包络和相位的联合概率密度函数,本文具体讲解雅各比行列式在概率密度函数坐标系转换中的应用,给出详细的证明过程。
recommend-type

基于ENVI软件的FY-4A几何校正等经纬度投影转换文档

本文内容为利用ENVI软件对FY-4A进行几何校正,将标称投影转为等经纬度投影,只可校正中国区域。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

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

【实战演练】增量式PID的simulink仿真实现

# 2.1 Simulink仿真环境简介 Simulink是MATLAB中用于建模、仿真和分析动态系统的图形化环境。它提供了一个直观的用户界面,允许用户使用块和连接线来创建系统模型。Simulink模型由以下元素组成: - **子系统:**将复杂系统分解成更小的、可管理的模块。 - **块:**代表系统中的组件,如传感器、执行器和控制器。 - **连接线:**表示信号在块之间的流动。 Simulink仿真环境提供了广泛的块库,涵盖了各种工程学科,包括控制系统、电子和机械工程。它还支持用户自定义块的创建,以满足特定仿真需求。 # 2. Simulink仿真环境的搭建和建模 ### 2.
recommend-type

训练集和测试集的准确率都99%,但是预测效果不好

即使训练集和测试集的准确率都很高,但是在实际的预测中表现不佳,可能会有以下几个原因: 1. 数据质量问题:模型训练和测试的数据可能存在问题,比如数据标签错误、数据集采样不均衡、数据集中存在异常值等问题,这些问题可能会导致模型在实际预测中表现不佳。 2. 特征工程问题:模型的特征工程可能存在问题,导致模型无法很好地捕捉数据的特征,从而影响预测效果。 3. 模型选择问题:模型的选择可能不合适,比如选择的模型太简单,无法很好地拟合数据,或者选择的模型太复杂,导致过拟合等问题。 4. 超参数调整问题:模型的超参数可能没有调整到最佳状态,需要进行调整。 针对以上可能的原因,可以采取相应的措施进
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。