|
该应用程序非常简单,主要展示了如何使用ATtiny85单片机驱动四个RGB LED指示灯。
每个LED可以设置为16个不同等级之一,从关闭到全亮,电路中预留一个I / O引脚用于其他应用。
电路
以下是本文采用的电路:
该应用程序的主要工作原理是您可以通过使用Charlieplexing的方式利用四个I/O线驱动12个LED。下表显示了当您将一个I / O线设置为高电平,另一个I / O线设置为低电平时,哪个RGB LED指示灯会被点亮:
指示灯与普通的阴极RGB LED封装兼容;我使用了低成本的四引线共阴极5mm RGB LED,但您可以使用任何类型的RGB LED。
显示复用
使用Timer / Counter1产生的中断,从Buffer[]中的值更新LED,delay()和millis()使用Timer / Counter0。
Buffer[]数组的每个元素决定一个RGB LED的颜色和亮度。该值指定为三个十六进制数字,颜色为BGR。值为0表示零亮度,“F”值指定全亮度。例如:
- Buffer[0] = 0xF00; Buffer[1] = 0x0F0; Buffer[2] = 0x00F; Buffer[3] = 0x888;
复制代码
将四个LED分别设置为100%绿色、100%蓝色、100%红色和50%白色。
在DisplaySetup()函数中定时器设置为CTC模式,计数到OCR1C: - void DisplaySetup () {
- // Set up Timer/Counter1 to multiplex the display
- TCCR1 = 1<<CTC1 | 7<<CS10; // CTC mode; divide by 64
- OCR1C = 24; // Divide by 25 -> 5kHz
- TIMSK = TIMSK | 1<<OCIE1A; // Enable overflow interrupt
- }
复制代码
Timer / Counter1 Compare A中断显示下一行LED: - ISR(TIM1_COMPA_vect) {
- DisplayNextRow();
- }
复制代码
对于每个RGB LED指示灯,DisplayNextRow()函数调用了16次。每个LED指示灯的R、G和B元素的亮度值从Buffer[led]中的值读取,然后确定16个周期中有多少颜色将点亮: - void DisplayNextRow() {
- static int cycle = 0;
- DDRB = DDRB & ~(1<<(cycle & 0x03));
- cycle = (cycle + 1) & 0x3F; // 64 cycles
- int led = cycle & 0x03;
- int count = cycle>>2;
- int rgb = Buffer[led];
- int r = rgb & 0x0F;
- int b = rgb>>4 & 0x0F;
- int g = rgb>>8 & 0x0F;
- int bits = (count < r) | (count < b)<<1 | (count < g)<<2;
- bits = bits + (bits & 0x07<<led);
- DDRB = (DDRB & 0xF0) | bits;
- PORTB = (PORTB & 0xF0) | bits;
- DDRB = DDRB | 1<<led;
- }
复制代码
中断以5kHz的速率发生,所以DisplayNextRow()的64个周期的完整集合以大约78Hz发生,足够快以避免闪烁。
演示程序
以下loop()函数中的演示程序会慢慢地循环LED通过所有可能的颜色和亮度: - int Step = 0;
- int red (int x) {
- int y = x % 48;
- if (y > 15) y = 31 - y;
- return max(y, 0);
- }
- int green (int x) { return red(x + 32); }
- int blue (int x) { return red(x + 64); }
- void loop () {
- for (int i=0; i<4; i++) {
- Buffer[i] = green(Step + i*12)<<8 | blue(Step + i*12)<<4 | red(Step + i*12);
- }
- Step++;
- delay(200);
- }
复制代码
编译程序
使用ATTiny Core编译程序,ATTiny Core支持所有ATtiny处理器,并取代了早期的ATtiny内核。在Boards菜单的ATtiny Universal标题下选择ATtinyx5 series选项。然后在接下来的菜单中选择Timer 1 Clock: CPU、 B.O.D. Disabled、ATtiny85、 8 MHz (internal)。选择Burn Bootloaderr适当地设置保险丝。然后将程序上传到ATtiny85。
整个工程的代码:Four RGB LED Program。
译者注:本文翻译自Driving Four RGB LEDs from an ATtiny85,如有错漏,敬请指正。 |