程序如下(用的是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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)