亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? meteor.c.bak

?? LED控制
?? BAK
字號:
/****************************************Copyright (c)****************************************************
**                                  LED Incorporated Co.,LTD.
**
**                                   http://www.ledinc.biz
**
**------------------------------------- File Info --------------------------------------------------------
** File Name   : Meteor.c
** Hardware    : MCU = AT89C2051; Fosc = 24MHz
** Compiler    : C51 
**
**------------------------------------ Version Info ------------------------------------------------------
** Create By   : Raymond
** Create Date : 09-04-09
** Version     : 1.00
** Description : 
**	1. 隨機速度、流星長度;
**	2. 定時器0產生隨機種子;
**	3. 淡入淡出效果;
**	4. 梯形算法產生流星頭亮尾暗的效果;
**	5. 發現問題:亮度不夠,因為每次都是等所有的LED滅了以后再移位的,總體上看LED點亮的時間比列不高。
**--------------------------------------------------------------------------------------------------------
** Modify By   : Raymond
** Modify Date : 09-04-13
** Version     : 1.01
** Description :
**	1. 解決梯形算法的一個bug:當流星長度Len為1時,除數(Len-1)為零;
**	2. 移位應該進行16+1次,不然最后1bit會殘留在流星管上,這在Len=1時表現突出;
**	3. 隨機函數有待改進,發現Len=1的重復周期總在6次到8次左右;
**--------------------------------------------------------------------------------------------------------
** Modify By   : Raymond
** Modify Date : 09-04-13
** Version     : 2.00
** Description :
**	1. 優化梯形算法(多米諾骨牌算法,Domino),增加亮度以及平滑度;
**	2. 改進隨機函數,使輸出數據更加隨機;
**
**--------------------------------------------------------------------------------------------------------
** Modify By   : Raymond
** Modify Date : 09-04-15
** Version     : 2.01
** Description :
**	1. 從STC12C4510AD移植到AT89C2051,管腳有變化,且STC是1T時鐘,更快,定時相關的需要修改;
**	2. 當隨機算法相同時,偽隨機數的種子決定出現的隨機數;
**	3. 修改軟件,使用捕捉RC充電常數來決定隨機種子,硬件方面把RC中的電容接到Vcc,電阻接到GND,RC節點連到INT1
**	即外部中斷1,使用下降沿觸發,捕捉定時器0(因為是8位隨機數,故只捕捉TL0);當RC值足夠大時,實際效果可以做到
**	每次上電后的第一次都不一樣,即硬件非偽隨機。
**
**--------------------------------------------------------------------------------------------------------
** Modify By   : Raymond
** Modify Date : 09-04-16
** Version     : 2.02
** Description :
**	1. 細調時間參數、增加閃爍間隔時間的隨機數量;
**
*********************************************************************************************************/

#include 	"reg51.h"
#include	<stdio.h>

#define		uchar  unsigned  char
#define		uint   unsigned  int
#define		NOP()	/*Delay(1)	*/
#define		EnableInterrupt()	EA = 1
#define		DisableInterrupt()	EA = 0

/*  PIN define  */
sbit  LATCH	=	P3^0;
sbit  CLK	=	P3^1;
sbit  SDA	=	P3^2;


typedef struct{
	unsigned char	MeteorLen;						//流星長度
	unsigned char	Speed;							//下降速度,數組越大速度越慢
} METEOR;

//-------------Config Parameter-------------
#define		SPEED_MAX_GRAD		8
#define		LEN_MAX_GRAD		5
#define		INTERVAL_MAX_GRAD	10

#define		METEOR_MAX_NUM		(5*10)

//-------------Global Variables-------------
METEOR	code MeteorTable[METEOR_MAX_NUM] = {
	{1,40}, {1,50}, {1,60}, {1,70}, {1,80}, 
	{2,15}, {2,20}, {2,20}, {2,25}, {2,30}, 
	{3,10}, {3,12}, {3,15}, {3,17}, {3,20}, 
	{4,7}, {4,10}, {4,13}, {4,17}, {4,20}, 
	{5,5}, {5,8}, {5,11}, {5,4}, {5,18}, 
	{6,4},  {6,7}, {6,10}, {6,13}, {6,16},
	{7,4},  {7,6},  {7,8}, {7,10}, {7,12},  
	{8,2},  {8,4},  {8,7},  {8,9},  {8,9}, 
	{9,1},  {9,3},  {9,5},  {9,7},  {9,8},
	{10,1}, {10,3}, {10,5}, {10,6}, {10,7}
};
unsigned char code DispTable[LEN_MAX_GRAD] = {0x0F, 0x1F, 0x3F, 0x7F, 0xFF}; 
													//length table, 4 grads of length
