动态显示编程
‘壹’ 试编写程序:8位数码管动态显示数字AbcdEFgH
这是参考程序,把dofly_DuanMa[]里面的值改成a、b、c、d、e、f、g、h的对应段码值就行,然后位选信号看下你的连接电路是怎么接的。希望采纳,有疑问请追问。
#include<reg52.h>
#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(600); // 扫描间隙延时,时间太长会闪烁,太短会造成重影,
i++;
if(8==i) //检测8位扫描完全结束?如扫描完成则从第一个
i=0; }
}
/*------------------- 延时函数,含有输入参数 unsigned int t,无返回值 unsigned int 是定义无符号整形变量,其值的范围是 0~65535 ----------------*/
void Delay(unsigned int t)
{ while(--t); }
‘贰’ 单片机编程:LED动态显示
不知道你要怎能么动?我就给个数字显示也动,数码馆也流水显示的
#include
#include
//包含流水灯的头文件
#define
uint
unsigned
int
#define
uchar
unsigned
char
uint
temp,aa,num,numwe;
sbit
an=P3^3;
//段控制端定义
sbit
wei=P3^4;
//位控制端定义
uchar
code
tablewe[]={0x01,0x02,0x04,0x08,0x10,0x20};
//6个数码管位码
uchar
code
table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,
0xC6,0xA1,0x86,0x8E,};
//数码管段码(共阳)
void
main()
{
//以下为初值:
aa=0;
num=0;
//段码要显示的个数,初始为0
numwe=0;
//位码要移动的位数,初始为0
temp=0x01;
//显示状态为单灯暗涌移动,若改成0xfe则单灯点亮移动
P2=temp;
//LED显示在第一位
an=1;
//选通段
P0=0xC0;
//送段码、从0开始显示
an=0;
//关闭段
wei=1;
//选通位
P0=0x01;
//送位码、从第一位数码管开始显示
wei=0;
//关闭位
TMOD=0x01;
//TO工作方式1,也直接写TMOD=0
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
//赋定时初值50MS
EA=1;
ET0=1;
//开定时器0中断
TR0=1;
//启动定时器0
//以下为循环:
while(1)
{
if(aa==100)
//变化延时
{
aa=0;
temp=_crol_(temp,1);
//单灯左移值
P2=temp;
//显示
num++;
//段加1
if(num==16)//0~F共16个,最多到显示”F"
num=0;
an=1;
//开段
P0=table[num];
//显示
an=0;
numwe++;
//位加1
if(numwe==6)//最多移6位
numwe=0;
wei=1;
//开位
P0=tablewe[numwe];
//显示
wei=0;
}
}
}
void
exter0()
interrupt
1
using
1
//using选通用工作寄存器R0-R7,默认为0组
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
aa++;
}
‘叁’ 四位一体共阳级数码管动态显示c语言编程
//满意请采纳
//这是一个四位数码管动态显示c语言程序,每隔一秒加一,直至加到9999为止
//使用时需采用锁存器
#include<reg52.h>
#include"stdio.h"
unsignedcharcodeLED[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsignedcharLEDbuff[]={0xff,0xff,0xff,0xff};
//定义数码管的位选段
sbitSEG_bit_1=P0^1;
sbitSEG_bit_2=P0^2;
sbitSEG_bit_3=P0^3;
sbitSEG_bit_4=P0^4;
unsignedintcnt=0;
unsignedintsec=0;
unsignedintmini=0;
unsignedinthour=0;
unsignedchari=0;
/*voiddelay(unsignedintz)
{
unsignedintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
*/
voidinterrupttimer0()interrupt1/*设置中断函数*/
{
TH0=0xfc;
TL0=0x18;
cnt++;
//P1=0x80;
//delay(1);
switch(i)
{
case0:SEG_bit_1=0;SEG_bit_4=1;P1=LEDbuff[0];i++;break;
case1:SEG_bit_4=0;SEG_bit_3=1;P1=LEDbuff[1];i++;break;
case2:SEG_bit_3=0;SEG_bit_2=1;P1=LEDbuff[2]&;i++;break;
case3:SEG_bit_2=0;SEG_bit_1=1;P1=LEDbuff[3];i=0;break;
default:break;
}
}
/************************************************
voidserial_init()
{
//TMOD=0x20;//定时器T/C1工作方式2
SCON=0x50;//串口工作方式1,允许串口接收(SCON=0x40时禁止串口接收)
TH1=0xF3;//定时器初值高8位设置
TL1=0xF3;//定时器初值低8位设置
PCON=0x80;//波特率倍频(屏蔽本句波特率为2400)
TR1=1;//定时器启动
}
**********************************************/
voidmain()
{
//serial_init();//串口初始化
//TMOD=0x21;/*设置定时器*/
TMOD=0x01;
TH0=0xfc;
TL0=0x18;
TR0=1;
EA=1;/*设置中断*/
ET0=1;
while(1)
{
if(0==TF0)
{
if(cnt>=1000)
{
cnt=0;
sec++;
if(sec>=60){
sec=0;mini++;
if(mini>=60){
mini=0;hour++;
if(hour>=24)hour=0;
}
}
LEDbuff[0]=LED[sec%10];//*设置数码管显示位*/
LEDbuff[1]=LED[sec/10%10];
LEDbuff[2]=LED[mini%10];
LEDbuff[3]=LED[mini/10%10];
//TI=1;//使用printf函数前须先将发送标志位TI置1
//printf("%4d%x,%x%x ",sec,LEDbuff[0],LEDbuff[1],LEDbuff[2]);
//TI=0;
}
}
}
}