📄 鬼影灯.lst
字号:
C51 COMPILER V8.02 鬼影灯 04/04/2008 17:53:45 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 鬼影灯
OBJECT MODULE PLACED IN 鬼影灯.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 程序\鬼影灯.c BROWSE DEBUG OBJECTEXTEND PRINT(.\鬼影灯.lst) OBJECT(鬼影灯.o
-bj)
line level source
1 /*
2
3 鬼 影 灯
4
5 功能:P1口外接的八个LED发出的光达到流动拖影的效果
6
7 说明:利用PWM和移位运算设计,并利用人眼的视觉
8 暂留现象产生移动,并拖影的动态发光效果。
9
10 为实现本程序的功能,几乎采用了穷举的方法,
11 例举出各个时段的赋值情况,才掌握规律,比
12 较笨拙。虽然实现了预想的结果,但一定可以
13 有更好的方法实现,希望大家尝试并互相交流。
14
15
16 (C)西安电子科技大学 测控技术与仪器 编写:郭世忠 2008/03/14
17 */
18
19 #include<reg52.h> //51寄存器头文件
20
21 void Delayms(int ms);//函数声明
22
23
24
25 void main(void) //主程序
26 {
27 1
28 1 unsigned char k,j,LED; //定义变量
29 1 int i; //有关i的运算出现负值,如果定义成无符号会越界
30 1
31 1
32 1 while(1) //死循环,单片机程序必须是一个死循环
33 1 {
34 2
35 2 /*********************以下为正序方向移动 低位到高位***********************/
36 2
37 2 for(i=0;i<16;i++) // 循环16次,移动16位
38 2 {
39 3 for(j=0;j<120;j++) //重复数次 削除发光抖动 可决定运动快慢
40 3 {
41 4 if(i<8)
42 4 {LED=0xfe<<i;}
43 4 else
44 4 {
45 5 LED=~(0xff<<(i-8));
46 5 }
47 4 for(k=0;k<8;k++) //循环8次
48 4 {
49 5 if(k<(8-i)) //8-i个直接赋值
50 5 {P1=LED;}
51 5 else
52 5 { //i个移位赋值
53 6 LED=0x01|(LED<<1)|LED; //从低位依次补1
54 6 P1=LED;
C51 COMPILER V8.02 鬼影灯 04/04/2008 17:53:45 PAGE 2
55 6 }
56 5 }
57 4
58 4 }
59 3 }
60 2
61 2 Delayms(300);//短暂延时,便于区分起始状态
62 2
63 2
64 2 /*********************以下为逆序方向移动 高位到低位***********************/
65 2
66 2 for(i=0;i<16;i++) //逆序方向移动 循环16次,移动16位
67 2 {
68 3 for(j=0;j<120;j++) //重复数次 削除发光抖动 可决定运动快慢
69 3 {
70 4 if(i<8)
71 4 {LED=0x7f>>i;}
72 4 else
73 4 {
74 5 LED=~(0xff>>(i-8));
75 5 }
76 4 for(k=0;k<8;k++) //循环8次
77 4 {
78 5 if(k<(8-i)) //8-i个直接赋值
79 5 {P1=LED;}
80 5 else
81 5 {
82 6 P1=LED; //i个移位赋值
83 6 LED=0x80|(LED>>1)|LED; //从高位依次补1
84 6 }
85 5 }
86 4
87 4
88 4 }
89 3
90 3 }
91 2 Delayms(300); //短暂延时,便于区分起始状态
92 2 }
93 1
94 1 }
95
96 /****************************************************************************
97 * 名 称:Delayms()
98 * 功 能:延迟1ms
99 * 入口参数:ms: 延迟毫秒数
100 * 出口参数:无
101 * 说 明: 11.0592MHz条件下
102 ****************************************************************************/
103 void Delayms(int ms)
104 {
105 1 unsigned int i;
106 1 for(;ms>0;ms--) //循环ms次
107 1 {
108 2 for(i=0;i<113;i++); //每次1ms延迟@ 11.0592MHz
109 2 }
110 1 }
111
112
113
114
115 /*********************** I/O口输出状态对应表*************************
116
C51 COMPILER V8.02 鬼影灯 04/04/2008 17:53:45 PAGE 3
117 对应P1口
118 7654 3210
119
120 1111 1110 0+0+0+0 0+0+0+8次
121 1111 1110
122 1111 1110
123 1111 1110 第一位最亮 i=0
124 1111 1110
125 1111 1110 进组
126 1111 1110
127 1111 1110
128
129 1111 1100 0+0+0+0 0+0+8+7次
130 1111 1100
131 1111 1100
132 1111 1100 第二位最亮 i=1
133 1111 1100
134 1111 1100
135 1111 1100
136 1111 1101
137
138 1111 1000 0+0+0+0 0+8+7+6次
139 1111 1000
140 1111 1000
141 1111 1000 第三位最亮 i=2
142 1111 1000
143 1111 1000
144 1111 1001
145 1111 1011
146
147 1111 0000 0+0+0+0 8+7+6+5次
148 1111 0000
149 1111 0000
150 1111 0000 第四位最亮 i=3
151 1111 0000
152 1111 0001
153 1111 0011
154 1111 0111
155
156 1110 0000 0+0+0+8 7+6+5+4次
157 1110 0000
158 1110 0000
159 1110 0000 第五位最亮 i=4
160 1110 0001
161 1110 0011
162 1110 0111
163 1110 1111
164
165 1100 0000 0+0+8+7 6+5+4+3次
166 1100 0000
167 1100 0000
168 1100 0001 第六位最亮 i=5
169 1100 0011
170 1100 0111
171 1100 1111
172 1101 1111
173
174 1000 0000 0+8+7+6 5+4+3+2次
175 1000 0000
176 1000 0001
177 1000 0011 第七位最亮 i=6
178 1000 0111
C51 COMPILER V8.02 鬼影灯 04/04/2008 17:53:45 PAGE 4
179 1000 1111
180 1001 1111
181 1011 1111
182
183 0000 0000 8+7+6+5 4+3+2+1次
184 0000 0001
185 0000 0011
186 0000 0111 第八位最亮 i=7
187 0000 1111
188 0001 1111
189 0011 1111
190 0111 1111
191 ----------------------------------------
192 0000 0001
193 0000 0011 P1=LED;
194 0000 0111 LED=0x01|LED|(LED<<1);
195 0000 1111
196 0001 1111 出组
197 0011 1111 8
198 0111 1111
199 1111 1111
200
201 0000 0011
202 0000 0111
203 0000 1111
204 0001 1111 9
205 0011 1111
206 0111 1111
207 1111 1111
208 1111 1111
209
210 0000 0111
211 0000 1111
212 0001 1111 10
213 0011 1111
214 0111 1111
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -