- #include "def.h"
- #include <intrins.h>
- #include "AI8G.h"
-
- #define SCL_H P54 = 1 //APA102C的时钟输入SCK
- #define SCL_L P54 = 0
- #define DIN_H P55 = 1 //APA102C的串口数据输入DI
- #define DIN_L P55 = 0
-
- #define NUM_LEDS 1 //灯串的规模
- #define BRIGHTNESS 10 //0~31
-
- struct CRGB {
- u8 r,g,b;
- };
-
- bit flag;
-
- struct CRGB leds[NUM_LEDS]; //显存
-
- void APA_send(u8 dat) //IO模拟方式
- {
- u8 i;
- for(i=0;i<8;i++){
- if(dat & 0x80) DIN_H;
- else DIN_L;
- //NOP1(); //实测主频35MHz时都不需要NOP,
- SCL_H;
- //NOP1(); //实测主频35MHz时都不需要NOP,
- SCL_L;
- dat <<= 1;
- }
- }
-
-
- void APA_send(u8 dat) //硬件SPI方式
- {
- SPDAT = dat; //发送测试数据
- while (!(SPSTAT & 0x80)); //查询完成标志
- SPSTAT = 0xc0; //清中断标志
- }
-
- void set_color(u16 index,u8 r,u8 g,u8 b){ //设置灯串中第index个灯的颜色
- if(index >= 0 && index <NUM_LEDS){
- leds[index].r = r;
- leds[index].g = g;
- leds[index].b = b;
- }
- }
-
- void show_led(void){
- u8 i,ctrl;
- for(i=0;i<4;i++) APA_send(0x00); //发送32bit前导 否则首灯不亮
- for(i=0;i<NUM_LEDS;i++){
- ctrl = 0xE0 | (BRIGHTNESS & 0x1F);
- APA_send(ctrl); //填充亮度
- APA_send(leds[i].b); //填充蓝色
- APA_send(leds[i].g); //填充绿色
- APA_send(leds[i].r); //填充红色
- }
- APA_send(0xFF); //填充结束帧
- APA_send(0xFF); //填充结束帧
- }
-
-
- void Timer0_Isr(void) interrupt 1
- {
- static u8 i,j;
- switch (i)
- {
- case 0:
- set_color(0,j,0,0);//红色渐变
- if(j++ > 250) {j = 0; i++;}
- break;
- case 1:
- set_color(0,0,j,0);//绿色渐变
- if(j++ > 250) {j = 0; i++;}
- break;
- case 2:
- set_color(0,0,0,j);//蓝色渐变
- if(j++ > 250) {j = 0; i++;}
- break;
- case 3:
- set_color(0,j,j,0);//黄色渐变
- if(j++ > 250) {j = 0; i++;}
- break;
- case 4:
- set_color(0,0,j,j);//靛色渐变
- if(j++ > 250) {j = 0; i++;}
- break;
- case 5:
- set_color(0,j,0,j);//紫色渐变
- if(j++ > 250) {j = 0; i++;}
- break;
- case 6:
- set_color(0,j,j,j);//白色渐变
- if(j++ > 250) {j = 0; i = 0;}
- break;
- default:
- break;
- }
- show_led(); //刷新显示
- }
-
- void Timer0_Init(void) //10毫秒@12.000MHz
- {
- AUXR &= 0x7F; //定时器时钟12T模式
- TMOD &= 0xF0; //设置定时器模式
- TL0 = 0xF0; //设置定时初始值
- TH0 = 0xD8; //设置定时初始值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- ET0 = 1; //使能定时器0中断
- }
-
- void main()
- {
- P_SW2 = 0x80;
- P3M0 = 0x00; P3M1 = 0x00;
- P5M0 = 0x30; P5M1 = 0x00; //CLK & DI PP_OUT
- SPCTL = 0x50; //SPI Master CLK = SYS/4
- SPSTAT = 0xc0; //Clear Flag
- Timer0_Init();
- EA = 1;
- while(1);
- }
复制代码
|