unsigned char code IntervalTable[INTERVAL_MAX_GRAD] = {20, 40, 60, 80, 100, 120, 140, 160, 180, 200};							
													//interval table						

unsigned char FlagRandStarted;
unsigned char RAND_SEED;							//the random seed, to generate a random number

unsigned char Cnt10ms, Cnt10us;	
#define		CNT10MS	20000
#define		CNT1US	35

//-------------Function define-------------
void   SPI_SendWord(unsigned int);

/*********************************************************************************************************
** Function    : Delay
** Input       : t
** Output      : none
** Return      : none
** Description : Delay. soft delay
**
*********************************************************************************************************/
void  Delay(uchar t)
{
	uint j;
	while(t--){
		j = 1000;
		while(j--);
	}	
}  								  

/*********************************************************************************************************
** Function    : RandomStart
** Input       : none
** Output      : none
** Return      : none
** Description : Initialize the random seed, select TIMER0 as the source
**
*********************************************************************************************************/
void RandomStart(void)
{
	char i;
	FlagRandStarted = 0;
	TL0 = 0;
	TH0 = 0;
	RAND_SEED = 0;
    TR0 = 1;      				//startup TIMER0
	IT1 = 1;					//falling edge active (edge triggered)
	EX1 = 1;
	EA = 1;

	i = 0;
	while(!FlagRandStarted){
	 	Delay(1);
		SPI_SendWord(0x0000);
		if(++i>100){ 			//超時,沒有RC充電電路
			RAND_SEED = TL0;
			SPI_SendWord(0xFFFF);
		 	Delay(50);
			break;
		}
	}

	//RAND_SEED = 11;	

	EX1 = 0;
	EA = 0;
 	TR0 = 0;      				//stop TIMER0
}

/*********************************************************************************************************
** Function    : ISR_INT1
** Input       : none
** Output      : none
** Return      : none
** Description : Interrupt Serve Routine for External Interrupt 1. 
**	use for initialize the random seed with TL0
**
*********************************************************************************************************/
void ISR_INT1(void) interrupt 2
{
	RAND_SEED = TL0;			//initialize the random seed
	FlagRandStarted = 1;	
}

/*********************************************************************************************************
** Function    : Random
** Input       : none
** Output      : none
** Return      : A random number
** Description : Get a random number, 8 bit integer
**
*********************************************************************************************************/
unsigned char Random(void)
{
	//RAND_SEED = TL0;
	RAND_SEED = RAND_SEED*13 + 3;
	return(RAND_SEED);
}

/*********************************************************************************************************
** Function    : Port_Init
** Input       : none
** Output      : none
** Return      : none
** Description : Initialize the IO port
**
*********************************************************************************************************/
void Port_Init(void)
{
	LATCH = 0;
	CLK = 0;
	SDA = 0;	
}	 	

/*********************************************************************************************************
** Function    : Delay10ms
** Input       : t
** Output      : none
** Return      : none
** Description : Delay 10*t ms. Use TIMER1, Mode 1(16 bit)
**
*********************************************************************************************************/
void  Delay10ms(uchar t)
{
	if(t==0) return;
	Cnt10ms = t;
    TH1 = (65536-CNT10MS)/256;							// 8MHz,1T,8000個時鐘周期,定時時間為1ms
    TL1 = (65536-CNT10MS)%256;	
    
    TF1 = 0;
    TR1 = 1;										// 開定時器
	ET1   = 1;       								// 允許定時器1中斷   
    while(Cnt10ms);
    TR1 = 0;										// 關定時器1
	ET1   = 0;       								// 禁止定時器1中斷   
}

/*********************************************************************************************************
** Function    : Delay10us
** Input       : t
** Output      : none
** Return      : none
** Description : Delay 10*t us. Use TIMER0, Mode 2(8 bit autoload)
**
*********************************************************************************************************/
void  Delay10us(uchar t)
{
	if(t==0) return;
	Cnt10us = t;
    TH0 = (256-CNT1US);								// 2MHz,1T,80個時鐘周期,定時時間為10us
    TF0 = 0;									   
    TR0 = 1;      								// 開定時器
	ET0   = 1;      								// 允許定時器0中斷   
    while(Cnt10us);
    TR0 = 0;										// 關定時器0
	ET0   = 0;       								// 禁止定時器0中斷   
}

