?? 鬼影燈.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 + -