#include "global.h" #include #include #include #include #include"16seg.h" #define LE_PORT PORTB #define LE PB7 #define LED_COMMON_PORT PORTB #define LED_COMMON PB1 #define LED_DP_PORT PORTB #define LED_DP PB6 #define I2C_RET_NO 0 #define I2C_RET_RECIVED 1 #define I2C_RET_STOP 2 #define CMD_DISP_ON 0x01 #define CMD_DISP_OFF 0x02 #define CMD_DOT_ON 0x03 #define CMD_DOT_OFF 0x04 #define CMD_SET_DUTY 0x05 #define CMD_SET_TRANS 0x06 #define TRANSITION_NONE 0 #define TRANSITION_TYPHOON 1 #define TRANSITION_FADE 2 #define TRANSITION_CROSS_FADE 3 #define STATUS_CMD 0 #define STATUS_DAT 1 void ledOut(uint8_t c); void ledOutPattern(uint16_t pat); void initCharacterTable(void); void initPwm_OC1A(void); void pwmOff(void); void pwmOn(void); void setPwmDuty(uint8_t duty); void initI2C(uint8_t address); uint8_t i2c_loop(void); uint8_t i2c_get_data(void); void crossFade(uint8_t before, uint8_t after, uint8_t beforeDuty, uint8_t afterDuty, uint8_t speed); void fadeOut(uint8_t before, uint8_t after, uint8_t beforeDuty, uint8_t afterDuty, uint8_t speed); void fadeIn(uint8_t before, uint8_t after, uint8_t beforeDuty, uint8_t afterDuty, uint8_t speed); void fadeOutIn(uint8_t before, uint8_t after, uint8_t beforeDuty, uint8_t afterDuty, uint8_t speed); void typhoon(uint8_t before, uint8_t after, uint8_t speed); void display(uint8_t after); const char title[] = " 16 segments LED Display Module Producted by IQ COMPANY,ltd. "; uint8_t _before = 0x20; uint8_t _transition = TRANSITION_NONE; uint8_t _duty = 0; int main(void) { // port initialyze DDRB = BV(PB1)|BV(PB6)|BV(PB7); DDRD = 0xff; // eeprom table set default data initCharacterTable(); // pwm(OC1A) initialyze initPwm_OC1A(); // set pwm duty setPwmDuty(255); // turn off DP sbi(LED_DP_PORT, LED_DP); // title output int size = sizeof(title); for ( int i=0; i= 0x80 ) return; // read led character data from eeprom uint16_t data = eeprom_read_word((uint16_t*)((c-0x20)*2)); // common off pwmOff(); // latch data set uint8_t portd_data = (uint8_t)data; outb(PORTD, ~portd_data); // latch sbi(LE_PORT, LE); cbi(LE_PORT, LE); // non latch data set portd_data = (uint8_t)((data>>8)&0x00ff); outb(PORTD, ~portd_data); // common on pwmOn(); } void ledOutPattern(uint16_t pat) { // common off pwmOff(); // latch data set uint8_t portd_data = (uint8_t)pat; outb(PORTD, ~portd_data); // latch sbi(LE_PORT, LE); cbi(LE_PORT, LE); // non latch data set portd_data = (uint8_t)((pat>>8)&0x00ff); outb(PORTD, ~portd_data); // common on pwmOn(); } void initCharacterTable(void) { for(uint8_t c=0x20; c<0x80; c++ ) { uint16_t defaultData = cdata[c-0x20]; eeprom_write_word((uint16_t*)((c-0x20)*2), defaultData); } } void initPwm_OC1A(void) { // set PB1(OC1A) output DDRB |= BV(PB1); // count clear TCNT1H = 0; TCNT1L = 0; // compare register OCR1AH = 0; OCR1AL = 0; // control register A TCCR1A = 0b10000001; // clear OC1A on compare match / fast PWM 8bit // control register B TCCR1B = 0b00001001; // fast PWM 8bit, clk/1 } void pwmOff(void) { // control register A TCCR1A = 0b00000001; // clear OC1A on compare match / fast PWM 8bit // control register B TCCR1B = 0b00001000; // fast PWM 8bit, timer stop // LED common off cbi(LED_COMMON_PORT, LED_COMMON); } void pwmOn(void) { // count clear TCNT1H = 0; TCNT1L = 0; // control register A TCCR1A = 0b10000001; // clear OC1A on compare match / fast PWM 8bit // control register B TCCR1B = 0b00001001; // fast PWM 8bit, clk/1 } void setPwmDuty(uint8_t duty) { _duty = duty; // count clear TCNT1H = 0; TCNT1L = 0; // compare register OCR1AH = 0; OCR1AL = _duty; } //// i2c static uint8_t i2c_data; void initI2C(uint8_t address) { // set prescaler to 1 TWSR = 0x00; // SCL frequency = F_CPU / ( 16 + 2 * TWBR * Prescaler ) = 8MHz / ( 16 * 2 * 32 * 1 ) = 100KHz TWBR = 32; // slave address TWAR = address<<1 | 0x01; // general call recognition enable // data clear i2c_data = 0; // Enable I2C Interrupt TWCR = (1<1 ) bDuty--; if (aDuty0 ) bDuty--; } } ledOut(after); setPwmDuty(afterDuty); _delay_ms(1); } void fadeIn(uint8_t before, uint8_t after, uint8_t beforeDuty, uint8_t afterDuty, uint8_t speed) { uint8_t aDuty = 0; while(1){ ledOut(after); setPwmDuty(aDuty); _delay_ms(1); if (aDuty==afterDuty) break; for ( uint8_t i=0;i0 ) bDuty--; } } fadeIn(before, after, beforeDuty, afterDuty, speed); } void typhoon(uint8_t before, uint8_t after, uint8_t speed) { for ( uint8_t i=0; i<0x10; i++ ) { uint16_t bPat = cdata[before-0x20] & ~typhoon_pattern[i]; uint16_t aPat = cdata[after-0x20] & typhoon_pattern[i]; ledOutPattern(bPat|aPat|typhoon_pattern_2[i]); // ledOutPattern(typhoon_pattern_2[i]); _delay_ms(speed*10); } ledOut(after); } void display(uint8_t after) { switch ( _transition ) { case TRANSITION_TYPHOON: typhoon(_before, after, 1); break; case TRANSITION_FADE: fadeOutIn(_before, after, _duty, _duty, 1); break; case TRANSITION_CROSS_FADE: crossFade(_before, after, _duty, _duty, 1); break; default: ledOut(after); _transition = TRANSITION_NONE; } _before = after; }