/*********************************************************************************************************
** Function    : ISR_Timer0
** Input       : none
** Output      : none
** Return      : none
** Description : Interrupt Serve Routine for TIMER0. 
**   TIMER0 config as Mode 2(8 bit autoload), clock is 
**
*********************************************************************************************************/
void ISR_Timer0(void) interrupt 1
{
	TF0 = 0;
	if(Cnt10us>0){ 
		Cnt10us--;	
	}
}

/*********************************************************************************************************
** Function    : ISR_Timer1
** Input       : none
** Output      : none
** Return      : none
** Description : Interrupt Serve Routine for TIMER1. 
**   TIMER1 config as Mode 1(16 bit), clock is 
**
*********************************************************************************************************/
void ISR_Timer1(void) interrupt 3 
{
	TF1 = 0;
    
	TH1 = (65536-CNT10MS)/256;							//8MHz,1T,8000個時鐘周期,定時時間為1ms
    TL1 = (65536-CNT10MS)%256;	
	
	if(Cnt10ms>0){  
		Cnt10ms--;	
	}
}

/*********************************************************************************************************
** Function    : Timer_Init
** Input       : none
** Output      : none
** Return      : none
** Description : Initialize the timers(TIMER0 and TIMER1)
**
*********************************************************************************************************/
void Timer_Init(void)
{	
	//AUXR |= 0xC0;    //T0,T1速度為12倍標準51 
	TMOD |=	0x12;		// 定時器0為8位自動重裝計數器,定時器1為16位計數器

	//TF0 = 0;
	//TF1 = 0;
    //TR0 = 1;      									// 開定時器
	//ET0   = 1;       //  允許定時器0中斷   
	//ET1   = 1;       //  允許定時器1中斷   
}

/*********************************************************************************************************
** Function    : SPI_SendWord
** Input       : Data -> data to be sent 
** Output      : none
** Return      : none
** Description : Send a 16 bit data by the SPI interface(soft SPI)
**
*********************************************************************************************************/
void SPI_SendWord(uint Data)
{
	uchar i, Buf;
	LATCH = 0;	
	Buf = (uchar)(Data>>8);				//High byte	  
	for(i = 0; i < 8; i++){			   
		CLK = 0;
		if(Buf & 0x80) {
			SDA = 1;	
		} else {
			SDA = 0;	
		}
		CLK = 1;	 
		Buf <<= 1;	 
		NOP();		 
	}
	Buf = (uchar)Data;					//Low byte	  
	for(i = 0; i < 8; i++){			   
		CLK = 0;
		if(Buf & 0x80) {
			SDA = 1;	
		} else {
			SDA = 0;	
		}
		CLK = 1;
		Buf <<= 1;	 
		NOP();		 
	}
	LATCH = 1;     	 
}

#define		Tmax	4	 
 
/*********************************************************************************************************
** Function    : Flash
** Input       : none 
** Output      : none
** Return      : none
** Description : Display one time of meteor falling
**
*********************************************************************************************************/
void Flash(void)
{
	char i, j, k;
	unsigned char dT, DelayMax;
	unsigned char Speed, Len;						//the fall speed and the length of meteor
	unsigned char FlagOver;		
	unsigned int  DispBuf;
	unsigned char BitDelay[16], DelayBuf[16];
	
	i = Random() % METEOR_MAX_NUM;
	Len = MeteorTable[i].MeteorLen;							//get the falling speed of meteor 
	Speed = MeteorTable[i].Speed;
	
	/*******************
	Len = 3;
	Speed = 10;		  */
	/********************/
		
	DelayMax = Len*Tmax;	//????
	
	for(i = 0; i < 16; i++){
		BitDelay[i] = 0;
	}
	BitDelay[0] = DelayMax;
	if(Len == 1){
		dT = Tmax - 1;
	} else {
		dT = Tmax;
	}
	//dT = 5;
	FlagOver = 0;
	
	while(1){
		
		for(j = 0; j < 16; j++){
			if(BitDelay[j] > 0){
				BitDelay[j]--;
			}
		}
		//for(j = 0; j < 16; j++){	//注意數組越界
		for(j = 0; j < 15; j++){
			if( BitDelay[j] == DelayMax-dT){
				BitDelay[j+1] = DelayMax;				//觸發下一位
			}
			DelayBuf[j] = BitDelay[j];
		}
		DelayBuf[15] = BitDelay[15];
		
		if(BitDelay[15] == DelayMax){					//MSB開始點亮
			FlagOver = 1;
		}
		if(FlagOver & (BitDelay[15] == 0)){			//MSB熄滅
			break;	
		}
	
		for(j = 0; j < DelayMax; j++){
			DispBuf = 0;
			for(k = 0; k < 16; k++){
				if(DelayBuf[k]>0){
					DelayBuf[k]--;
					DispBuf |= (1 << k);
				}
			}
			SPI_SendWord(DispBuf);
			Delay10us(Speed);	//control the falling speed of meteor
			
		}
	}
	SPI_SendWord(0x0000);							//clear display	
}

