51单片机对8位数码管依次显示0-7的设计

控制/MCU

1883人已加入

描述

共阳极数组0~9:display[]={0xC0,0xF9,0xA4,0xB0,0x91,0xA2,0x82,0xF8,0x80,0x90}

共阳极数组A~F:display[]={0x88,0x83,0xA6,0xC1,0x86,0x8E}

共阴极数组0~9:display[]={0x3F,0x06,0x5B,0x4F,0x6E,0x6D,0x7D,0x07,0x7F,0x6F}

共阴极数组A~F:display[]={0x77,0x7C,0x59,0x3E,0x79,0x71}

共阴、两组四位一体数码管,位选接74LS138译码器,输入(位选)CBA接P20,P21,P22。段选通过74573后接P1口。

若不使用译码器,可直接将位选段接IO口,赋值改变。

数码管

/*******************************************************************************

2 * 实 验 名 : 动态数码管显示

3 * 实验说明 : 8位数码管依次显示0~7

*******************************************************************************/

8 #include

9

10 #define GPIO_DIG P1 //Digitron 数码管

11 sbit LSA= P2^0;

12 sbit LSB= P2^1;

13 sbit LSC= P2^2;

14

15 unsigned char code DIG_CODE[10]={

16 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9的显示码

17 void DigDisplay();

18

19 void main(void)

20 {

21 while(1)

22 DigDisplay();

23 }

24

25

26 void DigDisplay()

27 {

28 unsigned char i;

29 unsigned int j;

30 for(i=0;i《8;i++)

31 {

32 switch(i) //位选,选择点亮的数码管,

33 {

34 case(0):

35 LSA=0;LSB=0;LSC=0; break;//显示第0位

36 case(1):

37 LSA=1;LSB=0;LSC=0; break;//显示第1位

38 case(2):

39 LSA=0;LSB=1;LSC=0; break;//显示第2位

40 case(3):

41 LSA=1;LSB=1;LSC=0; break;//显示第3位

42 case(4):

43 LSA=0;LSB=0;LSC=1; break;//显示第4位

44 case(5):

45 LSA=1;LSB=0;LSC=1; break;//显示第5位

46 case(6):

47 LSA=0;LSB=1;LSC=1; break;//显示第6位

48 case(7):

49 LSA=1;LSB=1;LSC=1; break;//显示第7位

50 }

51 GPIO_DIG=DIG_CODE[i];//发送段码

52 j=10000; //扫描间隔时间设定,若减少j,可观察到稳定显示的0~7 (扫描速度太快,人眼识别不了)

53 while(j--);

54 GPIO_DIG=0x00;//消隐

55 }

56 }

1 /*******************************************************************************

2 * 实 验 名 : 数码管秒表显示

3 * 实验说明 : 0~59依次显示

*******************************************************************************/

8 #include

9

10 #define GPIO_DIG P1 //Digitron 数码管

11 #define uchar unsigned char

12 #define uint unsigned int

13 sbit LSA= P2^0;

14 sbit LSB= P2^1;

15 sbit LSC= P2^2;

16

17 uchar shi,ge,num1=0,num=0;

18 uchar code DIG_CODE[10]={

19 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9的显示码

20 void Delay5ms();

21 void DigDisplay(uchar shi,uchar ge);

22

23

24 void main()

25 { //200微秒@20MHz

26 TMOD = 0x01; //设置定时器模式

27 TL0 = 0xA8; //设置定时初值

28 TH0 = 0xFD; //设置定时初值

29 EA = 1; // 开总中断

30 TF0 = 0; //清除TF0标志

31 ET0 = 1; // 开定时器0中断

32 TR0 = 1; //定时器0开始计时

33 while(1)

34 {

35 DigDisplay(shi,ge);

36 }

37 }

38

39 void DigDisplay(uchar shi,uchar ge)

40 {

41 GPIO_DIG=DIG_CODE[shi]; //段选

42 LSA=0;LSB=0;LSC=0;

43 Delay5ms();

44 GPIO_DIG=DIG_CODE[ge];

45 LSA=1;LSB=0;LSC=0;

46 Delay5ms();

47 }

48

49 void Timer0Init(void) interrupt 1

50 {

51 TL0 = 0xA8; //重装初

52 TH0 = 0xFD;

53 num1++;

54 if(num1==200) //5次200ms即为1s到

55 {

56 num1=0;

57 num++;

58 if(num==60)

59 num=0;

60 shi=num/10;

61 ge = num%10;

62 }

63 }

64

65

66 void Delay5ms() //@12.000MHz

67 {

68 unsigned char i, j;

69

70 i = 59;

71 j = 90;

72 do

73 {

74 while (--j);

75 } while (--i);

76 }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分