单片机中数码管程序p2=0xef; p0=table[a]; delay(1);是啥意思

单片机中数码管程序p2=0xef; p0=table[a]; delay(1);是啥意思,第1张

这个 是数码管扫描一部分,

p2=0xef  \\开通这一位的数码管,让它把数字显示在P2_7的这位上

P0=table[a]\\table是一个数组,里面应该是数码管的段码,这样就会就能在上面开通那位显示具体的数据。‘a'

delay(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++)

}

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存