/*********台湾应广单片机编程第5季PMS150G***********/
/*****************QQ774145445**********************/
/****************WS2812B流水灯*********************/
/******************20200809************************/
/**************************************************/
//____斐波那契时钟_____
// 2 |_1_| |
//________|_1_| 5 |
// 3 | |
//____________|________|
//斐波那契数列11235
//红色:小时
//绿色:分钟
//蓝色:小时分钟
//白色:忽略
//分钟和*5
/**************************************************/
#include "extern.h"
chuan bit pa.0; //串行线
//k1 bit pa.1;
void fuwei(); //复位
void yi(); //1码
void ling(); //0码
//void yanshi(); //延时
void xianshi(); //显示
void xianshi1();
void shijianfj(); //时间分解
//void anjian(); //按键
byte hong; //红
byte lv; //绿
byte lan; //蓝
byte liangdu =0x05; //亮度
byte shi;
byte fen;
byte miao;
byte xian; //显示位
byte fbnq_1; //fbnq_1=1//0白/1红/2绿/3蓝//斐波那契11235
byte fbnq_2; //fbnq_1=1
byte fbnq_3; //fbnq_1=2
byte fbnq_4; //fbnq_1=3
byte fbnq_5; //fbnq_1=5
word chuzhi; //t16初值
byte a1,a2;
void FPPA0 (void)
{
.ADJUST_IC SYSCLK=IHRC/4 //4M
//byte b1,b2;
$ chuan out,low; //设置为输出,低
/**************************************************/ //中断T16配置
$ inten t16;
intrq =0;
engint //启用全局中断
//disgint //停用全局中断
$ t16m ihrc,/64,bit15; //timer16启用
//$ t16m sysclk,/4,bit8; //timer16启用
//$ t16m stop; //timer16停用
/**************************************************/
shi =12;
fen =00;
miao =0;
//shijianfj();
//xianshi();
while (1)
{
if(xian>0)
{
xian =0;
shijianfj();
xianshi();
}
stopexe; //进入省电模式
//yanshi();
//fen++;
.delay 50;
}
}
/**************************************************/
void fuwei()
{
//chuan =1;
//nop;
chuan =0;
.delay 1500;//1200 //2400
//chuan =1;
}
/**************************************************/
void yi()
{
chuan =0;
nop;
chuan =1;
nop;
nop;
nop;
nop;
chuan =0;
nop;
}
/**************************************************/
void ling()
{
chuan =0;
nop;
chuan =1;
//nop;
chuan =0;
nop;
nop;
nop;
nop;
}
/**************************************************/
void xianshi()
{
hong =liangdu;
lv =liangdu;
lan =liangdu;
fuwei();
/**************************************************/
//engint //启用全局中断
//disgint //停用全局中断
//$ t16m ihrc,/64,bit15; //timer16启用//0.5秒中断
$ t16m stop; //timer16停用
/**************************************************/
a1 =fbnq_1;
xianshi1();
a1 =fbnq_2;
xianshi1();
a1 =fbnq_3;
xianshi1();
a1 =fbnq_4;
xianshi1();
a1 =fbnq_5;
xianshi1();
/**************************************************/
//engint //启用全局中断
//disgint //停用全局中断
$ t16m ihrc,/64,bit15; //timer16启用//0.5秒中断
//$ t16m stop; //timer16停用
/**************************************************/
}
/**************************************************/
void xianshi1() //高位先发,按照 GRB 的顺序发送数据//0白/1红/2绿/3蓝
{
if((a1==0)||(a1==2)) //白/绿
{
if(lv.7) {yi();} else{ling();}
if(lv.6) {yi();} else{ling();}
if(lv.5) {yi();} else{ling();}
if(lv.4) {yi();} else{ling();}
if(lv.3) {yi();} else{ling();}
if(lv.2) {yi();} else{ling();}
if(lv.1) {yi();} else{ling();}
if(lv.0) {yi();} else{ling();}
}
else
{
a2 =8;
while(a2)
{
a2--;
ling();
}
}
if((a1==0)||(a1==1)) //白/红
{
if(hong.7) {yi();} else{ling();}
if(hong.6) {yi();} else{ling();}
if(hong.5) {yi();} else{ling();}
if(hong.4) {yi();} else{ling();}
if(hong.3) {yi();} else{ling();}
if(hong.2) {yi();} else{ling();}
if(hong.1) {yi();} else{ling();}
if(hong.0) {yi();} else{ling();}
}
else
{
a2 =8;
while(a2)
{
a2--;
ling();
}
}
if((a1==0)||(a1==3)) //白/蓝
{
if(lan.7) {yi();} else{ling();}
if(lan.6) {yi();} else{ling();}
if(lan.5) {yi();} else{ling();}
if(lan.4) {yi();} else{ling();}
if(lan.3) {yi();} else{ling();}
if(lan.2) {yi();} else{ling();}
if(lan.1) {yi();} else{ling();}
if(lan.0) {yi();} else{ling();}
}
else
{
a2 =8;
while(a2)
{
a2--;
ling();
}
}
}
/**************************************************/
void shijianfj() //时间分解/红色:小时/绿色:分钟/蓝色:小时分钟/白色:忽略
{
byte shi_1;
byte fen_1;
byte fen_a1;
shi_1 =shi;
fen_a1 =fen; //分钟的变换0-59变成0-11
fen_1 =0;
while(fen_a1>=5)
{
fen_a1 -=5;
fen_1 ++;
}
if(fen_a1>0)
{
fen_1 ++;
}
fbnq_1 =0; //1//0白/1红/2绿/3蓝
fbnq_2 =0; //1
fbnq_3 =0; //2
fbnq_4 =0; //3
fbnq_5 =0; //5
if(shi_1 >=5) //提取出小时颜色
{
shi_1 -=5;
fbnq_5 =1;
}
if(shi_1 >=3)
{
shi_1 -=3;
fbnq_4 =1;
}
if(shi_1 >=2)
{
shi_1 -=2;
fbnq_3 =1;
}
if(shi_1 >=1)
{
shi_1 -=1;
fbnq_2 =1;
}
if(shi_1 >=1)
{
shi_1 -=1;
fbnq_1 =1;
}
if(fen_1 >=5) //提取分钟颜色
{
fen_1 -=5;
if(fbnq_5==1){fbnq_5=3;} else{fbnq_5=2;}
}
if(fen_1 >=3)
{
fen_1 -=3;
if(fbnq_4==1){fbnq_4=3;} else{fbnq_4=2;}
}
if(fen_1 >=2)
{
fen_1 -=2;
if(fbnq_3==1){fbnq_3=3;} else{fbnq_3=2;}
}
if(fen_1 >=1)
{
fen_1 -=1;
if(fbnq_2==1){fbnq_2=3;} else{fbnq_2=2;}
}
if(fen_1 >=1)
{
fen_1 -=1;
if(fbnq_1==1){fbnq_1=3;} else{fbnq_1=2;}
}
}
/**************************************************
void yanshi()
{
.delay 200;
}
/**************************************************/
void interrupt()
{
pushaf //入栈
//intrq =0;
if (Intrq.T16)
{
miao++;
if(miao>120) //120
{
xian =1;
miao=0;
fen++;
if(fen>=60)
{
xian =1;
fen =0;
shi ++;
if(shi>=13)
{
shi=1;
}
}
}
}
chuzhi =1518; //t16初值
stt16 chuzhi; //0.5秒
Intrq.T16 = 0;
popaf //出栈
}
/**************************************************/