求四位数码管共阳c语言时钟程序

求四位数码管共阳c语言时钟程序,第1张

/源程序默认硬件环境:52单片机,12MHz晶振,四位共阳数码管,P0段选,P20-P23低电平位选,P23最高位,P20最低位/#include"reg52h"//包含52头文件#defineTRUE1//定义布尔量'1':真#defineFALSE0//定义布尔量'0':假#defineucharunsignedchar//定义无符号字符型数据简称#defineuintunsignedint//定义无符号整型数据简称#defineth00x3c#definetl00xb0//50msat12MHz(定时器工作模式1状态)#defineth10xfc#definetl10x18//1msat12MHz(定时器工作模式1状态)#defineT1sAt50msCount20//定义1s在50ms计时基准状态下的计数值为20#defineSEG_Num4#defineSEG_DataP0//数码管段驱动接口#defineSEG_EnP2//数码管位驱动接口#defineSEG_AllOff(SEG_En|=0x0f)//关闭所有数码管(位驱动)#defineDisTimeAt1msCount4//单'位'数码管显示时间,数码管刷新频率f=1/(Nt),其中N为数码管位数,t为单'位'数码管显示时间ucharSEG_B_List[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管代码表"0-9"ucharSec,Min;ucharbdataFlag=2;sbitT1sTimesUpFlag=Flag^0;sbitDisplayFlag=Flag^1;voidTimer0()interrupt1//定时器0中断函数{staticuchart50ms;TL0=tl0;TH0=th0;t50ms=++t50ms%T1sAt50msCount;//先对50ms计时变量加1,后对变量范围进行限制(0~19)(即对20取模)if(!t50ms)T1sTimesUpFlag=TRUE;//若计时变量归0,表示计时变量曾经到达20(1s),则对1s计时标志位置位}voidTimer1()interrupt3{staticuchart1ms;TL1=tl1;TH1=th1;t1ms=++t1ms%DisTimeAt1msCount;//先计数值加1,后对计数范围进行限制0~(DisTimeAt1msCount-1)if(!t1ms)DisplayFlag=TRUE;//若定时计数值归0,则表示计数值曾到达单'位'显示时间(DisTimeAt1msCount),显示标志置位}voidTimerInit(){TMOD=0x11;//开启定时器0、定时器1,并都工作在模式1TH0=th0;TL0=tl0;TR0=1;//启动T0定时器计时ET0=1;//允许定时器0中断TH1=th1;TL1=tl1;TR1=1;//启动T1定时器计时ET1=1;//允许定时器1中断EA=1;//开启系统中断功能}voidTimesUpdata()//时间更新函数{if(T1sTimesUpFlag)//若1s计时标志位为真,即1s定时时间到{Sec=++Sec%60;//秒Sec在0-59范围内加1if(!Sec)Min=++Min%60;//若秒Sec重归0,则分Min在0-59范围内加1T1sTimesUpFlag=FALSE;//清1s计时标志位}}floatPow_Self(floatx,uinty)//自编简易x的y次方函数,y只能是非负整数{floatsum;if(x==0&&y==0)return;//0的0次方无意义elseif(x==0)sum=0;//可有可无,y!=0的情况已经包含x=0,不加不影响结果,但影响运算速度elseif(y==0)sum=1;//除上述情况外,任何数的0次方均为1elseif(y==1)sum=x;//任何数的1次方均为本身elseif(y>1)sum=Pow_Self(x,--y)x;//递归调用,降幂returnsum;//返回计算结果}voidDisplay(uintdis_num)//显示函数,显示内容为无符号整型数据dis_num{staticdis_loca;//定义静态变量显示位置dis_loca=++dis_loca%SEG_Num;//先对显示位置加1,后对变量范围进行限制0~(SEG_Num-1)SEG_AllOff;//关闭所有数码管显示(位驱动)SEG_Data=SEG_B_List[(dis_num/(uint)(Pow_Self(10,dis_loca)))%10];//将显示内容(dis_num)本次需显示的位(dis_loca)上的数值转成代码,并送到数据端口if(dis_loca==2)SEG_Data&=0x7f;//显示小数点,用于区分Min跟SecSEG_En&=~(1<

共阳极数码管显示0~9对应的段码。

#include//单片机寄存器相关的文件

#include//具有空指令的文件

#defineucharunsignedchar//宏定义以后用uchar替代unsignedchar

#defineuintunsignedint//宏定义作用同上ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//数码管0-9的段码值//延时

voidDelayMS(uintx)//延时函数

{

uchart;//定义变量数值范围0-255

while(x--)for(t=0;t}//主程序

voidmain()//主函数

{uchari=0;//定义变量i并且i=0P0=0x00;//P0口=0x00P0口全部为低电平

while(1)//主循环

{

P0=~DSY_CODE[i];//P0=取反的数码管段码值

i=(i+1)%10;//i=i自加1个位的数

DelayMS(300);//延时}}/

简单来说比如显示01,那么程序如下,只要循环调用这个子程序就可以

DISPLAY:

SETB P20

CLR P21

MOV P0,#0C0H

LCALL DELAY

CLR P20

SETB P21

MOV P0,#06H

LCALL DELAY

RET

写程序时,要轮流扫描这8位,但每次只显示一位。如,先输出第一个数码管显示的段码,再输出第一位数码管阳极有效的位码,只有这一个阳极为1。延时,再依次输出后面的数码管显示的段码和位码。

这样不断循环显示才行的。但显示每一位的延时不能太长了,如你这个延时子程序,改成for(a=0;a回答于 2022-12-23

在我的能力范围~

首先,你的数码管直接接在ATMEGA16上,我觉得太浪费了,AVR是很强大的单片机,你可以考虑一些接个74ls47在数据口,剩I/O口嘛,既然你要是直接接的话,我就按你说的做吧~!

#include<iom16vh>

typedef unsigned char unchar;

typedef unsigned int unint;

unint num;

unchar word[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

/////////////这里当然不是0x00啦~!自己用仿真软件,把数码管调出来一个一个脚试!!我也是初学啊!要动手的!总是问别人,会丢掉学习的机会,当有的问题,别人帮你解决了,但你还是不懂,而别人却又吸收了新知识!

void delay(unchar i)

{

unchar j;

for(;i>0;i--)

for(j=0;j<250;j++);

}

void main()

{

DDRC=OXFF;

DDRD=0XFF;

while(1)

{

PORTD=0X08;

PORTC=word[num/1000];

delay(5);

PORTD=0X04;

PORTC=word[num/100%10];

delay(5);

PORTD=0X02;

PORTC=word[num%100/10];

delay(5);

PORTD=0X01;

PORTC=word[num%10];

delay(5);

}

}

有错就联系一下我啦,因为我也没仿真,这写法方便对显示的数加一减一。

#define u8 unsigned char

#define u16 unsigned int

u8 code table[] = {

    0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 

    0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e,

};

void delay(u16 t)

{

    u16 i;

    for(;t>0; t--)

        for(i=100; i>0; i--);

}

void main(void)

{

    u8 num = 0;

    while(1) {

        P1 = table[num];

        delay(1000);

        num++;

        if(num>9)

            num = 0;

    }

}

以上就是关于求四位数码管共阳c语言时钟程序全部的内容,包括:求四位数码管共阳c语言时钟程序、共阳极数码管显示0~9对应的段码、51单片机双位共阳数码管的汇编语言的动态显示等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9279567.html

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

发表评论

登录后才能评论

评论列表(0条)

保存