单片机原理及应用实验六 按键识别数码管显示实验
- 格式:doc
- 大小:305.00 KB
- 文档页数:11
数码管显示控制实验原理
嘿,朋友们!今天咱来聊聊数码管显示控制实验原理。
想象一下,数码管就像是一个个小小的窗户,每个窗户里都能显示出不同的数字或符号。
其实啊,这原理就好像是一个聪明的指挥家在控制着一场精彩的灯光秀。
数码管里的每一段就像是一个小灯,通过巧妙地控制这些小灯的亮灭,就能组合出我们想要的数字啦。
比如说,要显示数字“8”,那就得让数码管的所有段都亮起来,就像把所有的灯光都打开,一下子就呈现出一个完整的“8”啦。
而要显示其他数字呢,就按照特定的组合让相应的段亮起来就行。
这就好像我们家里的电灯开关,想开哪个灯就按哪个开关,只不过这里的开关是通过电路和程序来控制的哦。
在实验里,我们就是要搞清楚怎么去设置这些开关,让数码管乖乖地显示出我们想要的东西。
是不是感觉挺有意思的呀?就像是在玩一个超级有趣的电子游戏,只不过这个游戏是关于数字和电路的。
所以,下次当你看到数码管显示出清晰的数字时,就可以想象一下背后那个神奇的“指挥家”是怎么工作的啦!。
第1篇一、实验目的1. 熟悉按键电路的基本原理和设计方法。
2. 掌握按键电路的搭建和调试方法。
3. 了解按键电路在实际应用中的重要性。
4. 提高动手实践能力和电路分析能力。
二、实验原理按键显示电路是一种将按键输入转换为数字信号,并通过显示设备进行显示的电路。
本实验主要涉及以下原理:1. 按键原理:按键通过机械触点实现电路的通断,当按键被按下时,电路接通,产生一个低电平信号;当按键释放时,电路断开,产生一个高电平信号。
2. 译码电路:将按键输入的信号转换为相应的数字信号,以便后续处理。
3. 显示电路:将数字信号转换为可视化的信息,如LED灯、数码管等。
三、实验器材1. 电路板2. 按键3. 电阻4. LED灯5. 数码管6. 电源7. 基本工具四、实验步骤1. 按键电路搭建(1)根据电路原理图,在电路板上焊接按键、电阻、LED灯等元器件。
(2)连接电源,确保电路板供电正常。
2. 译码电路搭建(1)根据电路原理图,在电路板上焊接译码电路所需的元器件。
(2)连接译码电路与按键电路,确保信号传输正常。
3. 显示电路搭建(1)根据电路原理图,在电路板上焊接显示电路所需的元器件。
(2)连接显示电路与译码电路,确保信号传输正常。
4. 电路调试(1)检查电路连接是否正确,确保无短路、断路等问题。
(2)按下按键,观察LED灯或数码管显示是否正常。
(3)根据需要调整电路参数,如电阻阻值、电源电压等,以达到最佳显示效果。
五、实验结果与分析1. 实验结果通过实验,成功搭建了一个按键显示电路,按下按键后,LED灯或数码管能够正确显示数字信号。
2. 结果分析(1)按键电路能够正常工作,实现电路通断。
(2)译码电路能够将按键输入转换为相应的数字信号。
(3)显示电路能够将数字信号转换为可视化的信息。
六、实验总结1. 通过本次实验,掌握了按键电路的基本原理和设计方法。
2. 提高了动手实践能力和电路分析能力。
3. 了解了按键电路在实际应用中的重要性。
一、实训目的本次实训旨在通过实际操作,掌握按键控制数码管的基本原理和实现方法,熟悉数字电路设计流程,提高动手能力和工程实践能力。
通过本次实训,学生应能够:1. 理解按键控制数码管的工作原理;2. 熟悉FPGA开发环境及工具的使用;3. 掌握数码管驱动电路的设计方法;4. 能够编写简单的FPGA程序,实现按键控制数码管的功能;5. 提高团队合作能力和问题解决能力。
二、实训原理数码管是一种常用的显示器件,由多个发光二极管组成,通常用于显示数字和字符。
按键作为输入设备,通过电路连接到微控制器(如FPGA、单片机等)的输入引脚,实现用户与数码管的交互。
按键控制数码管的基本原理如下:1. 按键输入处理:微控制器不断扫描按键的状态,当检测到按键被按下时,根据按键的编号或功能执行相应的操作。
2. 指令转换:将按键的输入转换为数码管能够理解的显示指令。
这通常涉及将按键编号或功能映射到特定的数字或字符编码。
3. 数码管显示控制:微控制器根据转换后的显示指令,通过控制数码管的驱动电路来点亮或熄灭数码管中的不同段,从而显示出所需的数字或字符。
4. 循环扫描与更新:为了保持数码管显示内容的实时性,微控制器需要不断重复上述步骤,形成一个循环扫描和更新的过程。
三、实训内容本次实训主要内容包括:1. 硬件电路设计:设计数码管驱动电路,包括LED数码管、按键、电阻、电容等元件的选择和连接。
2. FPGA程序设计:编写FPGA程序,实现按键控制数码管的功能,包括按键输入处理、指令转换、数码管显示控制等。
3. 系统调试与测试:将硬件电路与FPGA程序连接,进行系统调试和测试,验证系统功能是否正常。
四、实训步骤1. 硬件电路设计:- 选择合适的LED数码管、按键、电阻、电容等元件;- 根据元件规格和电路要求,绘制电路原理图;- 使用面包板搭建电路,并进行测试。
2. FPGA程序设计:- 选择合适的FPGA开发环境(如Vivado、Quartus II等);- 创建FPGA工程,添加必要的IP核(如时钟源、按键输入、数码管驱动等);- 编写FPGA程序,实现按键控制数码管的功能;- 编译FPGA程序,生成比特流文件。
单片机实验报告信息处理实验实验二矩阵键盘专业:电气工程及其自动化指导老师:***组员:明洪开张鸿伟张谦赵智奇学号:152703117 \152703115\152703118\152703114室温:18 ℃日期:2017 年10 月25日矩阵键盘一、实验内容1、编写程序,做到在键盘上每按一个键(0-F)用数码管将该建对应的名字显示出来。
按其它键没有结果。
二、实验目的1、学习独立式按键的查询识别方法。
2、非编码矩阵键盘的行反转法识别方法。
3、掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。
4、掌握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。
5、掌握利用Keil51软件对程序进行编译。
6、会根据实际功能,正确选择单片机功能接线,编制正确程序。
对实验结果能做出分析和解释,能写出符合规格的实验报告。
三、实验原理1、MCS51系列单片机的P0~P3口作为输入端口使用时必须先向端口写入“1”。
2、用查询方式检测按键时,要加入延时(通常采用软件延时10~20mS)以消除抖动。
3、识别键的闭合,通常采用行扫描法和行反转法。
行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。
行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。
然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。
这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。
由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。
单⽚机实验报告——LED数码管显⽰实验(此⽂档为word格式,下载后您可任意编辑修改!)《微机实验》报告LED数码管显⽰实验指导教师:专业班级:姓名:学号:联系⽅式:⼀、任务要求实验⽬的:理解LED七段数码管的显⽰控制原理,掌握数码管与MCU的接⼝技术,能够编写数码管显⽰驱动程序;熟悉接⼝程序调试⽅法。
实验内容:利⽤C8051F310单⽚机控制数码管显⽰器基本要求:利⽤末位数码管循环显⽰数字0-9,显⽰切换频率为1Hz。
提⾼要求:在4位数码管显⽰器上依次显⽰当天时期和时间,显⽰格式如下:yyyy (年份)mm.dd(⽉份.⽇).asm;Description: 利⽤末位数码管循环显⽰数字0-9,显⽰切换频率为1Hz。
;Designed by:gxy;Date:2012117;*********************************************************$include (C8051F310.inc)ORG 0000H ;复位⼊⼝AJMP MAINORG 000BH ;定时器0中断⼊⼝AJMP TIME0MAIN: ACALL Init_Device ;初始化配置MOV P0,#00H ;位选中第⼀个数码管MOV R0,#00H ;偏移指针初值CLR PSW.1 ;标志位清零SETB EA ;允许总中断SETB ET0 ;允许定时器0中断MOV TMOD,#01H ;定时器0选⼯作⽅式1MOV TH0,#06HMOV TL0,#0C6H ;赋初值,定时1sLOOP: MOV A,R0ADD A,#0BH ;加偏移量MOVC +PC ;查表取,段码MOV P1,A ;段码给P1显⽰SETB TR0 ;开定时LOOP1: JNB PSW.1,LOOP1 ;等待中断CLR PSW.1INC R0 ;偏移指针加⼀CJNE R0,#0AH,LOOP3MOV R0,#00H ;偏移指针满10清零AJMP LOOP ;返回DB 0FCH,60H,0DAH,0F2H,66H ;段码数据表:0、1、2、3、4 DB 0B6H,0BEH,0E0H,0FEH,0F6H; 5、6、7、8、9 ;***************************************************************** ; 定时器0中断;***************************************************************** TIME0: SETB PSW.1 ;标志位置⼀MOV TH0,#06H ;定时器重新赋值MOV TL0,#0C6HLOOP3: CLR TR0 ;关定时RETI;***************************************************************** ;初始化配置;***************************************************************** PCA_Init:anl PCA0MD, #0BFhmov PCA0MD, #000hretTimer_Init:mov TMOD, #001hmov CKCON, #002hretPort_IO_Init:; P0.0 - Unassigned, Open-Drain, Digital ; P0.1 - Unassigned, Open-Drain, Digital ; P0.2 - Unassigned, Open-Drain, Digital ; P0.3 - Unassigned, Open-Drain, Digital ; P0.4 -Unassigned, Open-Drain, Digital ; P0.5 - Unassigned, Open-Drain, Digital ; P0.6 - Unassigned, Open-Drain, Digital ; P0.7 - Unassigned, Open-Drain, Digital ; P1.0 - Unassigned, Open-Drain, Digital ; P1.1 - Unassigned, Open-Drain, Digital ; P1.2 - Unassigned, Open-Drain, Digital ; P1.3 - Unassigned, Open-Drain, Digital ; P1.4 - Unassigned, Open-Drain, Digital ; P1.5 - Unassigned, Open-Drain, Digital ; P1.6 - Unassigned, Open-Drain, Digital ; P1.7 - Unassigned, Open-Drain, Digital ; P2.0 - Unassigned, Open-Drain, Digital ; P2.1 -Unassigned, Open-Drain, Digital ; P2.2 - Unassigned, Open-Drain, Digital ; P2.3 - Unassigned, Open-Drain, Digital mov XBR1, #040hretInterrupts_Init:mov IE, #002hretInit_Device:lcall PCA_Initlcall Timer_Initlcall Port_IO_Initlcall Interrupts_Initretend提⾼部分:;*********************************************************;Filename: shumaguan2.asm;Description:在4位数码管显⽰器上依次显⽰当天时期和时间,显⽰格式如下:; 2012 (年份); 12.07(⽉份.⽇); 12.34(⼩时.分钟);Designed by:gxy;Date:2012117;*********************************************************$include (C8051F310.inc)ORG 0000HAJMP MAINORG 000BHAJMP TIME0MAIN: ACALL Init_DeviceMOV R0,#00H ;⽤于位选MOV R1,#00H ;⽤于段选MOV R2,#22H ;置偏移量,⽤于控制模式MOV R4,#8MOV R5,#250CLR PSW.1 ;标志位清零SETB EA ;允许总中断SETB ET0 ;允许定时器0中断MOV TMOD,#01H ;定时器0选⼯作⽅式1MOV TH0,#0FFHMOV TL0,#0C0H ;定时器赋初值1msBACK: MOV P0,R0 ;位选MOV A,R0ADD A,#40H ;选下⼀位MOV R0,AMOV A,R1ADD A,R2 ;加偏移量MOVC +PC ;查表取段码MOV P1,A ;段码给P1显⽰LOOP: SETB TR0 ;开定时HERE: JNB PSW.1,HERE ;等待中断CLR PSW.1DJNZ R5,BACKMOV R5,#250DJNZ R4,BACKMOV R4,#8 ;循环2000次(2s)MOV A,R2ADD A,#04H ;偏移量加04H,到下⼀模式段码初值地址 MOV R2,ACJNE R2,#2EH,LOOP2MOV R2,#22H ;加三次后偏移量回到初值LOOP2: AJMP BACK ;返回进⼊下⼀模式;段码数据表:DB 0DAH,60H,0FCH,0DAH ; 2102DB 0E0H,0FCH,61H,60H ; 701. 1DB 66H,0F2H,0DBH,60H ; 432. 1;*****************************************************************; 定时器0中断;***************************************************************** TIME0: MOV TH0,#0FFH MOV TL0,#0C0HCLR TR0SETB PSW.1INC R1 ;偏移指针加⼀CJNE R1,#04H,LOOPMOV R1,#00H ;偏移指针满04H清零RETI;***************************************************************** ; 初始化配置;***************************************************************** PCA_Init:anl PCA0MD, #0BFhmov PCA0MD, #000hretTimer_Init:mov TMOD, #001hmov CKCON, #002hretPort_IO_Init:; P0.0 - Unassigned, Open-Drain, Digital; P0.1 - Unassigned, Open-Drain, Digital; P0.2 - Unassigned, Open-Drain, Digital; P0.3 - Unassigned, Open-Drain, Digital; P0.4 - Unassigned, Open-Drain, Digital; P0.5 - Unassigned, Open-Drain, Digital; P0.6 - Unassigned, Open-Drain, Digital; P0.7 - Unassigned, Open-Drain, Digital; P1.0 - Unassigned, Open-Drain, Digital; P1.1 - Unassigned, Open-Drain, Digital; P1.2 - Unassigned, Open-Drain, Digital; P1.3 - Unassigned, Open-Drain, Digital; P1.4 - Unassigned, Open-Drain, Digital; P1.5 - Unassigned, Open-Drain, Digital; P1.6 - Unassigned, Open-Drain, Digital; P1.7 - Unassigned, Open-Drain, Digital; P2.0 - Unassigned, Open-Drain, Digital; P2.1 - Unassigned, Open-Drain, Digital; P2.2 - Unassigned, Open-Drain, Digital; P2.3 - Unassigned, Open-Drain, Digitalmov XBR1, #040hretInterrupts_Init:mov IE, #002hretInit_Device:lcall PCA_Initlcall Timer_Initlcall Port_IO_Initlcall Interrupts_Initretend六、程序测试⽅法与结果、软件性能分析软件调试总体截图:基础部分:软件运⾏时,我们发现P0端⼝为00H,P1端⼝以依次为FCH、60H、DAH、F2H、66H、B6H、BEH、E0H、FEH、F6H。
实验一数码管实验一、实验目的1. 了解数码管的显示原理;2. 掌握JXARM9-2440 中数码管显示编程方法二、实验仪器JXARM9-2440教学实验箱、ADT1000仿真器和ADT IDE集成开发环境、串口连接线、PC机。
三、实验原理7段LED由7个发光二极管按“日”字形排列,所有发光二极管的阳极连在一起称共阳极接法,阴极连在一起称为共阴极接法。
LED显示器的接口一般有静态显示与动态显示接口两种方式。
本实验中采用的是动态显示接口,其中数码管扫描控制地址为0x20007000,位0-位5每位分别对应一个数码管,将其中某位清0 来选择相应的数码管,地址0x20006000 为数码管的数据寄存器。
数码管采用共阳方式,向该地址写一个数据就可以控制LED 的显示,数据中的1对应的不亮,0对应的亮,数码管各位从高到低排列为dp-g-f-e-d-c-b-a,例如当数据寄存器是11111111时则不亮,当是01111111时则显示8,其原理图如图所示。
四、实验内容1、编程实现:六个数码管同时正向显示0-F ,然后反向显示F-0。
2、编程实现:在六个数码管上依次显示与自己姓名有关的内容,可分辨出轮流显示。
3、编程实现:在六个数码管上依次显示与自己姓名有关的内容,分辨不出轮流显示。
4*、编程实现:在每个数码管上递增显示0—9 。
5*、自行开发。
五、实验程序1,/****************************************************************************//*文件名称: LEDSEG7.C *//*实验现象:数码管依次显示出0、1,2、……9、a、b、C、d、E、F *//****************************************************************************/ #define U8 unsigned charunsigned char seg7table[16] = {/* 0 1 2 3 4 5 6 7*/0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,/* 8 9 A B C D E F*/0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,};void Delay(int time);/****************************************************************************//* 函数说明: JXARM9-2410 7段构共阳数码管测试 *//* 功能描述: 依次在7段数码管上显示0123456789ABCDEF *//* 返回代码: 无 *//* 参数说明: 无 *//****************************************************************************/ void Test_Seg7(void) {int i;*((U8*)0x20007000)=0x00; /*6个数码管都亮*/for(;;){/*数码管从0到F依次将字符显示出来*/for(i=0;i<0x10;i++){*((U8*)0x20006000)=seg7table[i];Delay(10000);}/*数码管从F到0依次将字符显示出来*/ for(i=0x0f;i>0x00;i--){*((U8*)0x20006000)=seg7table[i];Delay(10000);}}// TODO}/****************************************************************************//* Function name : 循环延时子程序 */ /* Description : 循环 'time' 次 */ /* Return type :void */ /* Argument : 循环延时计数器 */ /****************************************************************************/ void Delay(int time) {int i;int delayLoopCount=10000;for(;time>0;time--);for(i=0;i<delayLoopCount;i++);}2,/****************************************************************************/ /*文件名称: LEDSEG7.C */ /*实验现象:数码管依次显示ZHAngg,并能看出轮流显示 *//****************************************************************************/ #define U8 unsigned charunsigned char seg7table[16] = {/* Z H A n g g 6 7*/0xa4, 0x89, 0x88, 0xc8, 0x90, 0x90, 0x82, 0xf8,/* 8 9 A B C D E F*/0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,/* H I N*/0x89, 0xcf, 0x48};void Delay(int time);/****************************************************************************/ /* 函数说明: JXARM9-2410 7段构共阳数码管测试 */ /* 功能描述: 在六个数码管上分别显示字母,与姓名有关 */ /* 返回代码: 无 */ /* 参数说明: 无 */ /****************************************************************************/ void Test_Seg7(void) {int i;*((U8*)0x20007000)=0x00;for(;;){*((U8*)0x20007000)=0x1f;*((U8*)0x20006000)=seg7table[0];Delay(10000);*((U8*)0x20007000)=0x2f;*((U8*)0x20006000)=seg7table[1];Delay(10000);*((U8*)0x20007000)=0x37;*((U8*)0x20006000)=seg7table[2];Delay(10000);*((U8*)0x20007000)=0x3b;*((U8*)0x20006000)=seg7table[3];Delay(10000);*((U8*)0x20007000)=0x3d;*((U8*)0x20006000)=seg7table[4];Delay(10000);*((U8*)0x20007000)=0x3e;*((U8*)0x20006000)=seg7table[5];Delay(10000);}// TODO}/***************************************************************************/ /* Function name : 循环延时子程序 */ /* Description : 循环 'time' 次 */ /* Return type :void */ /* Argument : 循环延时计数器 */ /****************************************************************************/ void Delay(int time) {int i;int delayLoopCount=10000;for(;time>0;time--);for(i=0;i<delayLoopCount;i++);}3,/****************************************************************************/ /*文件名称: LEDSEG7.C */ /*实验现象:数码管依次显示出ZHAngg,并看不出轮流显示 *//****************************************************************************/ #define U8 unsigned charunsigned char seg7table[16] = {/* Z H A n g g 6 7*/0xa4, 0x89, 0x88, 0xc8, 0x90, 0x90, 0x82, 0xf8,/* 8 9 A B C D E F*/0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,/* H I N*/0x89, 0xcf, 0x48};void Delay(int time);/****************************************************************************/ /* 函数说明: JXARM9-2410 7段构共阳数码管测试 */ /* 功能描述: 在六个数码管上分别显示字母,与姓名有关*//* 返回代码: 无 */ /* 参数说明: 无 */ /****************************************************************************/ void Test_Seg7(void) {int i;*((U8*)0x20007000)=0x00;for(;;){*((U8*)0x20007000)=0x1f;*((U8*)0x20006000)=seg7table[0];Delay(10000);*((U8*)0x20007000)=0x2f;*((U8*)0x20006000)=seg7table[1];Delay(10000);*((U8*)0x20007000)=0x37;*((U8*)0x20006000)=seg7table[2];Delay(10000);*((U8*)0x20007000)=0x3b;*((U8*)0x20006000)=seg7table[3];Delay(10000);*((U8*)0x20007000)=0x3d;*((U8*)0x20006000)=seg7table[4];Delay(10000);*((U8*)0x20007000)=0x3e;*((U8*)0x20006000)=seg7table[5];Delay(1);}// TODO}/***************************************************************************//* Function name : 循环延时子程序 */ /* Description : 循环 'time' 次 */ /* Return type :void */ /* Argument : 循环延时计数器 */ /****************************************************************************/ void Delay(int time) {int i;int delayLoopCount=10000;for(;time>0;time--);for(i=0;i<delayLoopCount;i++);}4,/****************************************************************************/ /*文件名称: LEDSEG7.C */ /*实验现象:数码管依次显示出0、1,2、……9、a、b、C、d、E、F */ /****************************************************************************/ #define U8 unsigned charunsigned char seg7table[16] = {/* 0 1 2 3 4 5 6 7*/0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,/* 8 9 A B C D E F*/0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,};void Delay(int time);/****************************************************************************/ /* 函数说明: JXARM9-2410 7段构共阳数码管测试 */ /* 功能描述: 依次在7段数码管各自递增显示0—9 *//* 返回代码: 无 */ /* 参数说明: 无 */ /****************************************************************************/ void Test_Seg7(void) {int i;for(;;){for(i=0;i<=0x09;i++){*((U8*)0x20007000)=0x1f;*((U8*)0x20006000)=seg7table[i];Delay(10000);}for(i=0;i<=0x09;i++){*((U8*)0x20007000)=0x2f;*((U8*)0x20006000)=seg7table[i];Delay(10000);}for(i=0;i<=0x09;i++){*((U8*)0x20007000)=0x37;*((U8*)0x20006000)=seg7table[i];Delay(10000);}for(i=0;i<=0x09;i++){*((U8*)0x20007000)=0x3b;*((U8*)0x20006000)=seg7table[i];Delay(10000);}for(i=0;i<=0x09;i++){*((U8*)0x20007000)=0x3d;*((U8*)0x20006000)=seg7table[i];Delay(10000);}}// TODO}/****************************************************************************/ /* Function name : 循环延时子程序 */ /* Description : 循环 'time' 次 */ /* Return type :void */ /* Argument : 循环延时计数器 */ /****************************************************************************/ void Delay(int time) {int i;int delayLoopCount=10000;for(;time>0;time--);for(i=0;i<delayLoopCount;i++);}六、实验结果与分析实验一结果:六个数码管同时显示相同的符号,从0-F再由F-0之间的循环变换。
单片机数码管显示实验报告篇一:单片机应用实验报告 2键盘、LED 数码管显示实验西华大学实验报告(理工类)开课学院及实验室:机械工程与自动化学院计算机机房实验时间 : 2014年 5月20 日一、实验目的二、实验内容三、实验电路四、实验程序#includereg52.hsbit key0=P2 ;sbit key1=P2 ;sbit key2=P2 ;sbit red=P1 ;sbit yell=P1 ;sbit gre=P1 ;sbit LED1=P2 ;sbit LED2=P2 ;int num=0;unsigned char code dispcode[]={0x30,0xfc,0xa2,0xa4,0x6c,0x25,0x21,0xbc,0x20,0x24};void init(){key0=1;key1=1;key2=1;}void delayms(int a) { int b=0;for(a;a0;a--)for(b=110;b0;b--); }int judge(){if(key0==0){delayms(100);if(key0==0){red=0;yell=1;gre=1;num++;if(num==10)num=0;}}if(key1==0) {delayms(5);if(key1==0) {red=1;yell=0;gre=1;}}if(key2==0) {delayms(5);if(key2==0) {red=1;yell=1;gre=0;}}return 0;}void xianshi(){delayms(5);P0=dispcode[num];LED1=0;LED2=1;delayms(5);}int main(){init();while(1){judge();xianshi();}return 0;}五、实验步骤六、附录篇二:单片机实验两位数码管显示报告一、实验目的1、在之前单键实验和中断控制数码管“静态”显示实验的基础上,把单键判断、数码管显示和中断结合起来编写中断程序实现单键控制一位数码管;2、在实现控制一位数码管显示的基础上用单键控(转载于: 池锝网:单片机数码管显示实验报告)制两位数码管显示。
5、实验程序
结束
(实验程序清单作为附件放在最后)
6、实验步骤
1)keil中C语言程序实现。
2)在proteus中完成电路图设计,并实现仿真。
3)硬件实验部分:
用一条8PIN 数据排线,把矩阵按键部份的JP50,接到CPU 部份的P1 口JP44;
接8 位数码管的数据线。
将数码管部份的数据口 JP5 接到CPU 部份的P0 口JP51;
接8 位数码管的显示位线。
将数码管部份的显示位口 JP8 接到CPU 部份的P2 口JP52.
7、实验数据及结果
8、思考题
采用P3口控制矩阵按键输入,程序应该如何修改?
答:本实验的程序中可以不用蜂鸣器驱动线,把以下程序的sbit BEEP = P3 ^ 7;及函数void beep()等删掉后;需要把扫描键值的函数改一下:unsigned char keyscan()
{
unsigned char scan1, scan2, keycode,j;
P13= 0xf0;
scan1 = P3;
if (scan1 != 0xf0) //判键是否按下
{
delayms(10);
scan1 = P3;
if (scan1 != 0xf0) //二次判键是否按下
{
P1 = 0x0f;
scan2 = P3;。