ui_led.c
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <includes.h>
00011
00012 #define LED_BUSY (SSPSR & (1<<4))
00013 #define LED_TNF (SSPSR & (1<<1))
00014 #define LED_RNE (SSPSR & (1<<2))
00015 #define SSEL_LO FIO0CLR = (1<<20);
00016 #define SSEL_HI FIO0SET = (1<<20);
00017
00018 #define R 2 // red
00019 #define G 1 // green
00020 #define B 0 // blue
00021 #define NO_OP 0x2000 // no-op
00022
00023 void ui_led_init(void)
00024 {
00025 while(!LED_TNF){}
00026 SSEL_LO;
00027 SSPDR = 0x1001;
00028 while(!LED_TNF){}
00029 SSPDR = 0x1001;
00030 while(LED_BUSY) {}
00031 SSEL_HI;
00032
00033 while(!LED_TNF){}
00034 SSEL_LO;
00035 SSPDR = 0x0A01;
00036 while(!LED_TNF){}
00037 SSPDR = 0x0A01;
00038 while(LED_BUSY) {}
00039 SSEL_HI;
00040 }
00041
00042 void ui_led_register_write(unsigned int device, unsigned int address, unsigned int w_data)
00043 {
00044
00045 if (device == 1){
00046 while(!LED_TNF){}
00047 SSEL_LO;
00048 SSPDR = NO_OP;
00049 while(!LED_TNF){}
00050 SSPDR = (address << 8) | w_data;
00051 while(LED_BUSY){}
00052 SSEL_HI;
00053 } else if (device == 2){
00054 while(!LED_TNF){}
00055 SSEL_LO;
00056 SSPDR = (address << 8) | w_data;
00057 while(!LED_TNF){}
00058 SSPDR = NO_OP;
00059 while(LED_BUSY){}
00060 SSEL_HI;
00061 }
00062 }
00063
00064 void ui_led_pwm(unsigned int ui_led_num, unsigned int color, unsigned int pwm)
00065 {
00066
00067 unsigned int dev, addr, tmp;
00068
00069 if (pwm < 3){
00070 pwm = 1;
00071 } else if (pwm > 254){
00072 pwm = 0;
00073 }
00074
00075 tmp = (ui_led_num * 3) + color;
00076 dev = (tmp / 9) + 1;
00077 addr = tmp % 9;
00078
00079 ui_led_register_write(dev, addr, pwm);
00080 }
00081
00082 void ui_led_rgb(unsigned int ui_led_num, unsigned int red_level, unsigned int green_level, unsigned int blue_level)
00083 {
00084
00085 ui_led_pwm(ui_led_num, R, red_level);
00086 ui_led_pwm(ui_led_num, G, green_level);
00087 ui_led_pwm(ui_led_num, B, blue_level);
00088 }
00089
00090