静态数码管显示程序
实验4 LED数码管静态显示电路的设计与仿真
实验项目四 LED数码管静态显示电路的设计与仿真[实验目的]1.掌握LED数码管编码方法2.掌握LED数码管静态显示电路的设计3.掌握对LED数码管静态显示的控制方法[实验原理][实验仪器]PC机一台[Proteus用到器件的关键词]单片机(at89c52)、数码管(7seg-com-cathode)、排阻(respack-7)[实验内容与步骤]1.用Proteus软件设计出LED数码管显示电路原理图。
2.由于单片机P0口内部无上拉电阻,故使用时要外接上拉电阻,阻值为10KΩ。
3.用Keil编写程序让第二个数码管从0显示到F,然后再让从0开始显示;每当第二个数码管显示到F后,第一个数码管显示值加1一次,最后调试程序、编译后生成HEX文件。
4.将HEX文件装载到MCU AT89C52中,单击Start按钮开始动态仿真。
[实验数据记录];******两位数码管静态显示程序*******;ORG 0000HLJMP MAINORG 0050H MAIN: MOV R3,#0MOV P0,#3FHLP2: MOV DPTR,#0200H LP1: MOVC A,@A+DPTRMOV P2,ALCALL DELAYMOV R2,ACLR AINC DPTRCJNE R2,#6FH,LP1INC R3MOV DPL,R3MOVC A,@A+DPTRMOV P0,ACLR ACJNE R3,#10,LP2AJMP MAIN DELAY: MOV R0,#0FFHDL2: MOV R1,#0FFHDL1: NOPNOPNOPDJNZ R1,DL1DJNZ R0,DL2RETORG 0200HTAB: DB 3FH;0 DB 06H;1 DB 5BH;2 DB 4FH;3 DB 66H;4 DB 6DH;5 DB 7DH;6 DB 07H;7 DB 7FH;8 DB 6FH;9END[实验数据处理][实验结果及讨论]。
嵌入式技术与应用开发项项目三数码管显示设计与实现
共阴极和共阳极数码管的字型编码是不同的,对于同一个字符, 共阴极和共阳极的字型编码是反相的。
认识数码管
数码管的显示方法:有静态显示和动态显示两种方法。
1. 静态显示
静态显示是指数码管显示某一字符时,相应的LED恒定导通或恒定截 止。
PC13_RTC
PC14-OSC32_IN
PB0
PC15-OSC32_OUT
PB1
PB2
PB3
OSCIN_PD0
PB4
OSCOUT_PD1
PB5
PD2
PB6
PB7
PB8
PB9
PB10
PB11
VBAT
PB12
PB13
PB14
PB15
BOOT0
7
8 9 10 11 24 25 37 38 39 40 51 52 53 2 3 4
① 代码区(0x0000_0000~0x1FFF_FFFF) 程序可以在代码区、内部SRAM区以及外部RAM区中执行,通常是把程序放
到代码区,从而使取指和数据访问各自使用自己的总线(指令总线与数据总 线是分开的)。 ② SRAM区(0x2000_0000~0x3FFF_FFFF) 这个区域用于片内SRAM,是用于让芯片制造商连接片上的SRAM,这个区通 过系统总线来访问。 在SRAM区的底部,还有一个 1MB的位带区,这个位带区还有一个对应的 32MB的“位带别名(alias)区”。也就是说,位带别名区里面的每个字对应 位带区的一个bit位,每个位变量是32位(既1个字4个字节)。 位带操作只适用于数据访问,不适用于取指。通过位带的功能,我们访问一 个bit位,可以从位带别名区中,像访问普通内存一样操作。
基础实验(数码管显示)含代码
实验一基础实验(数码管显示)一、实验内容使用MCS-51汇编语言编写程序,完成如下功能:1. 使用三个数码管显示十进制数值(001~999,可任意设置);2. 每隔1秒,该数值自动减一,直到归零;3. 归零后的下一秒,显示一个新的十进制数值(001~999,可任意设置);4. 每隔1秒,新数值继续自动减一,直到再次归零;5. 重新执行步骤1,循环往复。
6. 当开关S1按下时,暂停计数;S1松开时,恢复计数。
二、数码管显示原理如图所示,三段式数码管由三片74HC164级联控制三个数码管的显示,其中使用单片机P4.5作为模拟串口数据,使用P4.4模拟串口时钟,CLR端接高电平。
使用上一个74HC164的Q7作为下一个74HC164的输入端。
要想输出一个字形码,就需要从高位到低位依次向移位寄存器输出8个比特。
移位寄存器的数据线和时钟线分别接到单片机的P4.5和P4.4管脚,可以使用MCS-51里面的位操作指令进行输出。
连续输出3个字形,24个bit之后,欲显示的字形将稳定地显示在数码管上,程序可以转而执行其他工作。
三、实验流程图1.主程序流程图开始初始化定义计数器R6,R5,R4定义码表TAB 0-9根据R6偏移从TAB取数送到算术寄存器A中调用SHOW子程序根据R5偏移从TAB取数送入算术寄存器A中调用SHOW子程序根据R4偏移从TAB取数送入算术寄存器A中调用SHOW子程序调用延时子程序S1按下?是循环延时否R6减一即个位减一R6为-1?是R5减一即十位减一重新初始化R6否R5为-1?否是R4减一即百位减一重新初始化R5R4为-1?重新初始化R4否2.显示子程序SHOW 流程图3.延时子程序DELAY 流程图子程序SHOW 开始R0初始化计数时钟置0右移AC 标志位送入DATA时钟置1,上跳R0=0?是RET否子程序DELAY 开始RI 初始化为80R3减一R3为0?是R2减一R2为0?是R1减一是R1为0?否R2初始化为200R3初始化为250否否是四、程序源代码 0000H2.LJMP START 0050H4.START:5.P4 EQU 0C0H6.P4SW EQU 0BBH7.CLK EQU P4.48.DAT EQU P4.59.SW EQU P3.610.MOV P4SW, #70H11.LP:12. MOV R6, #913. MOV R5, #914. MOV R4, #915.LOOP:16. MOV DPTR, #TAB17. MOV A,R618. MOV DPTR,#TAB19. MOVC A,@A+DPTR20. LCALL SHOW21.22. MOV A,R523. MOV DPTR,#TAB24. MOVC A,@A+DPTR25. LCALL SHOW26.27. MOV A,R428. MOV DPTR,#TAB29. MOVC A,@A+DPTR30. LCALL SHOW31. LCALL DELAY32.33.PAUSE:34. NOP35. JNB SW,PAUSE36. DEC R637. CJNE R6,#-1,LOOP38.39. DEC R540. MOV R6,#941. CJNE R5,#-1,LOOP42. DEC R443. MOV R5,#944. CJNE R4,#-1,LOOP45. MOV R4,#946. LJMP LOOP47.48.SHOW:49. MOV R0,#850.SLP:51. CLR CLK52. RLC A53. MOV DAT,C54. SETB CLK55. DJNZ R0,SLP56. RET57.58.DELAY:59. MOV R1,#8060.SD:61. MOV R2,#20062.SD1:63. MOV R3,#25064.SD2:65. DJNZ R3,SD266. DJNZ R2,SD167. DJNZ R1,SD68.RET69.70.TAB:71. DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H72.73.74.END75.TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H五、思考题1.MCS51中有哪些可存取的单元,存取方式如何?它们之间的区别和联系有哪些?答:MCS51单片机中,包含程序存储器ROM、数据存储器RAM和特殊功能寄存器(SFRs),其中数据存储器还包含内部RAM,内部扩展RAM和片外RAM。
实验二 数码管显示
实验二数码管显示本实验的目的是掌握数码管的工作原理与使用,实现数码管的静、动态显示。
静态数码管我们先看看什么是数码管,上图就是各种长相各种样子的数码管了,肯定很眼熟了吧。
不管将几位数码管连在一起,数码管的显示原理都是一样的,都是靠点亮内部的发光二极管来发光,下面就来我们讲解一个数码管是如何亮起来的。
数码管内部电路如下图所示,从右图可看出,一位数码管的引脚是10个,显示一个8字需要7个小段,另外还有一个小数点,所以其内部一共有8个小的发光二极管,最后还有一个公共端,生产商为了封装统一,单位数码管都封装10个引脚,其中第3和第8引脚是连接在一起的。
而它们的公共端又可分为共阳极和共阴极,中间图为共阴极内部原理图,右图为共阳极内部原理图。
上图展出了常用的两种数码管的引脚排列和内部结构。
总所周知,点亮发光二极管就是要给予它足够大的正向压降。
所以点亮数码管其实也就是给它内部相应的发光二极管正向压降。
如上图左(一共a、b、c、d、e、f、g、DP 八段),如果要显示“1”则要点亮b、c 两段LED;显示“A”则点亮a、b、c、e、f、g 这六段LED;我们还知道,既然LED 加载的是正向压降,它的两端电压必然会有高低之分:如果八段LED 电压高的一端为公共端,我们称之为共阳极数码管(如上图中);如果八段LED 电压低的一段为公共端,则称之为共阴极数码管(上图右)。
所以,要点亮共阳极数码管,则要在公共端给予高于非公共端的电平;反之点亮共阴极数码管,则要在非公共端给予较高电平。
对共阴极数码来说,其8个发光二极管的阴极在数码管内部全部连接在一起,所以称“共阴”,而它们的阳极是独立的,通常在设计电路时一般把阴极接地。
当我们给数码管的任意一个阳极加一个高电平时,对应的这个发光二极管就点亮了。
如果想要显示出一个8字,并且把右下角的小数点也点亮的话,可以给8个阳极全部送高电平,如果想让它显示出一个0字,那么我们可以除了给第“g, dp”这两位送低电平外,其余引脚全部都送高电平,这样它就显示出0字了。
数码管显示(全面)
• 程序设计内容
由于显示的数字0-9的字形码没有规律可循,只能采用 查表的方式来完成P0口对数码管的控制。方法是找出 共阴极数码管显示0-9的字形码,按着数字0-9的顺序, 把这十个字形码放入数组table[]中。
• C语言源程序 • 调试与仿真
4.3 I/O口应用实例与仿真
例4.6 动态数码管显示的proteus仿真及C语言 程序设计
4.3 I/O口应用实例与仿真
• 程序设计内容
(1)动态扫描方法:动态扫描采用各数码管循环轮流 显示的方法,本例中,先让左边第一位数码管显示数 字“1”,延时一定时间后,第二位显示“2”,以此类 推,到第五位显示“5”后,又从“1”开始循环显示。 当循环显示频率较高时,利用人眼的暂留特性,我们 看到这五位数码管仿佛在同时显示,而看不出闪烁显 示现象。这种显示需要一个接口完成字形码的输出 (字形选择),另一接口完成各数码管的轮流点亮 (数位选择)。需要注意一点,由于电路的特性,在 点亮每一位数码管之前,一定要对整个数码管清屏 (场消隐),即让所有位选信号都处于不被选中状态。
g f GND a b a a f e d g b c dp b c d e f g dp a b c d e f g dp
+5V
·
e d GND c dp
(a)
共阴极
(b)
共阳极
使用LED显示器时,要注意区分这两种不同的接法。为了显 示数字或字符,必须对数字或字符进行编码。七段数码管加上一 个小数点,共计8段。因此为LED显示器提供的编码正好是一个字 节。TX-1B实验板用共阴LED显示器,根据电路连接图显示16进制
数码管是如何显示出字符的 数码管静态显示与动态显示原理
显示器及其接口
实验28255七段数码管静动态显示
微机实验报告书同组名单:实验日期:2012.12.21实验题目:七段数码管的静态显示实验目标:掌握数码管显示数字的原理(功能:键盘输入一位十进制数字(0~9),用七段数码管显示。
)解题思路:1.静态显示:按图10 (a)连接好电路,将8255的A口 PAO-PA鲂别与七段数码管的断码驱动输入端a-g项链,位码驱动输入端S1接+5V, SO dp2.动态显示:按图10 (b)连接好电路,七段数码管段码连接不变,位码驱动输入端S1, S0接8255C口的PC1, PCQ编程在两个数码管上显示“56” 程序框图:静态显示见图11( a),动态显示见图11 (b)。
学号:_______ 姓名: 班级:________S 10琵接电路图图11流程图关键问题分析(静态显示):1、按键判断和程序结束判断按键来说,由于程序中必须输入数字,所以没有必要对是否按键进行判断, 只需要判断按键是否在0-9之间即可。
用以下程序即可:条件转移指令,即在小于时转移 条件转移指令,即在大于时转移程序中还要用到“ cmp'即比较指令,用来比较输入数与0、9的大小关系 程序结束:如若输入的数字小于0或者大于9,必须直接跳出程序,即结束指令必 须单独占用一个程序段,这样,程序顺序执行完毕也可以顺利返回DOS 2、七段码显示。
始丿将所得字符的 ASCII 码减如H1查表求出对应的盅码将段码自8药5A 口输出(b)cmp al,'0'jl exit; jl,cmp al,'9' 从键盘接收字符实验指导书中给出了七段码的字型代码。
这样一来, 七段码的显示只需要用换码 指令“XLAT 便可以轻松实现。
前提是必须将七段码字型编成数码表以字符串的 形式写进程序中。
3、数字键ASCII 码与数值间的转换。
因为0的ASCII 码为30H,所以数字键ASCII 码与数值间的转换时只需减去30F 即可, 可用下列语句实现:sub al,30h 程序清单:静态显示:data segmentioport equ 0c800h-0280hio8255aequ ioport+288h io8255b equ ioport+28bhled db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fhmesg1 db dataends codesegment0dh,0ah,'Input a num (0--9h):',0dh,0ah,'$' assume cs:code,ds:datastart: mov ax,data mov ds,ax mov dx,io8255b从键盘接收字符 是否小于 0 如若小于 0,则跳转到 exit 退岀程序 是否大于 9 如若大于 9,则跳转到 exit 退岀程序 将所得字符的ASCII 码减30H,数字键ascii 码同数值转换 为数码表的起始地址 求岀相应的段码 从8255的A 口输岀 转 zbymov al,80hout dx,al ;10000000B ,控制字PA 以方式0输岀 使8255的A 口为输岀方式zby: mov dx,offset mesg1 ;mov ah,09h int 21h movah,01 ;int 21h cmp al,'0' ;jl exit ;cmp al,'9'; jg exit ;sub al,30h ; movbx,offset led ;bxxlat ;mov dx,io8255a ; outdx,al jmp zby ;exit: mov ah,4ch ; 显示提示信息 返回 DOSint 21h code ends end start动态显示:data segmentioport equ 0c800h-0280hio8255a equ ioport+28ahio8255b equ ioport+28bhio8255c equ ioport+288hled db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ; 段码buffer1 db 5,6 ; 存放要显示的个位和十位bz dw ? ; 位码data endscode segmentassume cs:code,ds:datastart: mov ax,data mov ds,ax mov dx,io8255bmov al,80h ;10000000B out dx,almov di,offset buffer1 ;loop2: mov bh,02 zby: mov byte ptr bz,bhpush di dec di add di, bz movbl,[di] ;bl pop di mov al,0 movdx,io8255a out dx,al mov bh,0mov si,offset led ; add si,bx ;mov al,byte ptr [si] movdx,io8255c ;out dx,al mov al,byte ptr bz ;mov dx,io8255a out dx,al movcx,3000delay: loop delay ;,控制字PA以方式0输岀设di 为显示缓冲区为要显示的数置led 数码表偏移地址为SI 求岀对应的led 数码自8255A的口输岀使相应的数码管亮延时将8255设为A口输岀mov bh,byte ptr bzshr bh,1jnz zbymov dx,0ffhmov ah,06int 21hje loop2 ; 有键按下则退出mov dx,io8255amov al,0 ; 关掉数码管显示out dx,almov ah,4ch ; 返回int 21hcode endsend start运行结果:静态显示:在键盘上输入一个 0-9 的任意数字,会显示在数码管上。
实验2:8255七段数码管静动态显示
微机实验报告书学号:姓名:班级:同组名单:实验日期: 2012.12.21实验题目:七段数码管的静态显示实验目标:掌握数码管显示数字的原理(功能:键盘输入一位十进制数字(0~9),用七段数码管显示。
)解题思路:1.静态显示:按图 10(a)连接好电路,将8255的A口PA0-PA6分别与七段数码管的断码驱动输入端a-g项链,位码驱动输入端S1接+5V,S0、dp接地。
编程从键盘输入一位十进制数字,在七段数码管上显示出来。
2.动态显示:按图10(b)连接好电路,七段数码管段码连接不变,位码驱动输入端S1,S0接8255C口的PC1,PC0。
编程在两个数码管上显示“56”。
程序框图:静态显示见图11(a),动态显示见图11(b)。
关键问题分析(静态显示):1、按键判断和程序结束判断按键来说,由于程序中必须输入数字,所以没有必要对是否按键进行判断,只需要判断按键是否在0-9之间即可。
用以下程序即可:cmp al,'0'jl exit ; jl,条件转移指令,即在小于时转移cmp al,'9'jg exit ;jg, 条件转移指令,即在大于时转移程序中还要用到“cmp”即比较指令,用来比较输入数与0、9的大小关系。
程序结束:如若输入的数字小于0或者大于9,必须直接跳出程序,即结束指令必须单独占用一个程序段,这样,程序顺序执行完毕也可以顺利返回DOS。
2、七段码显示。
实验指导书中给出了七段码的字型代码。
这样一来,七段码的显示只需要用换码指令“XLAT”便可以轻松实现。
前提是必须将七段码字型编成数码表以字符串的形式写进程序中。
3、数字键ASCII码与数值间的转换。
因为0的ASCII码为30H,所以数字键ASCII码与数值间的转换时只需减去30H即可,可用下列语句实现:sub al,30h程序清单:静态显示:data segmentioport equ 0c800h-0280hio8255a equ ioport+288hio8255b equ ioport+28bhled db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fhmesg1 db 0dh,0ah,'Input a num (0--9h):',0dh,0ah,'$'data endscode segmentassume cs:code,ds:datastart: mov ax,datamov ds,axmov dx,io8255b ;使8255的A口为输出方式mov al,80h ;10000000B,控制字PA以方式0输出out dx,alzby: mov dx,offset mesg1 ;显示提示信息mov ah,09hint 21hmov ah,01 ;从键盘接收字符int 21hcmp al,'0' ;是否小于0jl exit ;如若小于0,则跳转到exit退出程序cmp al,'9' ;是否大于9jg exit ; 如若大于9,则跳转到exit退出程序sub al,30h ;将所得字符的ASCII码减30H,数字键ascii码同数值转换mov bx,offset led ;bx为数码表的起始地址xlat ;求出相应的段码mov dx,io8255a ;从8255的A口输出out dx,aljmp zby ;转zbyexit: mov ah,4ch ;返回DOSint 21hcode endsend start动态显示:data segmentioport equ 0c800h-0280hio8255a equ ioport+28ahio8255b equ ioport+28bhio8255c equ ioport+288hled db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;段码buffer1 db 5,6 ;存放要显示的个位和十位bz dw ? ;位码data endscode segmentassume cs:code,ds:datastart: mov ax,datamov ds,axmov dx,io8255b ;将8255设为A口输出mov al,80h ;10000000B,控制字PA以方式0输出out dx,almov di,offset buffer1 ;设di为显示缓冲区loop2: mov bh,02zby: mov byte ptr bz,bhpush didec diadd di, bzmov bl,[di] ;bl为要显示的数pop dimov al,0mov dx,io8255aout dx,almov bh,0mov si,offset led ;置led数码表偏移地址为SIadd si,bx ;求出对应的led数码mov al,byte ptr [si]mov dx,io8255c ;自8255A的口输出out dx,almov al,byte ptr bz ;使相应的数码管亮mov dx,io8255aout dx,almov cx,3000delay: loop delay ;延时mov bh,byte ptr bzshr bh,1jnz zbymov dx,0ffhmov ah,06int 21hje loop2 ;有键按下则退出mov dx,io8255amov al,0 ;关掉数码管显示out dx,almov ah,4ch ;返回int 21hcode endsend start运行结果:静态显示:在键盘上输入一个0-9的任意数字,会显示在数码管上。
静态数码管显示程序
/************************************************************************** ****** 实验名 : 静态数码管实验* 使用的IO : 数码管使用P0,键盘使用P3.0、P3.1、P3.2、P3.3* 实验效果 : 按下K1键,显示0,按下K2键,显示9,按下K3键,显示减1,按下K4键,*显示加1。
* 注意:由于P3.2口跟红外线共用,所以做按键实验时为了不让红外线影响实验*效果,最好把红外线先取下来。
*************************************************************************** ****/#include<reg51.h>#include<intrins.h>#define GPIO_DIG P0sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;sbit K1=P3^1;sbit K2=P3^0;sbit K3=P3^2;sbit K4=P3^3;unsigned char code DIG_CODE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~9的值void Delay10ms(); //延时10ms/************************************************************************** ****** 函数名 : main* 函数功能 : 主函数* 输入 : 无* 输出 : 无*************************************************************************** ****/void main(void){unsigned int i,j;LSA=0;LSB=0;LSC=0;while(1){if(K1==0) //检测按键K1是否按下{Delay10ms(); //消除抖动if(K1==0){j=0;}while((i<50)&&(K1==0)) //检测按键是否松开{Delay10ms();i++;}i=0;}if(K2==0) //检测按键K2是否按下{Delay10ms();if(K2==0){j=9;}while((i<50)&&(K2==0)){Delay10ms();i++;}i=0;}if(K3==0) //检测按键K3是否按下{Delay10ms();if(K3==0){j--;if(j>9)j=9;}while((i<50)&&(K3==0)){Delay10ms();i++;}i=0;}if(K4==0) //检测按键K4是否按下{Delay10ms();if(K4==0){j++;if(j>9)j=0;}while((i<50)&&(K4==0)){Delay10ms();i++;}i=0;}GPIO_DIG=DIG_CODE[j];}}/************************************************************************** ****** 函数名 : Delay10ms* 函数功能 : 延时函数,延时10ms* 输入 : 无* 输出 : 无*************************************************************************** ****/void Delay10ms(void) //误差 0us{unsigned char a,b,c;for(c=1;c>0;c--)for(b=38;b>0;b--)for(a=130;a>0;a--);}(资料素材和资料部分来自网络,供参考。
数码管静态显示程序源码解读
数码管静态显示程序源码解读数码管是一种常见的数字显示器件,它可以用来显示数字、字母、符号等信息。
在很多电子设备中,数码管都扮演着重要的角色。
本文将介绍数码管静态显示程序的源码,并对其进行解读。
数码管静态显示程序的源码如下:```#include <reg52.h>sbit D1 = P2^0;sbit D2 = P2^1;sbit D3 = P2^2;sbit D4 = P2^3;void main(){unsigned char num = 0;while(1){D1 = num % 10 == 1 ? 1 : 0;D2 = num % 10 == 2 ? 1 : 0;D3 = num % 10 == 3 ? 1 : 0;D4 = num % 10 == 4 ? 1 : 0;num++;if(num == 100){num = 0;}}}```该程序使用了51单片机的寄存器编程方式,通过控制P2口的四个引脚来控制数码管的显示。
其中,sbit是单片机中的一种特殊类型,用于定义单个引脚的输入输出状态。
在程序的主函数中,首先定义了一个无符号字符型变量num,并将其初始化为0。
然后进入一个无限循环,每次循环都会对num进行加1操作。
当num等于100时,将其重新赋值为0,以实现循环显示的效果。
在每次循环中,程序通过对num取模运算来判断应该显示哪些数字。
例如,当num % 10等于1时,将D1引脚设置为1,否则设置为0。
同理,对于D2、D3、D4引脚也进行了类似的操作。
这样就可以实现静态显示数字的效果。
需要注意的是,该程序只能显示0~4这五个数字,因为它只使用了四个引脚来控制数码管的显示。
如果要显示更多的数字,需要使用更多的引脚或者采用其他的显示方式。
数码管静态显示程序是一种比较简单的程序,通过对单片机的引脚进行控制,可以实现数字的静态显示。
对于初学者来说,这是一个很好的练手项目,可以帮助他们更好地理解单片机的编程原理。
单片机数码管显示程序
#include<STC12.h>#include<AD.H>#include<stdio.h>#define uchar unsigned char#define uint unsigned intuint AD_DATE;sbit LE1=P2^0; //位选573锁存器使能sbit LE2=P2^1; //段选573锁存器使能uchar code dis[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,// 0 1 2 3 4 5 6 70x7F,0x6F};// 8 9void delay(uint time) //int型数据为16位,所以最大值为65535 {uint i,j; //定义变量i,j,用于循环语句for(i=0;i<time;i++) //for循环,循环50*time次for(j=0;j<100;j++); //for循环,循环50次}void smg_show(uint n){//显示千位P0=0xef; //0xbf=1011 1111,即选通个位LE1=1; //锁存位LE1=0; //断开锁存,位选573的Q7~Q0仍保持P0=dis[n/1000]; //dis[n/10]为0~9的编码LE2=1; //锁存段码LE2=0; //断开锁存,段选573的Q7~Q0仍保持delay(10);P0=0x00;LE2=1;LE2=0; //清除P1口数据,以免造重影//显示百位P0=0xdf; //0xbf=1011 1111,即选通个位LE1=1; //锁存位LE1=0; //断开锁存,位选573的Q7~Q0仍保持P0=dis[n%1000/100]; //dis[n/10]为0~9的编码LE2=1; //锁存段码LE2=0; //断开锁存,段选573的Q7~Q0仍保持delay(10); //延时保持一下,延时过大会闪动,延时过小会有重影 P0=0x00;LE2=1;LE2=0; //清除P1口数据,以免造重影 //延时保持一下,延时过大会闪动,延时过小会有重影//显示十位P0=0xbf; //0xbf=1011 1111,即选通个位LE1=1; //锁存位LE1=0; //断开锁存,位选573的Q7~Q0仍保持P0=dis[n%100/10]; //dis[n/10]为0~9的编码LE2=1; //锁存段码LE2=0; //断开锁存,段选573的Q7~Q0仍保持delay(10); //延时保持一下,延时过大会闪动,延时过小会有重影P0=0x00;LE2=1;LE2=0; //清除P1口数据,以免造重影//显示个位P0=0x7f; //0xbf=0111 1111,即选通十分位LE1=1; //锁存位LE1=0; //断开锁存,位选573的Q7~Q0仍保持P0=dis[n%10]; //0~9的编码LE2=1; //锁存段码LE2=0; //断开锁存,段选573的Q7~Q0仍保持delay(10); //延时保持一下,延时过大会闪动,延时过小会有重影 P0=0x00;LE2=1;LE2=0; //清除P1口数据,以免造重影}main(){while(1){AD();AD_DATE=ee;smg_show(AD_DATE);}}。
单片机C语言程序(数码管动态静态显示)
0123动态显示:#inclu de<re g52.h>#de fineuchar unsi gnedchar#defi ne ui nt un signe d intuint num,numdu,numw e;uc har c ode t abled u[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};ucha r cod e tab lewe[]={0xfe,0xfd,0xfb,0xf7};sbit dula=P2^6;sbi t wel a=P2^7;vo id di splay();v oid m ain(){E A=1;ET1=1;T MOD=0x10;TH1=(65536-500)/256;TH0=(65536-500)%256;TR1=1;nu m=0;whil e(1){if(nu m==20){n um=0;i f(num du==4)numdu=0;if(numwe==4)nu mwe=0;displ ay();n umdu++;numw e++;}}}v oid t ime1() int errup t 3{TH1=(65536-500)/256;T H0=(65536-500)%256;num++;}voiddispl ay(){P0=0xff;we la=1;wel a=0;P0=t abled u[num du];dula=1;dula=0;P0=tab lewe[numwe];w ela=1;we la=0;}0123静态显示:#inclu de<re g52.h>#de fineuchar unsi gnedchar#defi ne ui nt un signe d intuint num,numdu,numw e;uc har c ode t abled u[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};ucha r cod e tab lewe[]={0xfe,0xfd,0xfb,0xf7};sbit dula=P2^6;sbi t wel a=P2^7;vo id de lay(u char);voi d mai n(){EA=1;E T1=1;TMO D=0x10;T H1=(65536-50000)/256;TH0=(65536-50000)%256;TR1=1;while(1){P0=0xf f;wela=1;wela=0;P0=t abled u[0];du la=1;du la=0;P0=tabl ewe[0];wela=1;wela=0;P0=0x ff;wela=1; wel a=0;P0=table du[1];d ula=1;d ula=0;P0=tab lewe[1];wela=1;wela=0;P0=0xff;wel a=1;we la=0;P0=tabl edu[2];dula=1;dula=0;P0=ta blewe[2];wel a=1;wel a=0;P0=0xff;we la=1;w ela=0;P0=tab ledu[3];dula=1;dula=0;P0=t ablew e[3];we la=1;we la=0;} }0-999循环跳变#in clude<reg52.h>#defi ne uc har u nsign ed ch ar#d efine uint unsi gnedintu int a,b,co unt,n um,nu mdu,n umwe; ucha r cod e tab ledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};u charcodetable we[]={0xf e,0xf d,0xf b,0xf7};s bit d ula=P2^6;sbitwela=P2^7;void dela y(uch ar);voiddispl ay(uc har,u char,uchar); vo id ma in(){EA=1;ET1=1;TM OD=0x10;TH1=(65536-50000)/256;T H0=(65536-50000)%256;TR1=1;coun t=0;whil e(1){if(nu m==20){nu m=0;if(count==1000)count=0;c ount++;}d ispla y(cou nt/100,cou nt%100/10,count%10);}}void time1() i nterr upt 3{T H1=(65536-50000)/256;TH0=(65536-50000)%256;num++;}void disp lay(u charbai,u charshi,u charge){P0=0xff;wel a=1;wela=0;P0=ta bledu[bai];du la=1;dul a=0;P0=t ablew e[1];wel a=1;wela=0;delay(1);P0=0xff;wela=1;wela=0;P0=tab ledu[shi];dul a=1;dula=0;P0=ta blewe[2];wela=1;wela=0;d elay(1); P0=0xff;wela=1;wela=0;P0=tab ledu[ge];dula=1;dula=0;P0=tab lewe[3];wela=1;w ela=0;de lay(1);}voiddelay(ucha r x){uc har a,b;for(a=x;a>0;a--)f or(b=200;b>0;b--); }。
数码管单片机c语言程序设计
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
Delay(5);
dula=1;
P0=table2[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
numwe++;
}
}
}
void exter0() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
void main(void)
{
dispd display(uint temp)
{
uint bai,shi,ge;
bai=temp/100 ;
shi=temp%100/10;
ge=temp%10;
#define uint unsigned int
#define uchar unsigned char
sbit Wela=P2^1;
sbit Dula=P2^2;
uchar tt,numdu,numwe;
uchar code table2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void Delay_Us(uchar t)
{
while(--t);
}
void Delay_Ms(uint t)
{
while(t--){
Delay_Us(245);
硬件实验6 八段数码管显示实验
硬件实验6 八段数码管显示实验1.实验目的1)了解数码管实现显示字符的7段码编制方法;2)掌握查表法获得0-F的7段码的方法;3)掌握静态显示和动态显示的原理,硬件连接方式和程序编写方法。
2.预习要求1)了解数码管静态显示和动态显示接口电路的设计方法和特点;2)了解数码管动态显示的程序设计方法;3)理解运用串行口工作方式0扩展I/O连接数码管的方法;4)认真预习本节实验内容,设计实验硬件连接电路,编写实验程序。
3.实验说明1)LED数码管显示原理8段LED数码管有共阴极和共阳极两种结构。
对于共阴数码管,其8个LED的阴极连接在一起作为公共COM端;而共阳数码管中8个LED的阳极连接在一起作为公共COM端。
共阴数码管显示的必要条件是其COM端接地或接具有较大灌电流能力的输入端口,此时当某个发光二级管的阳极为高电平时,该发光二极管点亮;共阳数码管显示的必要条件是共阳极接电源或具有较强电流输出能力的输出端口,此时当某个发光二极管的阴极接低电平时,该发光二级管被点亮。
2)LED数码管显示方式A.静态显示方式静态显示的特点是每个数码管需要一个具有锁存功能的8位输出口,用来锁存待显示的段码。
将要显示数的7段码输出到端口,数码管就会显示并一直保持到接收到新的显示段码为止。
静态显示的优点:显示程序简单,占用CPU时间少。
但当数码管数量较多时,就需要外扩较多的输出端口,因此静态显示的缺点是占用硬件资源多,成本较高。
B.动态显示方式动态显示的特点是将多个数码管的相应段码线连在一起,接到一个8位输出端口,该端口称为段码输出口;同时将各个(如8个)数码管的COM端连接到一个8位输出端口,该端口称为位控输出口。
这样的连接使得8个数码管只要2个输出端口就可以实现控制,大大简化硬件电路。
但是由于多个数码管的段码是连在一起的,所以需要结合位控信号,分时输出不同数码管上显示的7段码,即需要采用动态显示扫描,轮流向段码输出口输出段码和向位控输出口输出位选信号,并进行1~2ms的短时延时;8个数码管轮流输出一遍后,约20ms后,就要进行一次显示刷新,这样才能利用发光管的余辉和人眼视觉暂留作用,得到全部数码管同时稳定显示的效果。
LED数码管显示程序设计
选择合适的显示方式,如静态显示、动态显示等。
设计显示程序流程图
流程图设计
根据显示内容和方式,设计出相应的 程序流程图。
模块划分
将程序划分为不同的模块,以便于编 写和调试。
编写显示程序代码
代码编写
根据流程图,编写相应的程序代码。
代码优化
优化代码结构,提高程序执行效率。
调试与测试程序
调试
检查程序中是否存在错误或异常。
LED数码管显示程序设计
• LED数码管基础知识 • LED数码管显示程序设计基础 • LED数码管显示程序设计流程 • LED数码管显示程序设计实例 • LED数码管显示程序设计的常见问题
与解决方案 • LED数码管显示程序设计的未来发展
与展望
01
LED数码管基础知识
LED数码管简介
01
LED数码管是一种由多个LED发光 二极管组成的显示器件,通常用 于显示数字和某些字母。
编程语言
了解常用的编程语言,如 C语言、汇编语言等,以 便选择适合的编程语言进 行设计。
开发工具
了解常用的开发工具,如 编译器、调试器等,以便 选择适合的开发工具进行 设计。
LED数码管显示程序设计的编程语言基础
C语言基础
了解C语言的基本语法、数 据类型、控制结构等,以 便使用C语言进行程序设计。
数码管显示程序运行不稳定或出现错误
总结词
数码管显示程序运行不稳定或出现错误,可 能是由于硬件兼容性问题、程序代码错误或 系统资源不足等原因。
详细描述
检查硬件设备是否兼容,确保数码管与主控 制器等设备能够正常通信和协同工作。检查 程序代码中是否有逻辑错误或语法错误,导 致程序运行不稳定或出现错误。检查系统资 源是否充足,如内存、处理器等资源是否足
课题四 数码管显示
图4-1 数码管显示实物图
任务一
LED数码管的静态显示
本任务就是将单片机与数码管接成图 4-2所示静态显示方式,编程实现数码管 每隔0.5s的0-9数字显示。
图4-2
数码管显示电路图
一、任务分析
所谓静态显示,就是当单片机某一端口输出 一组显示数据之后,该端口一直保持该数据输出, 维持数码管的显示数字,直到端口数据改变,又 保持显示下一数据的显示方式。 在具体电路连接上,将单片机一个端口的八 个端子接在一只数码管的八个引脚上(h端为小数 点),控制数码管的七段LED的亮或熄,显示器 出数字,这种显示控制方式就是静态显示。静态 显示电路连接特点是单片机端口的每一位与数码 管的一个端相连接,相当于单片机的一个引脚外 接一只发光二极管。
unsigned char dispcount; void delay02s(void) { unsigned char i,j,k; for(i=10;i>0;i--) for(j=200;j>0;j--) for(k=248;k>0;k--);} void main(void) { while(1) {for(dispcount=0;dispcount<8;dispcount++) { P0=tablewe[dispcount]; P1=tabledu[dispcount]; delay02s(); } } }
数码管段码表
表4-1 共阴数码管显示数字的段码表
段名称 dp g f e d c b a 对应段码
对应引脚
数字0 数字1 数字2 数字3 数字4 数字5 数字6 数字7 数字8
P1.7
0 0 0 0 0 0 0 0 0
P1.6
0 0 1 1 1 1 1 0 1
STM32--数码管显示使用
STM32--数码管显⽰使⽤STM32 – 数码管显⽰简介1.硬件部分STM32F103C8T6 最⼩系统板 ⼀位共阴数码管2.软件部分Keil软件编程 数码管码表硬件部分数码管简介数码管,也称作辉光管,是⼀种可以显⽰数字和其他信息的电⼦设备。
玻璃管中包括⼀个⾦属丝⽹制成的阳极和多个阴极。
⼤部分数码管阴极的形状为数字。
管中充以低压⽓体,通常⼤部分为氖加上⼀些汞和/或氩。
给某⼀个阴极充电,数码管就会发出颜⾊光,视乎管内的⽓体⽽定,⼀般都是橙⾊或绿⾊。
分类数码管也称LED数码管,不同⾏业⼈⼠对数码管的称呼不⼀样,其实都是同样的产品。
按发光⼆极管单元连接⽅式可分为共阳极数码管和共阴极数码管。
共阳数码管是指将所有发光⼆极管的阳极接到⼀起形成公共阳极(COM)的数码管,共阳数码管在应⽤时应将公共极COM接到+5V,当某⼀字段发光⼆极管的阴极为低电平时,相应字段就点亮,当某⼀字段的阴极为⾼电平时,相应字段就不亮。
共阴数码管是指将所有发光⼆极管的阴极接到⼀起形成公共阴极(COM)的数码管,共阴数码管在应⽤时应将公共极COM接到地线GND上,当某⼀字段发光⼆极管的阳极为⾼电平时,相应字段就点亮,当某⼀字段的阳极为低电平时,相应字段就不亮。
1.共阳数码管共阳数码管在应⽤时应将公共极COM接到+5V,当某⼀字段发光⼆极管的阴极为低电平时,相应字段就点亮,当某⼀字段的阴极为⾼电平时,相应字段就不亮。
2.共阴数码管对于共阴极数码管来说,当某个发光⼆极管的阳极为⾼电平时,发光⼆极管点亮,相应的段被显⽰。
同样,共阳极数码管的阳极连接在⼀起,公共阳极接+5V,当某个发光⼆极管的阴极接低电平时,该发光⼆极管被点亮,相应的段被显⽰数码管码表unsigned char code smgduan[17] ={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};//共阳数码管unsigned char code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};共阴数码管静态数码管硬件电路设计实物软件部分/*********************************************************************** ⽂件名:smg.c* 描述:smg 应⽤函数库* 硬件连接:-----------------* | PA0 - A |* | PA1 - B |* | PA2 - C |* | PA3 - D |* | PA4 - E |* | PA5 - F |* | PA6 - G |* | PA7 - DP |* -----------------*********************************************************************/#include "smg.h"#include "delay.h"//共阳数码管断码表u8 const smg_data[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};/** 函数名:SMG_GPIO_Config* 描述:配置数码管⽤到的I/O⼝* 输⼊:⽆* 输出:⽆*/void SMG_GPIO_Config(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7); // turn o ff all led}/** 函数名:SMG_Display* 描述:驱动数码管显⽰0-F* 输⼊:⽆* 输出:⽆*/void SMG_Display(void){u8 i;for(i=0;i<16;i++){GPIO_Write(GPIOA,smg_data[i]);delay_ms(1000);}}void Display_N(u8 N){GPIO_Write(GPIOA,smg_data[N]);}smg.h#ifndef __SMG_H#define __SMG_H#include "stm32f10x.h"void SMG_GPIO_Config(void);void SMG_Display(void);void Display_N(u8 N);#endif /* __SMG_H */数码管案例(基于51单⽚机四位数码管模块(74HC595))14脚:DS(SER),串⾏数据输⼊引脚13脚:OE, 输出使能控制脚,它是低电才使能输出,所以接GND12脚:RCK,存储寄存器时钟输⼊引脚。
单片机数码管静态显示及定时器和中断应用
例 利用定时/计数器T1的方式1,产生10ms的定时,并使P1.0引脚上输出周期为20ms的方波,采用中断方式,设系统时钟频率为12 MHz。 解:1、计算计数初值X: 由于晶振为12 MHz,所以机器周期Tcy为1 s。 所以: N=t/ Tcy =10000/1=10000 X=65536-10000=55536=D8F0H 即应将D8H送入TH0中,F0H送入TL0中 2、求T1的方式控制字TMOD: M1M0=01,GATE=0,C/T=0,可取方式控制字为01H;
GATE:门控位。GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作。即此时定时器的启动多了一条件。 :定时/计数模式选择位。 =0为定时模式; =1为计数模式。 M1M0:工作方式设置位。定时/计数器有四种工作方式,由M1M0进行设置。
TF0(TCON.5),片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断。
TF1(TCON.7),片内定时/计数器T1溢出中断请求标志。当定时/计数器T1发生溢出时,置位TF1,并向CPU申请中断。
RI(SCON.0)或TI(SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断。
使用LED显示器时,要注意区分这两种不同的接法。为了显示数字或字符,必须对数字或字符进行编码。七段数码管加上一个小数点,共计8段。因此为LED显示器提供的编码正好是一个字节。TX实验板用共阴LED显示器,根据电路连接图显示16进制数的编码已列在下表。
数码管静态显示程序源码解读
数码管静态显示程序源码解读数码管静态显示程序源码解读数码管是一种常见的数字显示器件,它可以用来显示数字、字母等字符。
在嵌入式系统中,常使用数码管作为输出设备,通过编写程序控制其显示内容。
下面是一个数码管静态显示程序的源码解读。
代码如下:```#include <reg52.h> //头文件#define uint unsigned int //定义无符号整型#define uchar unsigned char //定义无符号字符型sbit LSA=P2^2; //定义LSA引脚sbit LSB=P2^3; //定义LSB引脚sbit LSC=P2^4; //定义LSC引脚void delay(uint i) //延时函数{while(i--);}void datapros(uchar dat) //数据处理函数{switch(dat) //根据输入的数据选择相应的输出方式 {case(0): LSA=0;LSB=0;LSC=0;break;case(1): LSA=1;LSB=0;LSC=0;break;case(2): LSA=0;LSB=1;LSC=0;break;case(3): LSA=1;LSB=1;LSC=0;break;case(4): LSA=0;LSB=0;LSC=1;break;case(5): LSA=1;LSB=0;LSC=1;break;case(6): LSA=0;LSB=1;LSC=1;break;case(7): LSA=1;LSB=1;LSC=1;break;default:break;}}void main() //主函数{uchar i;while(1){for(i=0;i<8;i++) //循环输出0~7{datapros(i); //调用数据处理函数delay(10000); //延时}}}```这段程序的作用是通过三个引脚控制数码管的显示,实现静态显示0~7的数字。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
unsigned int i,j;
LSA=0;
LSB=0;
LSC=0;
while(1)
{
if(K1==0)//检测按键K1是否按下
{
Delay10ms();//消除抖动
if(K1==0)
{
j=0;
}
while((i<50)&&(K1==0))//检测按键是否松开
{
Delay10ms();
i++;
}
i=0;
}
if(K2==0)//检测按键K2是否按下
{
Delay10ms();
if(K2==0)
{
j=9;
}
while((i<50)&&(K2==0))
{
Delay10ms();
i++;
}
i=0;
}
if(K3==0)//检测按键K3是否按下
{
Delay10ms();
if(K3==0)
{
j--;
*输出:无
*******************************************************************************/
void Delay10ms(void) //误差0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
#include<intrins.h>
#define GPIO_DIG P0
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit K1=P3^1;
sbit K2=P3^0;
sbit K3=P3^2;
sbit K4=P3^3;
unsigned char code DIG_CODE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~9的值
/*******************************************************************************
*实验名:静态数码管实验
*使用的IO:数码管使用P0,键盘使用P3.0、P3.1、P3.2、P3.3
*实验效果:按下K1键,显示0,按下K2键,显示9,按下K3键,显示减1,按下K4键,
i++;
}
i=0;}ຫໍສະໝຸດ GPIO_DIG=DIG_CODE[j];
}
}
/*******************************************************************************
*函数名: Delay10ms
*函数功能:延时函数,延时10ms
*输入:无
*显示加1。
*注意:由于P3.2口跟红外线共用,所以做按键实验时为了不让红外线影响实验
*效果,最好把红外线先取下来。
*******************************************************************************/
#include<reg51.h>
void Delay10ms(); //延时10ms
/*******************************************************************************
*函数名: main
*函数功能:主函数
*输入:无
*输出:无
*******************************************************************************/
if(j>9)
j=9;
}
while((i<50)&&(K3==0))
{
Delay10ms();
i++;
}
i=0;
}
if(K4==0)//检测按键K4是否按下
{
Delay10ms();
if(K4==0)
{
j++;
if(j>9)
j=0;
}
while((i<50)&&(K4==0))
{
Delay10ms();