求一个时钟数码管的C程序

求一个时钟数码管的C程序,第1张

简易电子时钟,LED数码管显示,

K1---时调整

(p36)

K2---分调整

(p37)

,数码管数据p0,数码管控制p2,上电时初始化显示:

12-00-00

#include

<reg51.h>

#include

<intrins.h>

unsigned

char

data

dis_digit

unsigned

char

key_s,

key_v

unsigned

char

code

dis_code[11]={

0x28,

0x7E,

0xA2,

0x62,

0x74,

0x61,

0x21,

0x7A,

0x20,

0x60,0xff}//0,1,2,3,4,5,6,7,8,9,关显示,数码管码表

unsigned

char

data

dis_buf[8]

unsigned

char

data

dis_index

unsigned

char

hour,min,sec

unsigned

char

sec100

sbit

K1

=

P3^6

sbit

K2

=

P3^7

bit

scan_key()

void

proc_key()

void

inc_sec()

void

inc_min()

void

inc_hour()

void

display()

void

delayms(unsigned

char

ms)

char

code

SST516[3]

_at_

0x003b

void

main(void)

{

P0

=

0xff

P2

=

0xff

TMOD

=

0x11

//

定时器0,

1工作模式1,

16位定时方式

TH1

=

0xdc

TL1

=

0

TH0

=

0xFC

TL0

=

0x17

hour

=

12

min

=

00

sec

=

00

sec100

=

0

dis_buf[0]

=

dis_code[hour

/

10]

//

时十位

dis_buf[1]

=

dis_code[hour

%

10]

//

个位

dis_buf[3]

=

dis_code[min

/

10]

//

分十位

dis_buf[4]

=

dis_code[min

%

10]

//

分个位

dis_buf[6]

=

dis_code[sec

/

10]

//

秒十位

dis_buf[7]

=

dis_code[sec

%

10]

//

秒个位

dis_buf[2]

=

0xf7

//

显示"-"

dis_buf[5]

=

0xf7

//

显示"-"

dis_digit

=

0xfe

dis_index

=

0

TCON

=

0x01

IE

=

0x8a

//

使能timer0,1

中断

TR0

=

1

TR1

=

1

key_v

=

0x03

while(1)

{

if(scan_key())

{

delayms(10)

if(scan_key())

{

key_v

=

key_s

proc_key()

}

}

}

}

bit

scan_key()

{

key_s

=

0x00

key_s

|=

K2

key_s

<<=

1

key_s

|=

K1

return(key_s

^

key_v)

}

void

proc_key()

{

EA

=

0

if((key_v

&

0x01)

==

0)

//

K1

{

inc_hour()

}

else

if((key_v

&

0x02)

==

0)

//

K2

{

min++

if(min

>

59)

{

min

=

0

}

dis_buf[3]

=

dis_code[min

/

10]

//

分十位

dis_buf[4]

=

dis_code[min

%

10]

//

分个位

}

EA

=

1

}

void

timer0()

interrupt

1

//

定时器0中断服务程序,

用于数码管的动态扫描

//

dis_index

---

显示索引,

用于标识当前显示的数码管和缓冲区的偏移量

//

dis_digit

---

位选通值,

传送到P2口用于选通当前数码管的数值,

如等于0xfe时,

//

选通P2.0口数码管

//

dis_buf

---

显于缓冲区基地址

{

TH0

=

0xFC

TL0

=

0x17

P2

=

0xff

//

先关闭所有数码管

P0

=

dis_buf[dis_index]

//

显示代码传送到P0口

P2

=

dis_digit

//

dis_digit

=

_crol_(dis_digit,1)

//

位选通值左移,

下次中断时选通下一位数码管

dis_index++

//

dis_index

&=

0x07

//

8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描

}

void

timer1()

interrupt

3

{

TH1

=

0xdc

sec100++

if(sec100

>=

100)

{

sec100

=

0

inc_sec()

}

}

void

inc_sec()

{

sec++

if(sec

>

59)

{

sec

=

0

inc_min()

}

dis_buf[6]

=

dis_code[sec

/

10]

//

秒十位

dis_buf[7]

=

dis_code[sec

%

10]

//

秒个位

}

void

inc_min()

{

min++

if(min

>

59)

{

min

=

0

inc_hour()

}

dis_buf[3]

=

dis_code[min

/

10]

//

分十位

dis_buf[4]

=

dis_code[min

%

10]

//

分个位

}

void

inc_hour()

{

hour++

if(hour

>

23)

{

hour

=

0

}

if(hour

>

9)

dis_buf[0]

=

dis_code[hour

/

10]

//

时十位

else

dis_buf[0]

=

0xff

//

当小时的十位为0时不显示

dis_buf[1]

=

dis_code[hour

%

10]

//

时个位

}

void

delayms(unsigned

char

ms)

//

延时子程序

{

unsigned

char

i

while(ms--)

{

for(i

=

0

i

<

120

i++)

}

}

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

uchar temp,aa,miao,fen,shi

sbit m=P3^0

sbit n=P3^1

uchar code table[]={ //数码管编码表

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

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

0x7f,0x6f}

void display(uchar miao,uchar fen,uchar shi)

void delay(uint z)

void init()

void main()

{

init()//初始化子程序

miao=0

shi=0

fen=0

while(1)

{

display(miao,fen,shi)

}

}void delay(uint z)

{

uint x,y

for(x=zx>0x--)

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

}void display(uchar miao,uchar fen,uchar shi) // 显示子函数

{

P0=0x00

P0=table[miao%10]

P2=0x7f

delay(1)

P0=0x00

P0=table[miao/10]

P2=0xbf

delay(1) P0=0x00

P0=table[fen%10]

P2=0xdf

delay(1)

P0=0x00

P0=table[fen/10]

P2=0xef

delay(1)

P0=0x00

P0=table[shi%10]

P2=0xf7

delay(1) P0=0x00

P0=table[shi/10]

P2=0xfb

delay(1)

}void init() // 初始化子函数

{

temp=0

TMOD=0x01

TH0=(65536-45872)/256

TL0=(65536-45872)%256//定时器初值,定时50ms(12M晶振),由于考虑MCU指令处理时间,此处赋初值位45872

EA=1

ET0=1

TR0=1

}void timer0() interrupt 1 //定时计数器中断

{

TH0=(65536-45872)/256

TL0=(65536-45872)%256 、

aa++

if(aa==20) //中断2次位1S,秒加1

{

miao++

aa=0

if(miao==60)

{

fen++ // 满60S, 分加1,秒清0

miao=0

if(fen==60)

{

shi++// 小时加1

fen=0

if(shi==24) shi=0//小时满

}

}

}

if(m==0) // 调分

{

delay(2)

if(m==0) fen++

if(fen==60) fen=0

delay(2)

while(!m)

}

if(n==0) // 调小时

{

delay(2)

if(n==0) shi++

if(shi==24) shi=0

delay(2)

while(!n)

}

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存