
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^2//定义锁存使能端口 段锁存
sbit LATCH2=P2^3// 位锁存
unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}// 显示段码值01234567
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}//分别对应相应埋让的数码管点亮,即位码
void Delay(unsigned int t)//函数声明
/*------------------------------------------------
主函数
------------------------------------------------*/
main()
{
unsigned char i=0
while(1)
{
DataPort=dofly_WeiMa[i]//取位码
LATCH2=1//位锁存
LATCH2=0
DataPort=dofly_DuanMa[i]//取显示数据,段码
LATCH1=1//段锁存
LATCH1=0
Delay(60000)// 扫描间隙延时,时间太长会闪烁,太短会造成重影,
//这里携尘故意延长时间,方便直观看出动态扫描原理
i++
if(8==i)//检测8位扫描完全结束?如扫描完成则从第一个
//开始再次扫描8位
i=0
}
}
/*------------------------------------------------
延时函数,含有输入参数 unsigned int t,无返回值
unsigned int 是定义无符号整形变量,其值的范围是
0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t)
}
如果你的硬件已连接完善,那编程需:1、动态扫描:在已个 t 时间内(可以是几个ms)选中 1 位数码管,以亮点该位数码管对应的码段,其他关断(不亮);而下一个 t 时间需点亮下一位数码管......以此类推,循环起来。这个 t 可以用定时器准确控制。当然,如果你只是为了实现单纯的3个数码管显示,可以不精确时败并禅间,循环起来就是了(只蔽慎要保证耽搁的显示时间少于肉眼识别时间,就是看起来不会一闪一闪的就行);
2、显示内察尘容:多数情况下,待显示的字符/数字先按数码定义编码,存放在表格中。按自己的编程需要,在显示的时候从表格中提取。当然,如果只是简单实验,显示的内容是固定的,也可以程序里用立即数。
多试一试吧。
#include"reg51.h"#include "intrins.h" //_nop_()延时函数用
#define uchar unsigned char
#define uint unsigned int
#define SEG_OUTP0 //段码输出口
#define BIT_OUTP2 //扫描口
sbit dot=P2^7 //LED小数点控制
uchar code tab[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf}
/* 共阳LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" */
uchar data dis_buff[8]={1,2,0,0,0,0} //待显示单老拿元数据,共6个数据
unsigned long temp
/*************1毫秒延时程序**************/
delay1ms(int t)
{
int i,j
for(i=0i<空友ti++)
for(j=0j<120j++)
}
//
/***********LED显示动态扫侍亏搭描函数**********/
display()
{
char k
char m=0xfe
for(k=0k<8k++) //8位LED扫描控制
{ BIT_OUT=0xff
SEG_OUT=tab[dis_buff[k]]
BIT_OUT=m
delay1ms(3)
m=(m<<1)|0x01
}
dis_buff[0]=temp/10000000
dis_buff[1]=(temp%10000000)/1000000
dis_buff[2]=(temp%1000000)/100000
dis_buff[3]=(temp%100000)/10000
dis_buff[4]=(temp%10000)/1000
dis_buff[5]=(temp%1000)/100
dis_buff[6]=(temp%100)/10
dis_buff[7]=temp%10
}
/**************初始化程序****************/
void initiation()
{
TMOD=0x01
TH0=-10000/256
TL0=-10000%256 //10MS定时初值(T0计时用)
ET0=1
TR0=1
EA=1
}
/****************定时器0中断服务程序*****/
void init_timer0(void) interrupt 1
{
TH0=-10000/256
TL0=-10000%256 //10MS定时初值(T0计时用)
t10ms++
if(t10ms==100)
{
t10ms=0
ts++
if(ts==60)
{
temp++
ts=0
}
}
}
/****************主程序******************/
main()
{
initiation()
while(1)
{
display()
}
}
一秒加1
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)