📄 鬼影灯.c
字号:
/*
鬼 影 灯
功能:P1口外接的八个LED发出的光达到流动拖影的效果
说明:利用PWM和移位运算设计,并利用人眼的视觉
暂留现象产生移动,并拖影的动态发光效果。
为实现本程序的功能,几乎采用了穷举的方法,
例举出各个时段的赋值情况,才掌握规律,比
较笨拙。虽然实现了预想的结果,但一定可以
有更好的方法实现,希望大家尝试并互相交流。
(C)西安电子科技大学 测控技术与仪器 编写:郭世忠 2008/03/14
*/
#include<reg52.h> //51寄存器头文件
void Delayms(int ms);//函数声明
void main(void) //主程序
{
unsigned char k,j,LED; //定义变量
int i; //有关i的运算出现负值,如果定义成无符号会越界
while(1) //死循环,单片机程序必须是一个死循环
{
/*********************以下为正序方向移动 低位到高位***********************/
for(i=0;i<16;i++) // 循环16次,移动16位
{
for(j=0;j<120;j++) //重复数次 削除发光抖动 可决定运动快慢
{
if(i<8)
{LED=0xfe<<i;}
else
{
LED=~(0xff<<(i-8));
}
for(k=0;k<8;k++) //循环8次
{
if(k<(8-i)) //8-i个直接赋值
{P1=LED;}
else
{ //i个移位赋值
LED=0x01|(LED<<1)|LED; //从低位依次补1
P1=LED;
}
}
}
}
Delayms(300);//短暂延时,便于区分起始状态
/*********************以下为逆序方向移动 高位到低位***********************/
for(i=0;i<16;i++) //逆序方向移动 循环16次,移动16位
{
for(j=0;j<120;j++) //重复数次 削除发光抖动 可决定运动快慢
{
if(i<8)
{LED=0x7f>>i;}
else
{
LED=~(0xff>>(i-8));
}
for(k=0;k<8;k++) //循环8次
{
if(k<(8-i)) //8-i个直接赋值
{P1=LED;}
else
{
P1=LED; //i个移位赋值
LED=0x80|(LED>>1)|LED; //从高位依次补1
}
}
}
}
Delayms(300); //短暂延时,便于区分起始状态
}
}
/****************************************************************************
* 名 称:Delayms()
* 功 能:延迟1ms
* 入口参数:ms: 延迟毫秒数
* 出口参数:无
* 说 明: 11.0592MHz条件下
****************************************************************************/
void Delayms(int ms)
{
unsigned int i;
for(;ms>0;ms--) //循环ms次
{
for(i=0;i<113;i++); //每次1ms延迟@ 11.0592MHz
}
}
/*********************** I/O口输出状态对应表*************************
对应P1口
7654 3210
1111 1110 0+0+0+0 0+0+0+8次
1111 1110
1111 1110
1111 1110 第一位最亮 i=0
1111 1110
1111 1110 进组
1111 1110
1111 1110
1111 1100 0+0+0+0 0+0+8+7次
1111 1100
1111 1100
1111 1100 第二位最亮 i=1
1111 1100
1111 1100
1111 1100
1111 1101
1111 1000 0+0+0+0 0+8+7+6次
1111 1000
1111 1000
1111 1000 第三位最亮 i=2
1111 1000
1111 1000
1111 1001
1111 1011
1111 0000 0+0+0+0 8+7+6+5次
1111 0000
1111 0000
1111 0000 第四位最亮 i=3
1111 0000
1111 0001
1111 0011
1111 0111
1110 0000 0+0+0+8 7+6+5+4次
1110 0000
1110 0000
1110 0000 第五位最亮 i=4
1110 0001
1110 0011
1110 0111
1110 1111
1100 0000 0+0+8+7 6+5+4+3次
1100 0000
1100 0000
1100 0001 第六位最亮 i=5
1100 0011
1100 0111
1100 1111
1101 1111
1000 0000 0+8+7+6 5+4+3+2次
1000 0000
1000 0001
1000 0011 第七位最亮 i=6
1000 0111
1000 1111
1001 1111
1011 1111
0000 0000 8+7+6+5 4+3+2+1次
0000 0001
0000 0011
0000 0111 第八位最亮 i=7
0000 1111
0001 1111
0011 1111
0111 1111
----------------------------------------
0000 0001
0000 0011 P1=LED;
0000 0111 LED=0x01|LED|(LED<<1);
0000 1111
0001 1111 出组
0011 1111 8
0111 1111
1111 1111
0000 0011
0000 0111
0000 1111
0001 1111 9
0011 1111
0111 1111
1111 1111
1111 1111
0000 0111
0000 1111
0001 1111 10
0011 1111
0111 1111
1111 1111
1111 1111
1111 1111
0000 1111
0001 1111
0011 1111
0111 1111 11
1111 1111
1111 1111
1111 1111
1111 1111
0001 1111
0011 1111
0111 1111
1111 1111 12
1111 1111
1111 1111
1111 1111
1111 1111
0011 1111
0111 1111
1111 1111
1111 1111 13
1111 1111
1111 1111
1111 1111
1111 1111
0111 1111
1111 1111
1111 1111
1111 1111
1111 1111 14
1111 1111
1111 1111
1111 1111
1111 1111
1111 1111
1111 1111 //0+0+0+0 0+0+0+0次
1111 1111
1111 1111
1111 1111 15
1111 1111
1111 1111
*/
//========================================
// 反向移动时序
//========================================
/*
0111 1111
0111 1111
0111 1111 i=0
0111 1111
0111 1111
0111 1111
0111 1111
0111 1111
0011 1111
0011 1111
0011 1111
0011 1111 i=1
0011 1111
0011 1111
0011 1111
1011 1111
0001 1111
0001 1111
0001 1111
0001 1111 i=2
0001 1111
0001 1111
1001 1111
1101 1111
0000 1111
0000 1111
0000 1111
0000 1111 i=3
0000 1111
1000 1111
1100 1111
1110 1111
0000 0111
0000 0111
0000 0111
0000 0111 i=4
1000 0111
1100 0111
1110 0111
1111 0111
0000 0011
0000 0011
0000 0011
1000 0011 i=5
1100 0011
1110 0011
1111 0011
1111 1011
0000 0001
0000 0001
1000 0001
1100 0001
1110 0001 i=6
1111 0001
1111 1001
1111 1101
0000 0000
1000 0000
1100 0000
1110 0000
1111 0000 i=7
1111 1000
1111 1100
1111 1110
1000 0000
1100 0000
1110 0000
1111 0000
1111 1000 i=8
1111 1100
1111 1110
1111 1111
1100 0000
1110 0000
1111 0000
1111 1000
1111 1100 i=9
1111 1110
1111 1111
1111 1111
1110 0000
1111 0000
1111 1000
1111 1100
1111 1110 i=10
1111 1111
1111 1111
1111 1111
1111 0000
1111 1000
1111 1100
1111 1110
1111 1111 i=11
1111 1111
1111 1111
1111 1111
1111 1000
1111 1100
1111 1110
1111 1111
1111 1111 i=12
1111 1111
1111 1111
1111 1111
1111 1100
1111 1110
1111 1111
1111 1111
1111 1111 i=13
1111 1111
1111 1111
1111 1111
1111 1110
1111 1111
1111 1111
1111 1111
1111 1111 i=14
1111 1111
1111 1111
1111 1111
1111 1111
1111 1111
1111 1111
1111 1111
1111 1111 i=15
1111 1111
1111 1111
1111 1111
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -