微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > LCD七彩调色屏和色彩渐变程序

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;
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top