/*********************************************************************************************************
** Function    : IntervalBetweenFlash
** Input       : none 
** Output      : none
** Return      : none
** Description : Delay a certain time between two flash
**
*********************************************************************************************************/
void IntervalBetweenFlash(void)
{
	unsigned char i;
	unsigned char Interval;							//the interval between the two meteor-falling
	
	i = Random() % INTERVAL_MAX_GRAD;				//get the index of the interval table 
	Interval = IntervalTable[i];					//40~200
	Delay10ms(Interval);
	Delay10ms(Interval);
}			  

/*********************************************************************************************************
** Function    : main
** Input       : none 
** Output      : none
** Return      : none
** Description : the main function that is a endless loop
**
*********************************************************************************************************/
void main(void)
{
	RandomStart();
	Port_Init();
	SPI_SendWord(0x0000);		//Clear display
	Timer_Init();
	EnableInterrupt();
	
	while(1)
	{
		Flash();
		IntervalBetweenFlash();
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美日本在线| 日韩毛片高清在线播放| 欧美精品一区二区在线观看| 久久精品人人做人人爽人人| 亚洲精品久久嫩草网站秘色| 麻豆精品视频在线| 91亚洲国产成人精品一区二区三| 欧美理论片在线| 国产精品视频线看| 天天爽夜夜爽夜夜爽精品视频| 国产成人午夜精品5599| 欧美视频一区二区三区| 亚洲欧洲成人精品av97| 日本不卡中文字幕| 91精品办公室少妇高潮对白| 久久久久久久久久看片| 日韩中文字幕区一区有砖一区| www.日韩大片| 中文字幕+乱码+中文字幕一区| 久久国产尿小便嘘嘘| 91.麻豆视频| 亚洲福利国产精品| 欧美唯美清纯偷拍| 亚洲五码中文字幕| 欧美v国产在线一区二区三区| 丝瓜av网站精品一区二区| 欧美在线不卡视频| 亚洲综合av网| 欧美日韩一区视频| 亚洲成人动漫在线观看| 欧美日韩一区二区在线观看视频 | 久久久国产综合精品女国产盗摄| 偷拍一区二区三区四区| 欧美视频在线一区| 亚洲综合丝袜美腿| 欧美精品高清视频| 日本成人在线一区| 日韩欧美一区中文| 久久国产精品72免费观看| 精品噜噜噜噜久久久久久久久试看| 久久精品国产一区二区三| 亚洲精品在线观看视频| 国产一区二区h| 国产精品精品国产色婷婷| 99这里都是精品| 亚洲最大成人网4388xx| 欧美日韩精品一区二区三区| 日韩不卡一区二区| 亚洲成a天堂v人片| 男人的天堂久久精品| 91精品国产色综合久久| 日韩成人dvd| 2020国产精品久久精品美国| 国产精品羞羞答答xxdd| 国产精品女上位| 欧美吻胸吃奶大尺度电影| 蜜桃久久精品一区二区| 欧美国产欧美亚州国产日韩mv天天看完整| 成人一级视频在线观看| 亚洲综合一区二区| 精品国产一区二区三区久久影院| 国产成人av资源| 一区二区成人在线| 欧美精品一区二区三| 91影院在线观看| 精品一区二区三区在线视频| 国产精品久久久久久久午夜片| 欧美少妇bbb| 国产成人精品亚洲日本在线桃色| 一区二区三区中文字幕精品精品 | 国产精品主播直播| 亚洲欧洲中文日韩久久av乱码| 91精品国产91久久久久久最新毛片 | 欧美在线你懂得| 国产一区欧美一区| 亚洲色图第一区| 国产亚洲综合色| 欧美日韩成人在线一区| 成人毛片视频在线观看| 日本成人在线视频网站| 亚洲久本草在线中文字幕| 日韩欧美亚洲国产另类| 在线视频欧美区| 国产99久久久国产精品潘金网站| 天堂一区二区在线| 亚洲人成亚洲人成在线观看图片| 日韩手机在线导航| 欧美日韩免费一区二区三区视频| 成人一区二区三区视频在线观看| 日韩电影在线观看电影| 一区二区三区四区不卡在线 | 欧美日韩国产123区| 91影院在线免费观看| 国产精品一线二线三线| 日韩二区三区在线观看| 亚洲一区影音先锋| 亚洲视频在线一区二区| 日本一区二区三区视频视频| 亚洲精品一区二区三区蜜桃下载 | 亚洲国产中文字幕| 亚洲欧美色图小说| 国产精品女上位| 国产欧美va欧美不卡在线| 久久久影院官网| 精品国产凹凸成av人导航| 日韩欧美一区在线| 日韩视频123| 7777精品久久久大香线蕉| 欧美在线观看视频一区二区| 91香蕉国产在线观看软件| 成人免费毛片a| 国产99久久久国产精品潘金| 国产成人免费av在线| 国产99久久久久| 成人污污视频在线观看| 成人午夜大片免费观看| 成人av动漫在线| 91麻豆高清视频| 91在线视频观看| 欧美专区亚洲专区| 欧美日韩国产综合视频在线观看| 欧美日韩视频在线一区二区| 欧美性感一类影片在线播放| 在线免费视频一区二区| 日本道色综合久久| 欧美美女直播网站| 欧美一二区视频| 国产婷婷色一区二区三区四区| 欧美激情一区二区三区| 亚洲欧洲精品成人久久奇米网| 亚洲精品日韩专区silk| 亚洲一区二区三区精品在线| 天天色 色综合| 久久99精品国产.久久久久久 | 亚洲成av人综合在线观看| 日韩高清一区二区| 国产麻豆视频一区二区| 91亚洲精品久久久蜜桃网站| 欧美绝品在线观看成人午夜影视| 日韩三级视频中文字幕| 中文字幕精品一区| 亚洲电影激情视频网站| 久久99国产精品尤物| 波多野结衣亚洲| 欧美精品777| 国产精品色婷婷| 五月天丁香久久| 国产成人免费av在线| 欧美三级日韩三级国产三级| 日韩欧美电影一区| 亚洲丝袜另类动漫二区| 免费成人小视频| 99国产精品国产精品久久| 91精品在线免费| 国产精品久久久久aaaa樱花| 欧美aaaaa成人免费观看视频| www.欧美精品一二区| 91精品黄色片免费大全| 国产精品的网站| 麻豆精品在线播放| 色呦呦一区二区三区| 精品久久人人做人人爽| 亚洲影院在线观看| 韩国v欧美v亚洲v日本v| 欧洲精品中文字幕| 国产精品久99| 国产精品一区二区不卡| 777奇米成人网| 最新日韩av在线| 国产乱对白刺激视频不卡| 欧美日韩中文国产| 欧美极品xxx| 国内精品久久久久影院一蜜桃| 欧美日韩国产综合久久| 亚洲视频一区在线观看| 国产成人免费网站| 日韩欧美一级在线播放| 亚洲福利电影网| 日本韩国精品在线| 国产精品国产三级国产普通话三级| 麻豆精品国产91久久久久久| 欧美日免费三级在线| 亚洲欧洲精品一区二区精品久久久| 国产一区二区91| 精品粉嫩aⅴ一区二区三区四区| 日韩影院精彩在线| 欧美亚洲高清一区二区三区不卡| 欧美韩日一区二区三区四区| 国产一区二区美女诱惑| 日韩欧美另类在线| 日本视频在线一区| 欧美精品在线一区二区三区| 亚洲综合丝袜美腿| 在线影视一区二区三区| 亚洲免费在线视频一区 二区| 99久久国产综合精品女不卡| 欧美激情资源网| 成人黄色在线看| 国产精品久久久久永久免费观看| 成人av网站在线观看|