如何利用单片机让4位数码管显示?

如何利用单片机让4位数码管显示?,第1张

程序如下(用的是STC89C52芯片):

#include<reg52.h>//52系列单片机头文件

#define uchar unsigned char

#define uint unsigned int

uint x,y

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71}//共阴极数码管编码

void display(uchar,uchar,uchar,uchar)//声明子函数

void delay(int)//声明子函数

void main()

{

while(1)

{

display(1,2,3,4)//主程序始终调用数码管显示子程序

}

}

void display(uchar a,uchar b,uchar c,uchar d)

{

P2=0xef\t

P0=table[a]//给第一个数码管送"a"

delay(1)//延时1ms

P2=0xdf

P0=table[b]//给第二个数码管送"b"

delay(1)//延时1ms

P2=0xbf

P0=table[c]//给第三个数码管送"c"

delay(1)//延时1ms

P2=0x7f

P0=table[d]//给第三个数码管送"d"

delay(1)//延时1ms

}

void delay(uint z)//延时子函数

{

uint x,y

for(x=zx>0x--)

for(y=110y>0y--)

}

扩展资料

led数码管是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。led数码管常用段数一般为7段有的另加一个小数点,还有一种是类似于3位“+1”型。

位数有半位,1,2,3,4,5,6,8,10位等等,led数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。

参考资料来源:百度百科-数码管

/* ch03-3-4.c - 七段LED数码管实验程序 */

//==声明区=================================================

#include<reg51.h>//定义8051寄存器的头文件,P2-17~19

#define SEG P0 //定义七段LED数码管接至Port 0

/*声明七段LED数码管驱动信号数组(共阳)*/

char code TAB[10]={0xc0,0xf9,0xa4,0xb0,0x99, //数字0-4

0x92,0x83,0xf8,0x80,0x98}//数字5-9

void delay(int) //声明延迟函数

//==主程序==========================================

main() //主程序开始

{ unsigned char i//声明无符号变量i

while(1)//无穷循环,程序一直跑

for(i=0i<10i++) //显示0-9,共10次

{ SEG=TAB[i]//显示数字

delay(500) //延迟500×1m=0.5秒

} //for循环结束

} //主程序结束

//==子程序==========================================

/* 延迟函数,延迟约x×1ms */

void delay (int x) //延迟函数开始

{int i,j //声明整形变量i,j

for (i=0i<xi++) //计数x次,延迟x×1ms

for (j=0j<160j++) //计数120次,延迟1ms

} //延迟函数结束

两位数码管显示38-00倒记时 8段数码管显示.两位数码管显示38-00倒计时(动态扫描方式).p2做LED显示数据输出口.p1.0p1.3分别控制数码管个位数和十位数显示. 8段数码管从内部接线上分共阳和共阴两种。在电路设计时应根据情况决定采用共阳或共阴,其基本原则是:若单片机IO口直接驱动数码管个段,最好采用共阳数码管,因为51单片机IO口输出高电平时输出的电流很小,数码管不会太亮;若数码管是通过驱动芯片与单片机相连的,就要看驱动芯片对数码管极性的要求啦。下面的实验采用共阳数码管。=======================================

constant define 常数定义

csp equ 60h 堆栈开始使用的位置.

=======================================

variable define 变量定义

vadigit equ 30h 数码管个位数存放内存位置

vbdigit equ 31h 数码管十位数存放内存位置

vcnt1 equ 32h 计数器数值存放内存位置=======================================

Func: 程序开始.

=======================================

org 0000h

ajmp mainorg 0030h 到0030h处避开00-30h的敏感地址

=======================================

Func: 程序初始化.

=======================================

main: 初始化特殊寄存器及变量

mov sp,#csp 指定堆栈开始使用的位置.

star:

mov vcnt1,#0 初始化计数器,从0开始

lop1:

acall display 调用显示子程序

inc vcnt1 对计数器加1

mov a,vcnt1

cjne a,#100,lop1 判断计数器是否满100?

mov vcnt1,#0 满100就清零重新开始

ljmp lop1 不满就循环执行=======================================

Func: 8.字型LED显示子程序

Input: vcnt1

=======================================

display:

mov a,vcnt1 将temp中的十六进制数转换成10进制

mov b,#10 10进制/10=10进制

div ab a除以b,商在a,余数在b.

mov vbdigit,a 十位在a

mov vadigit,b 个位在b

mov dptr,#digittab 指定查表起始地址

mov r0,#4

dpl1:

mov r1,#250

dplop:

mov a,vadigit 取个位数

movc a,@a+dptr 查个位数的7段代码

mov p1,a 送出个位的7段代码

clr p3.2 开个位显示

acall delayus 显示162微秒

setb p3.2 关闭个位显示,防止鬼影

mov a,vbdigit 取十位数

movc a,@a+dptr 查十位数的7段代码

mov p1,a 送出十位的7段代码

clr p3.3 开十位显示

acall delayus 显示162微秒

setb p3.3 关闭十位显示,防止鬼影

djnz r1,dplop 循环执行250次

djnz r0,dpl1 循环执行250X4=1000次

ret=======================================

Func: 162us延时子程序

=======================================

delayus:

mov r7,#80 ///2+2X80=162微秒,延时按11.0592MHZ计算

djnz r7,$

retorg 0600h

=======================================

digittab: 实验板上的7段数码管0~9数字的共阳显示代码

db 0c0h0

db 0f9h1

db 0a4h2

db 0b0h3

db 099h4

db 092h5

db 082h6

db 0f8h7

db 080h8

db 090h9

end


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11499615.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存