/***************************************************
依次显示红粉蓝青四色渐变
****************************************************/
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define MAX_RANK 512
//外中断0
data uchar ColorStyle = 0; //色彩类型
data uchar EveryRecycleNum = 0; //每级已经循环次数
data int GrayRank = MAX_RANK; //当前灰度等级
data int TimerNum;
data uchar TotalRecycleNum = 1; //每级总的循环次数
bdata uchar Flag; //
sbit Dir = Flag^0; //方向标志,等于0表示渐亮,等于1表示渐暗
sbit JianBian = Flag^1; //等于1,继续执行渐变程序,等于0,跳出
sbit irq_flag = Flag^2;
sbit RED1 = P0^0;
sbit GRE1 = P0^1;
sbit BLU1 = P0^2;
sbit RED2 = P0^3;
sbit GRE2 = P0^4;
sbit BLU2 = P0^5;
void ClrColor(void);
void SendColor(void);
void SetTimer0(void);
code uchar TimeTable[] = //512等级,1.5起,每级0.012ms
{
0xfa,0x99,0xfa,0x8e,0xfa,0x83,0xfa,0x78,0xfa,0x6d,0xfa,0x62,0xfa,0x57,0xfa,0x4c,
0xfa,0x41,0xfa,0x36,0xfa,0x2b,0xfa,0x1f,0xfa,0x14,0xfa,0x9,0xf9,0xfe,0xf9,0xf3,
0xf9,0xe8,0xf9,0xdd,0xf9,0xd2,0xf9,0xc7,0xf9,0xbc,0xf9,0xb1,0xf9,0xa6,0xf9,0x9b,
0xf9,0x90,0xf9,0x85,0xf9,0x7a,0xf9,0x6f,0xf9,0x63,0xf9,0x58,0xf9,0x4d,0xf9,0x42,
0xf9,0x37,0xf9,0x2c,0xf9,0x21,0xf9,0x16,0xf9,0xb,0xf9,0x0,0xf8,0xf5,0xf8,0xea,
0xf8,0xdf,0xf8,0xd4,0xf8,0xc9,0xf8,0xbe,0xf8,0xb2,0xf8,0xa7,0xf8,0x9c,0xf8,0x91,
0xf8,0x86,0xf8,0x7b,0xf8,0x70,0xf8,0x65,0xf8,0x5a,0xf8,0x4f,0xf8,0x44,0xf8,0x39,
0xf8,0x2e,0xf8,0x23,0xf8,0x18,0xf8,0xd,0xf8,0x2,0xf7,0xf6,0xf7,0xeb,0xf7,0xe0,
0xf7,0xd5,0xf7,0xca,0xf7,0xbf,0xf7,0xb4,0xf7,0xa9,0xf7,0x9e,0xf7,0x93,0xf7,0x88,
0xf7,0x7d,0xf7,0x72,0xf7,0x67,0xf7,0x5c,0xf7,0x51,0xf7,0x46,0xf7,0x3a,0xf7,0x2f,
0xf7,0x24,0xf7,0x19,0xf7,0xe,0xf7,0x3,0xf6,0xf8,0xf6,0xed,0xf6,0xe2,0xf6,0xd7,
0xf6,0xcc,0xf6,0xc1,0xf6,0xb6,0xf6,0xab,0xf6,0xa0,0xf6,0x95,0xf6,0x8a,0xf6,0x7e,
0xf6,0x73,0xf6,0x68,0xf6,0x5d,0xf6,0x52,0xf6,0x47,0xf6,0x3c,0xf6,0x31,0xf6,0x26,
0xf6,0x1b,0xf6,0x10,0xf6,0x5,0xf5,0xfa,0xf5,0xef,0xf5,0xe4,0xf5,0xd9,0xf5,0xce,
0xf5,0xc2,0xf5,0xb7,0xf5,0xac,0xf5,0xa1,0xf5,0x96,0xf5,0x8b,0xf5,0x80,0xf5,0x75,
0xf5,0x6a,0xf5,0x5f,0xf5,0x54,0xf5,0x49,0xf5,0x3e,0xf5,0x33,0xf5,0x28,0xf5,0x1d,
0xf5,0x12,0xf5,0x6,0xf4,0xfb,0xf4,0xf0,0xf4,0xe5,0xf4,0xda,0xf4,0xcf,0xf4,0xc4,
0xf4,0xb9,0xf4,0xae,0xf4,0xa3,0xf4,0x98,0xf4,0x8d,0xf4,0x82,0xf4,0x77,0xf4,0x6c,
0xf4,0x61,0xf4,0x56,0xf4,0x4a,0xf4,0x3f,0xf4,0x34,0xf4,0x29,0xf4,0x1e,0xf4,0x13,
0xf4,0x8,0xf3,0xfd,0xf3,0xf2,0xf3,0xe7,0xf3,0xdc,0xf3,0xd1,0xf3,0xc6,0xf3,0xbb,
0xf3,0xb0,0xf3,0xa5,0xf3,0x9a,0xf3,0x8e,0xf3,0x83,0xf3,0x78,0xf3,0x6d,0xf3,0x62,
0xf3,0x57,0xf3,0x4c,0xf3,0x41,0xf3,0x36,0xf3,0x2b,0xf3,0x20,0xf3,0x15,0xf3,0xa,
0xf2,0xff,0xf2,0xf4,0xf2,0xe9,0xf2,0xde,0xf2,0xd2,0xf2,0xc7,0xf2,0xbc,0xf2,0xb1,
0xf2,0xa6,0xf2,0x9b,0xf2,0x90,0xf2,0x85,0xf2,0x7a,0xf2,0x6f,0xf2,0x64,0xf2,0x59,
0xf2,0x4e,0xf2,0x43,0xf2,0x38,0xf2,0x2d,0xf2,0x21,0xf2,0x16,0xf2,0xb,0xf2,0x0,
0xf1,0xf5,0xf1,0xea,0xf1,0xdf,0xf1,0xd4,0xf1,0xc9,0xf1,0xbe,0xf1,0xb3,0xf1,0xa8,
0xf1,0x9d,0xf1,0x92,0xf1,0x87,0xf1,0x7c,0xf1,0x71,0xf1,0x65,0xf1,0x5a,0xf1,0x4f,
0xf1,0x44,0xf1,0x39,0xf1,0x2e,0xf1,0x23,0xf1,0x18,0xf1,0xd,0xf1,0x2,0xf0,0xf7,
0xf0,0xec,0xf0,0xe1,0xf0,0xd6,0xf0,0xcb,0xf0,0xc0,0xf0,0xb5,0xf0,0xa9,0xf0,0x9e,
0xf0,0x93,0xf0,0x88,0xf0,0x7d,0xf0,0x72,0xf0,0x67,0xf0,0x5c,0xf0,0x51,0xf0,0x46,
0xf0,0x3b,0xf0,0x30,0xf0,0x25,0xf0,0x1a,0xf0,0xf,0xf0,0x4,0xef,0xf9,0xef,0xed,
0xef,0xe2,0xef,0xd7,0xef,0xcc,0xef,0xc1,0xef,0xb6,0xef,0xab,0xef,0xa0,0xef,0x95,
0xef,0x8a,0xef,0x7f,0xef,0x74,0xef,0x69,0xef,0x5e,0xef,0x53,0xef,0x48,0xef,0x3d,
0xef,0x31,0xef,0x26,0xef,0x1b,0xef,0x10,0xef,0x5,0xee,0xfa,0xee,0xef,0xee,0xe4,
0xee,0xd9,0xee,0xce,0xee,0xc3,0xee,0xb8,0xee,0xad,0xee,0xa2,0xee,0x97,0xee,0x8c,
0xee,0x81,0xee,0x75,0xee,0x6a,0xee,0x5f,0xee,0x54,0xee,0x49,0xee,0x3e,0xee,0x33,
0xee,0x28,0xee,0x1d,0xee,0x12,0xee,0x7,0xed,0xfc,0xed,0xf1,0xed,0xe6,0xed,0xdb,
0xed,0xd0,0xed,0xc5,0xed,0xb9,0xed,0xae,0xed,0xa3,0xed,0x98,0xed,0x8d,0xed,0x82,
0xed,0x77,0xed,0x6c,0xed,0x61,0xed,0x56,0xed,0x4b,0xed,0x40,0xed,0x35,0xed,0x2a,
0xed,0x1f,0xed,0x14,0xed,0x9,0xec,0xfd,0xec,0xf2,0xec,0xe7,0xec,0xdc,0xec,0xd1,
0xec,0xc6,0xec,0xbb,0xec,0xb0,0xec,0xa5,0xec,0x9a,0xec,0x8f,0xec,0x84,0xec,0x79,
0xec,0x6e,0xec,0x63,0xec,0x58,0xec,0x4d,0xec,0x41,0xec,0x36,0xec,0x2b,0xec,0x20,
0xec,0x15,0xec,0xa,0xeb,0xff,0xeb,0xf4,0xeb,0xe9,0xeb,0xde,0xeb,0xd3,0xeb,0xc8,
0xeb,0xbd,0xeb,0xb2,0xeb,0xa7,0xeb,0x9c,0xeb,0x90,0xeb,0x85,0xeb,0x7a,0xeb,0x6f,
0xeb,0x64,0xeb,0x59,0xeb,0x4e,0xeb,0x43,0xeb,0x38,0xeb,0x2d,0xeb,0x22,0xeb,0x17,
0xeb,0xc,0xeb,0x1,0xea,0xf6,0xea,0xeb,0xea,0xe0,0xea,0xd4,0xea,0xc9,0xea,0xbe,
0xea,0xb3,0xea,0xa8,0xea,0x9d,0xea,0x92,0xea,0x87,0xea,0x7c,0xea,0x71,0xea,0x66,
0xea,0x5b,0xea,0x50,0xea,0x45,0xea,0x3a,0xea,0x2f,0xea,0x24,0xea,0x18,0xea,0xd,
0xea,0x2,0xe9,0xf7,0xe9,0xec,0xe9,0xe1,0xe9,0xd6,0xe9,0xcb,0xe9,0xc0,0xe9,0xb5,
0xe9,0xaa,0xe9,0x9f,0xe9,0x94,0xe9,0x89,0xe9,0x7e,0xe9,0x73,0xe9,0x68,0xe9,0x5c,
0xe9,0x51,0xe9,0x46,0xe9,0x3b,0xe9,0x30,0xe9,0x25,0xe9,0x1a,0xe9,0xf,0xe9,0x4,
0xe8,0xf9,0xe8,0xee,0xe8,0xe3,0xe8,0xd8,0xe8,0xcd,0xe8,0xc2,0xe8,0xb7,0xe8,0xac,
0xe8,0xa0,0xe8,0x95,0xe8,0x8a,0xe8,0x7f,0xe8,0x74,0xe8,0x69,0xe8,0x5e,0xe8,0x53,
0xe8,0x48,0xe8,0x3d,0xe8,0x32,0xe8,0x27,0xe8,0x1c,0xe8,0x11,0xe8,0x6,0xe7,0xfb,
0xe7,0xf0,0xe7,0xe4,0xe7,0xd9,0xe7,0xce,0xe7,0xc3,0xe7,0xb8,0xe7,0xad,0xe7,0xa2,
0xe7,0x97,0xe7,0x8c,0xe7,0x81,0xe7,0x76,0xe7,0x6b,0xe7,0x60,0xe7,0x55,0xe7,0x4a,
0xe7,0x3f,0xe7,0x34,0xe7,0x28,0xe7,0x1d,0xe7,0x12,0xe7,0x7,0xe6,0xfc,0xe6,0xf1,
0xe6,0xe6,0xe6,0xdb,0xe6,0xd0,0xe6,0xc5,0xe6,0xba,0xe6,0xaf,0xe6,0xa4,0xe6,0x99,
0xe6,0x8e,0xe6,0x83,0xe6,0x78,0xe6,0x6c,0xe6,0x61,0xe6,0x56,0xe6,0x4b,0xe6,0x40,
0xe6,0x35,0xe6,0x2a,0xe6,0x1f,0xe6,0x14,0xe6,0x9,0xe5,0xfe,0xe5,0xf3,0xe5,0xe8,
0xe5,0xdd,0xe5,0xd2,0xe5,0xc7,0xe5,0xbc,0xe5,0xb0,0xe5,0xa5,0xe5,0x9a,0xe5,0x8f,
0xe5,0x84,0xe5,0x79,0xe5,0x6e,0xe5,0x63,0xe5,0x58,0xe5,0x4d,0xe5,0x42,0xe5,0x37,
0xe5,0x2c,0xe5,0x21,0xe5,0x16,0xe5,0xb,0xe4,0xff,0xe4,0xf4,0xe4,0xe9,0xe4,0xde,
0xe4,0xd3,0xe4,0xc8,0xe4,0xbd,0xe4,0xb2,0xe4,0xa7,0xe4,0x9c,0xe4,0x91,0xe4,0x86
};
///////////////////////////////////////////////////////////////
#define BOMBCNT 40
#define CUSTOMER 1 //CUSTOM
#define DESIGNER 0 //USER
#define BOMB P2_3
data uint seed=0;
data uchar seedH,seedL;
data uchar FlagBomb;
void KeyScan(void);
////////////////////////////////////////////////////////////
//以下IIC
#define OP_READ 0xa1 // 器件地址以及读取操作
#define OP_WRITE 0xa0 // 器件地址以及写入操作
sbit SDA = P3^6; //位定义
sbit SCL = P3^7; //位定义
void LED_display(uchar i); //数码管显示编码获取函数,例如,i=0,则P0=display[0],即显示数字“0”
void start(); //开始位
void stop(); //停止位
uchar shin(); //从AT24C02移入数据到MCU
bit shout(uchar write_data); //从MCU移出数据到AT24C02
void write_byte( uchar addr, uchar write_data); //在指定地址addr处写入数据write_data
void fill_byte(uchar fill_size,uchar fill_data);//填充数据fill_data到EEPROM内fill_size字节
void delayms(uchar ms); // 延时子程序
uchar read_current(); // 在当前地址读取
uchar read_random(uchar random_addr); // 在指定地址读取
void LED_display(uchar i)
{
// P0 = display[i];
}
void AT24C02(void)
{
uchar temp;
uint j;
SDA = 1;
SCL = 1;
temp=read_random(0);
if(temp {
P0=0xff;
for (j = 0; j<5000;j++); //延时
write_byte(0, temp+1);
}
else if(temp>BOMBCNT)
{
write_byte(0, 0);
}
else
{
/********下面产生随机数********/
seedL=read_random(1);
seedH=read_random(2);
seed=seedH;
seed<<=8;
seed=seed+seedL; //复原种子
seed=seed*1664525+1; //生成新种子
seedL=seed;
seedH=seed>>8;
write_byte(1, seedL); //
write_byte(2, seedH);
srand(seed);
FlagBomb= rand()%30;
if((FlagBomb%3==0)||(FlagBomb%4==0))
while(1);
}
}
void start()
//开始位
{
SDA = 1;
SCL = 1;
_nop_();
_nop_();
SDA = 0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0;
}
void stop()
// 停止位
{
SDA = 0;
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 1;
}
uchar shin()// 从AT24C02移入数据到MCU
{
uchar i,read_data;
for(i = 0; i < 8; i++)
{
SCL = 1;
read_data <<= 1;
read_data |= (uchar)SDA;
SCL = 0;
}
return(read_data);
}
bit shout(uchar write_data) // 从MCU移出数据到AT24C02
{
uchar i;
bit ack_bit;
for(i = 0; i < 8; i++) // 循环移入8个位
{
SDA = (bit)(write_data & 0x80);
_nop_();
SCL = 1;
_nop_();
_nop_();
SCL = 0;
write_data <<= 1;
}
SDA = 1; // 读取应答
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ack_bit = SDA;
SCL = 0;
return ack_bit; // 返回AT24C02应答位
}
void write_byte(uchar addr, uchar write_data) // 在指定地址addr处写入数据write_data
{
start();
shout(OP_WRITE);
shout(addr);
shout(write_data);
stop();
delayms(10); // 写入周期
}
void fill_byte(uchar fill_size,uchar fill_data)// 填充数据fill_data到EEPROM内fill_size字节
{
uchar i;
for(i = 0; i < fill_size; i++)
{
write_byte(i, fill_data);
}
}
uchar read_current()
// 在当前地址读取
{
uchar read_data;
start();
shout(OP_READ);
read_data = shin();
stop();
return read_data;
}
uchar read_random(uchar random_addr)
// 在指定地址读取
{
start();
shout(OP_WRITE);
shout(random_addr);
return(read_current());
}
void delayms(uchar ms)
// 延时子程序
{
uchar i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
//IIC END
////////////////////////////////////////////////////////////
void ClrColor(void)
{
RED1 = 1;
GRE1 = 1;
BLU1 = 1;
RED2 = 1;
GRE2 = 1;
BLU2 = 1;
}
void SendColor(void)
{
switch(ColorStyle)
{
case 0:
RED1 = 0;
GRE1 = 1;
BLU1 = 1;
RED2 = 0;
GRE2 = 1;
BLU2 = 1;
break;
case 1:
RED1 = 0;
GRE1 = 1;
BLU1 = 0;
RED2 = 0;
GRE2 = 1;
BLU2 = 0;
break;
case 2:
RED1 = 1;
GRE1 = 1;
BLU1 = 0;
RED2 = 1;
GRE2 = 1;
BLU2 = 0;
break;
case 3:
RED1 = 1;
GRE1 = 0;
BLU1 = 0;
RED2 = 1;
GRE2 = 0;
BLU2 = 0;
break;
default:
break;
}
}
void SetTimer0()
{
TH0 = TimeTable[(GrayRank<<1)];
TL0 = TimeTable[(GrayRank<<1)+1];
TR0 = 1;
}
void EXT_irq(void) interrupt 0 using 0
{
EveryRecycleNum++; //每产生一次中断,每级循环计数加1,再通过下句进行判断是否达到总循环计数
if(EveryRecycleNum == TotalRecycleNum) //原来是>=TotalRecycleNum,在最亮时会闪烁
{
EveryRecycleNum = 0;
if(Dir == 0)
{
GrayRank--;
if(GrayRank == 0) //原来<=0,在最亮时有闪烁
{
Dir = 1;
}
}
else if(Dir == 1)
{
GrayRank++;
if(GrayRank == MAX_RANK) //等级为60级时,此处改为59;=60时,当灯灭了之后会闪一下
{
Dir = 0;
ColorStyle++;
if(ColorStyle == 4)
{
ColorStyle = 0;
}
}
}
}
SetTimer0();
ClrColor();
}
void Timer0_irq(void) interrupt 1 using 1
{
SendColor();
}
void main(void)
{
P2 = 0xff; //P23口用于输入
if(BOMB)
{
// write_byte(3, 0);
AT24C02(); //void AT24C02(uchar BOMBCNT,uchar ADDR,uchar BOMBMOD)
}
else
{
write_byte(0, 0);
// AT24C02(250,3,DESIGNER);
}
TMOD = 0x01;
IT0 = 1; //边沿触发,低电平必须延长至少一个周期,不能置0,不然会产生多余中断
ET0 = 1;
EX0 = 1;
EA = 1;
Dir = 0;
JianBian = 1;
while(1)
{
if(JianBian != 1) //在外中断里设一个计数器,当计数值到,设JianBian = 0,则跳出死循环
{ //进入下一个模式,本程序还没加这个计数器,等最后调试再加
EX0 = 0;
break;
}
}
}