1 /*
2 该程序的功能:
3 利用动态扫描和定时器1在数码管上显示出从765432开始,
4 以1/10秒的速度往下递减直至765398并保持显示此数,,
5 与此同时利用定时器0以500MS速度进行流水灯从上至下移动,
6 当数码管上数减到停止时,实验板上流水灯也停止然后全部开始闪烁,
7 3秒后(用T0定时)流水灯全部关闭、数码管上显示出“HELLO”。到此保持住。
8 */
9 #include <reg52.h>
10 #include <intrins.h>
11 #define uchar unsigned char
12 #define uint unsigned int
13 sbit dula=P2^6;
14 sbit wela=P2^7;
15 uchar code table[]={
16 0x3f,0x06,0x5b,0x4f,
17 0x66,0x6d,0x7d,0x07,
18 0x7f,0x6f,0x77,0x7c,
19 0x39,0x5e,0x79,0x71,
20 0x76,0x79,0x38,0x3f,0}; //后面几个表示为hello这个字母的编码
21 uchar temp,t0,t1,bai,shi,ge,flag,flag1;
22 uint shu;
23 void init();
24 void display(uchar,uchar,uchar,uchar,uchar,uchar);
25 void delay(uint z)
26 {
27 uint t1,y;
28 for(t1=z;t1>0;t1--)
29 for(y=110;y>0;y--);
30 }
31 void main()
32 {
33 init();
34 while(1)
35 {
36 if(flag1!=1) //如果标志位flag 不为1 时,也就是数码管换依旧保持着 765398 这个数字
37 display(7,6,5,bai,shi,ge);
38 else // flag1标志位为1时,流水灯也已经闪过三秒,此时显示 hello
39 display(16,17,18,18,19,20); //直接用写在编码table中的数据 H表示编码中的第16个数,以此类推
40 }
41 }
42
43 void init()
44 {
45 shu=432; //数的初值
46 temp=0xfe;
47 P1=temp;
48 TMOD=0x11;
49 TH0=(65536-50000)/256;
50 TL0=(65536-50000)%256;
51 TH1=(65536-50000)/256;
52 TL1=(65536-50000)%256;
53 EA=1;
54 ET0=1;
55 ET1=1;
56 TR0=1;
57 TR1=1;
58 }
59
60 void timer0() interrupt 1
61 {
62 TH0=(65536-50000)/256;
63 TL0=(65536-50000)%256;
64 t0++;
65 if(flag!=1) //这个flag 表示如果数码管上的数还没有从432减到398时,执行下面程序
66 {
67 if(t0==10)
68 {
69 t0=1;
70 temp=_crol_(temp,1);
71 P1=temp;
72 }
73 }
74 else //如果减到了398的时候,开始执行下面的程序
75 {
76 if(t0%4==0) // 表示 每200ms闪烁 led灯闪烁一次 也就说当遇到4的整数倍时,P1口的灯就会变化
77 P1=~P1;
78 if(t0==60) //表示定时满足3秒时, 50ms * 60 = 3S
79 {
80 TR0=0; // 当3秒后,定时器0停止计数
81 P1=0xff;//P1口全为高电平,关闭流水灯
82 flag1=1; //关闭流水灯的同时,使得标志位 flag1 为1
83 }
84 }
85 }
86
87 void timer1() interrupt 3
88 {
89 TH1=(65536-50000)/256;
90 TL1=(65536-50000)%256;
91 t1++;
92 if(t1==2)
93 {
94 t1=0;
95 shu--;
96 bai=shu/100; //取出后三位数
97 shi=shu%100/10;
98 ge=shu%10;
99 if(shu==398)
100 {
101 TR0=0;
102 TH0=(65536-50000)/256; //此处的TH0和TL0表示再次设定初值,定时为3秒;用于满足当数从432减到398这个要求后,流水灯不在流动,并且要闪烁三秒
103 TL0=(65536-50000)%256;
104 TR0=1;
105 flag=1;//用于表示设定初值开始3秒定时的启动
106 t0=0; //由于t0中本来就有初值,故而将其复位为0
107 P1=0xff;//关闭所有的流水灯
108 TR1=0; //定时器1停止工作
109 }
110 }
111 }
112
113 void display(uchar aa,uchar bb,uchar cc,uchar ba,uchar sh,uchar g)
114 {
115 dula=1;
116 P0=table[aa];
117 dula=0;
118 P0=0xff;
119 wela=1;
120 P0=0xfe;
121 wela=0;
122 delay(1);
123
124 dula=1;
125 P0=table[bb];
126 dula=0;
127 P0=0xff;
128 wela=1;
129 P0=0xfd;
130 wela=0;
131 delay(1);
132
133 dula=1;
134 P0=table[cc];
135 dula=0;
136 P0=0xff;
137 wela=1;
138 P0=0xfb;
139 wela=0;
140 delay(1);
141 dula=1;
142 P0=table[ba];
143 dula=0;
144 P0=0xff;
145 wela=1;
146 P0=0xf7;
147 wela=0;
148 delay(1);
149
150 dula=1;
151 P0=table[sh];
152 dula=0;
153 P0=0xff;
154 wela=1;
155 P0=0xef;
156 wela=0;
157 delay(1);
158
159 dula=1;
160 P0=table[g];
161 dula=0;
162 P0=0xff;
163 wela=1;
164 P0=0xdf;
165 wela=0;
166 delay(1);
167 }