LCD七彩调色屏和色彩渐变程序
时间:10-02
整理:3721RD
点击:
调试单片机程序的时候感觉LCD显示屏的颜色太死板了,于是想写一个调颜色的程序, 调出喜欢的颜色记下,方便以后调试使用。写了两个程序,一个是使用ADC读取三个变阻器的电压,通过计算,算出R,G,B三个分量的值,再输入到LCD中,改变颜色。(变阻器电路自己DIY)另一个程序是让LCD颜色渐变的简单算法。(纯属娱乐......)
(程序是战舰开发板官方例程改的,我的开发板是芯嵌开发板,LCD是16位色的电阻屏)
以下是程序:
1:ADC调色板
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "adc.h"
int main(void)
{
u16 adcx;
u16 gram;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
LED_Init();
LCD_Init();
Adc_Init();
POINT_COLOR=RED;
LCD_ShowChar(10,0,'R',16,0);
POINT_COLOR=GREEN;
LCD_ShowChar(50,0,'G',16,0);
POINT_COLOR=BLUE;
LCD_ShowChar(90,0,'B',16,0);
POINT_COLOR=WHITE;
while(1)
{
adcx=Get_Adc_Average(ADC_Channel_10,10);//ADC1_CH10
adcx*=(32.0/4096);
gram|=(adcx<<11);
LCD_ShowxNum(20,0,adcx,2,16,0);adcx=0;//RED
//------------------------------------------------
adcx=Get_Adc_Average(ADC_Channel_11,10);//ADC1_CH11
adcx*=(64.0/4096);
gram|=(adcx<<5);
LCD_ShowxNum(60,0,adcx,2,16,0);adcx=0;//GREEN
//------------------------------------------------
adcx=Get_Adc_Average(ADC_Channel_12,10);//DC1_CH12
adcx*=(32.0/4096);
gram|=adcx;
LCD_ShowxNum(100,0,adcx,2,16,0);adcx=0;// BLUE
//------------------------------------------------
LCD_ShowxNum(160,0,gram,4,16,0);// gram
LCD_Fill(0,20,240,320,gram);
gram=0;
adcx=0;
LED2=!LED2;
delay_ms(200);
}
}
LCD是16位的,对应不同LCD,R,G,B的位数可能不同。
2:颜色渐变程序:
#include "delay.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
//-------------------------
#define R_STOP 31
#define G_STOP 63
#define B_STOP 31
#define R_START 0
#define G_START 0
#define B_START 0
//以上是每个分量的变化范围,我的LCD是16位,R 5位,G6位,B5位,所以他们的变化范围是0-31,0-63,0-31
//-------------------------
int colorRun(u8 *r,u8 *g,u8 *b,u8 *flag);
int main(void)
{
u8 flag=0,r=R_STOP,g=G_START,b=B_START;
u16 gram;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
LCD_Init();
LCD_Fill(10,10,230,20,POINT_COLOR);
while(1)
{
colorRun(&r,&g,&b,&flag);
printf("%3d %3d %3d\n",r,g,b);
gram|=(r<<11);
gram|=(g<<5);
gram|=b;
LCD_Fill(0,0,240,320,gram);
gram = 0;
delay_ms(10);
}
}
//每执行一次colorRun就输出一组数据。使用指针可以方便封装成模块。
红:31, 0, 0----flag=0---
黄:31,63, 0----flag=1---
绿: 0,63, 0----flag=2---
青: 0,63,31----flag=3---
蓝: 0, 0,31----flag=4---
紫:31, 0,31----flag=5---
红:31, 0, 0----flag=0---
int colorRun(u8 *r,u8 *g,u8 *b,u8 *flag)
{
switch(*flag)
{
case 0:if(*g==G_STOP)*flag = 1;break;
case 1:if(*r==R_START)*flag = 2;break;
case 2:if(*b==B_STOP)*flag = 3;break;
case 3:if(*g==G_START)*flag = 4;break;
case 4:if(*r==R_STOP)*flag = 5;break;
case 5:if(*b==B_START)*flag = 0;break;
default:*flag = 0;break;
}
switch(*flag)
{
case 0:(*g)++;break;
case 1:(*r)--;break;
case 2:(*b)++;break;
case 3:(*g)--;break;
case 4:(*r)++;break;
case 5:(*b)--;break;
default:*flag=0;*r=R_STOP;*g=G_START;*b=B_START;break;
}
return 0;
}
(程序是战舰开发板官方例程改的,我的开发板是芯嵌开发板,LCD是16位色的电阻屏)
以下是程序:
1:ADC调色板
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "adc.h"
int main(void)
{
u16 adcx;
u16 gram;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
LED_Init();
LCD_Init();
Adc_Init();
POINT_COLOR=RED;
LCD_ShowChar(10,0,'R',16,0);
POINT_COLOR=GREEN;
LCD_ShowChar(50,0,'G',16,0);
POINT_COLOR=BLUE;
LCD_ShowChar(90,0,'B',16,0);
POINT_COLOR=WHITE;
while(1)
{
adcx=Get_Adc_Average(ADC_Channel_10,10);//ADC1_CH10
adcx*=(32.0/4096);
gram|=(adcx<<11);
LCD_ShowxNum(20,0,adcx,2,16,0);adcx=0;//RED
//------------------------------------------------
adcx=Get_Adc_Average(ADC_Channel_11,10);//ADC1_CH11
adcx*=(64.0/4096);
gram|=(adcx<<5);
LCD_ShowxNum(60,0,adcx,2,16,0);adcx=0;//GREEN
//------------------------------------------------
adcx=Get_Adc_Average(ADC_Channel_12,10);//DC1_CH12
adcx*=(32.0/4096);
gram|=adcx;
LCD_ShowxNum(100,0,adcx,2,16,0);adcx=0;// BLUE
//------------------------------------------------
LCD_ShowxNum(160,0,gram,4,16,0);// gram
LCD_Fill(0,20,240,320,gram);
gram=0;
adcx=0;
LED2=!LED2;
delay_ms(200);
}
}
LCD是16位的,对应不同LCD,R,G,B的位数可能不同。
2:颜色渐变程序:
#include "delay.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
//-------------------------
#define R_STOP 31
#define G_STOP 63
#define B_STOP 31
#define R_START 0
#define G_START 0
#define B_START 0
//以上是每个分量的变化范围,我的LCD是16位,R 5位,G6位,B5位,所以他们的变化范围是0-31,0-63,0-31
//-------------------------
int colorRun(u8 *r,u8 *g,u8 *b,u8 *flag);
int main(void)
{
u8 flag=0,r=R_STOP,g=G_START,b=B_START;
u16 gram;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
LCD_Init();
LCD_Fill(10,10,230,20,POINT_COLOR);
while(1)
{
colorRun(&r,&g,&b,&flag);
printf("%3d %3d %3d\n",r,g,b);
gram|=(r<<11);
gram|=(g<<5);
gram|=b;
LCD_Fill(0,0,240,320,gram);
gram = 0;
delay_ms(10);
}
}
//每执行一次colorRun就输出一组数据。使用指针可以方便封装成模块。
红:31, 0, 0----flag=0---
黄:31,63, 0----flag=1---
绿: 0,63, 0----flag=2---
青: 0,63,31----flag=3---
蓝: 0, 0,31----flag=4---
紫:31, 0,31----flag=5---
红:31, 0, 0----flag=0---
int colorRun(u8 *r,u8 *g,u8 *b,u8 *flag)
{
switch(*flag)
{
case 0:if(*g==G_STOP)*flag = 1;break;
case 1:if(*r==R_START)*flag = 2;break;
case 2:if(*b==B_STOP)*flag = 3;break;
case 3:if(*g==G_START)*flag = 4;break;
case 4:if(*r==R_STOP)*flag = 5;break;
case 5:if(*b==B_START)*flag = 0;break;
default:*flag = 0;break;
}
switch(*flag)
{
case 0:(*g)++;break;
case 1:(*r)--;break;
case 2:(*b)++;break;
case 3:(*g)--;break;
case 4:(*r)++;break;
case 5:(*b)--;break;
default:*flag=0;*r=R_STOP;*g=G_START;*b=B_START;break;
}
return 0;
}