51单片机 数码管的显示与译码器

共阳极数组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 {
21while(1)
22DigDisplay();
23 }
24
25
26 void DigDisplay()
27 {
28unsigned char i;
29unsigned int j;
30for(i=0;i<8;i++)
31{
32switch(i)//位选,选择点亮的数码管,
33{
34case(0):
35LSA=0;LSB=0;LSC=0; break;//显示第0位
36case(1):
37LSA=1;LSB=0;LSC=0; break;//显示第1位
38case(2):
39LSA=0;LSB=1;LSC=0; break;//显示第2位
40case(3):
41LSA=1;LSB=1;LSC=0; break;//显示第3位
42case(4):
43LSA=0;LSB=0;LSC=1; break;//显示第4位
44case(5):
45LSA=1;LSB=0;LSC=1; break;//显示第5位
46case(6):
47LSA=0;LSB=1;LSC=1; break;//显示第6位
48case(7):
49LSA=1;LSB=1;LSC=1; break;//显示第7位
50}
51GPIO_DIG=DIG_CODE[i];//发送段码
52j=10000;//扫描间隔时间设定,若减少j,可观察到稳定显示的0~7 (扫描速度太快,人眼识别不了)
53while(j--);
54GPIO_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
26TMOD = 0x01;//设置定时器模式
27TL0 = 0xA8;//设置定时初值
28TH0 = 0xFD;//设置定时初值
29EA = 1;// 开总中断
30TF0 = 0;//清除TF0标志
31ET0 = 1;// 开定时器0中断
32TR0 = 1;//定时器0开始计时
33while(1)
34{
35DigDisplay(shi,ge);
36}
37 }
38
39 void DigDisplay(uchar shi,uchar ge)
40 {
41GPIO_DIG=DIG_CODE[shi];//段选
42LSA=0;LSB=0;LSC=0;
【51单片机 数码管的显示与译码器】43Delay5ms();
44GPIO_DIG=DIG_CODE[ge];
45LSA=1;LSB=0;LSC=0;
46Delay5ms();
47 }
48
49 void Timer0Init(void) interrupt 1
50 {
51TL0 = 0xA8;//重装初
52TH0 = 0xFD;
53num1++;
54if(num1==200)//5次200ms即为1s到
55{
56num1=0;
57num++;
58if(num==60)
59num=0;
60shi=num/10;
61ge = num%10;
62}
63 }
64
65
66 void Delay5ms()//@12.000MHz
67 {
68unsigned char i, j;
69
70i = 59;
71j = 90;
72do
73{
74while (--j);
75} while (--i);
76 }


    推荐阅读