⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 通用OSD控制(51单片机控制的TFTLCD源码,MTV018)
💻 C
📖 第 1 页 / 共 2 页
字号:
#pragma REGISTERBANK(0)

#include <stdlib.h>
#include <reg52.h>
#include <intrins.h>
#include <string.h>
#include "def.h"
#include "key.h"
#include "at24c02.h"
#include "mtv130.h"
#include "timer.h"
#include "delay.h"
#include "def.h"

extern bit key_on;
extern unsigned char key_last;
extern void timer_init(void);
extern void i2c_init(void);
extern void mtv130_init(void);
extern void at24c02_init(void);
extern void key_init(void);

#define ARRAY_SIZE(a)	(sizeof(a)/sizeof(a[0]))

bit PIN_SIGIND = 0;


static void initial(void)
{
	/* disable all interrupts */
	IE = 0;
	IP = 0;

	/* deactivate output ports */
	P0=P1=P2=P3 = 0xff;

	/* timer 0 16 bits, timer 1 16 bits */
	TMOD = 0x51;
	PCON = 0x80;
	
	timer_init();
	i2c_init();
	at24c02_init();
	mtv130_init();
	key_init();
	
	EA = 1;
}

struct progbar_struct { //定义一个工具条结构体
//	unsigned char row, col;
	unsigned char val;
	unsigned char range, pos, step;
};
void delay500ms();
unsigned char bri_read(unsigned char addr);//读亮度值
unsigned char cont_read(unsigned char addr);//读对比度值
unsigned char col_read(unsigned char addr);//读彩色值
unsigned char tint_read(unsigned char addr);
unsigned char reset_read(unsigned char addr);
unsigned char simple_read(unsigned char addr);
unsigned char bri_step(unsigned char val, unsigned char inc);
unsigned char cont_step(unsigned char val, unsigned char inc);
unsigned char col_step(unsigned char val, unsigned char inc);
unsigned char tint_step(unsigned char val, unsigned char inc);
unsigned char reset_step(unsigned char val, unsigned char inc);
//unsigned char reset_step(void);
//unsigned char bival_step(unsigned char val, unsigned char inc);
void bri_apply(unsigned char val);
void cont_apply(unsigned char val);
void col_apply(unsigned char val);
void tint_apply(unsigned char val);
void reset_apply(unsigned char val);
void bri_draw(char row, char col, unsigned char val);
void cont_draw(char row, char col, unsigned char val);
void col_draw(char row, char col, unsigned char val);
void tint_draw(char row, char col, unsigned char val);
void reset_draw(char row, char col, unsigned char val);
//void reset_draw(void);

#define ABS(x)		((x) > 0 ? (x) : -(x))

//#define DIMM_ADDR	9


#define BRI_ADDR	9//亮度控制的存储地址。
#define BRI_OFF		66//亮度的最大值
#define BRI_RANGE	92//亮度值的范围。
#define BRI_FAC		1//亮度的间隙值。
#define BRI_DEF     112//亮度的默认值。

#define CONT_ADDR	10//对比度控制的存储地址。
#define CONT_OFF	66
#define CONT_RANGE	92
#define CONT_FAC	1
#define CONT_DEF    112

#define COL_ADDR	12//彩色控制的存储地址。
#define COL_OFF		109
#define COL_RANGE	92
#define COL_FAC		1
#define COL_DEF     155

#define TINT_ADDR	13//色调控制的地址。
#define TINT_OFF	119
#define TINT_RANGE	92
#define TINT_FAC	1
#define TINT_DEF        165


struct menuitem_struct {//菜单结构体
	unsigned char code *title;//菜单标号
	unsigned char addr;//对应的菜单存储地址。
	unsigned char flags;//对应的选中的菜单项颜色标志。
    #define MIF_DOCA	0x01
    #define MIF_RESET	0x02
	unsigned char defval;//对应菜单值的默认值。
	unsigned char (code *read)(unsigned char addr);//指向相应菜单函数的入口地址。
	unsigned char (code *step)(unsigned char val, unsigned char inc);//指向相应菜单函数的设置步数。
	void (code *apply)(unsigned char val);//
	void (code *draw)(char row, char col, unsigned char val);//画相应菜单的进度条。
};

struct menuitem_struct code items[] = {
	{ "BRIGHTNESS", BRI_ADDR, MIF_DOCA|MIF_RESET, BRI_DEF, bri_read, bri_step, bri_apply, bri_draw },
	{ "CONTRAST", CONT_ADDR, MIF_DOCA|MIF_RESET, CONT_DEF, cont_read, cont_step, cont_apply, cont_draw },
	{ "COLOR", COL_ADDR, MIF_DOCA|MIF_RESET, COL_DEF, col_read, col_step, col_apply, col_draw },
	{ "TINT", TINT_ADDR, MIF_DOCA|MIF_RESET, TINT_DEF, tint_read, tint_step, tint_apply, tint_draw },
	{ "RESET", -1, 0, 0, reset_read, reset_step, reset_apply, reset_draw },
};

#define NR_ITEMS	(sizeof(items)/sizeof(items[0]))//计算

#define EDIT_FIRST	0
#define EDIT_BRIGHTNESS	(EDIT_FIRST)
#define EDIT_CONTRAST	(EDIT_FIRST+1)
#define EDIT_COLOR	(EDIT_FIRST+2)
#define EDIT_TINT	(EDIT_FIRST+3)
#define EDIT_RESET	(EDIT_FIRST+4)
#define EDIT_LAST	(EDIT_FIRST+4)
#define EDIT_COUNT	5
#define EDIT_NULL	255

#undef CHS
#undef CWS

#ifdef MTV130

#define BAR_N		4
#define BAR_B		128
#define BAR_F		129
#define BAR_E		(BAR_F+BAR_N+1)

#else

#define BAR_N		4
#define BAR_B		128
#define BAR_F		129
#define BAR_E		(BAR_F+BAR_N+1)

#endif

void disp_char(char row, char col, unsigned char c)
{
	unsigned char v = c;
	if (c >= '0' && c <= '9')
		v = c - '0' + 1;
	if (c >= 'A' && c <= 'N')
		v = c - 'A' + 11;
	if (c == 'O')
		v = 1;
	if (c >= 'P' && c <= 'Z')
		v = c - 'A' + 10;
	if (c >= 'a' && c <= 'z')
		v = c - 'a' + 36;
	if (c == ' ')
		v = 0;
	mtv130_putd(row, col, v);
}

void disp_str(char row, char col, unsigned char *str)
{
	unsigned char c;
	while ((c = *str++) != 0) {
		disp_char(row, col, c);
		col += 1;
	}
}

void disp_str2(char row, char col, unsigned char code *str, unsigned char color)
{
	unsigned char c;
	while ((c = *str++) != 0) {//先加地址,再取里面的数据。
		disp_char(row, col, c);
		mtv130_puta(row, col, color);
		col += 1;
	}
}

void disp_str3(char row, char col, unsigned char code *str)
{
	disp_str(row, col, str);
}

unsigned char data *get_num_str(unsigned char num)
{
	static unsigned char num_str[4];
	char end = 3;

	num_str[end] = 0;
	end--;

	while (end >= 0) {
		num_str[end] = '0'+num%10;
		end--;
		num /= 10;
		if (num == 0)
			break;
	}
	while (end >= 0) {
		num_str[end] = ' ';
		end--;
	}
	return num_str;
}

void paint_line(char row, char col, unsigned char count, unsigned char color)
{
	while (count--)
		mtv130_puta(row, col++, color);
}

void clear_line(char row)
{
	char col;
	for (col = 0; col != 30; col++) {
		osd_putchar(row, col, 0, 0);
	}
}

void draw_progbar(char row, char col, struct progbar_struct data *pb)
{
	unsigned char range = pb->range, step = pb->step, pos = pb->pos;
	unsigned char i = 0, c;

	osd_setrowattr(row, 0);

	disp_char(row, col, BAR_B);//菜单条BAR开始部分
	col += 1;
	
	for (; i < pos*step/BAR_N; i++) {
		disp_char(row, col, BAR_F);//菜单条填充部分
		col += 1;
	}
	
	if ((c = pos*step%BAR_N) > 0) {
		disp_char(row, col, BAR_F + BAR_N - c);//画工具条
		col += 1;
		i++;
	}

	for (; i < range*step/BAR_N; i++) {//画工具条
		disp_char(row, col, BAR_F+BAR_N);
		col += 1;
	}
	disp_char(row, col, BAR_E);//工具条末尾部分

	disp_str(row-1, col-3, get_num_str(pos/*pb->val*/));//显示相关的OSD数字
}

#ifdef CWS
#define ROW_BRI	0	
#else
#define ROW_BRI 0
#endif

/*-----------------------------------------------------------------------------------------------*/

#define check_value(val, off, range)	\
	(((val) < (off) || (val) > (off)+(range)) ? (off)+(range)/2 : (val))
#define check_value2(val, off, range, def)	\
	(((val) < (off) || (val) > (off)+(range)) ? (def) : (val))
//步进
#define step_value(val, fac, inc) \
	((inc) ? (val)+(fac) : (val)-(fac))
//加数值
#define inc_value(val, off, range, fac)	\
	(((val)+(fac) < (off) || (val)+(fac) > (off)+(range)) ? (off)+(range) : (val)+(fac))
//减数值
#define dec_value(val, off, range, fac)	\
	(((val)-(fac) < (off) || (val)-(fac) > (off)+(range)) ? (off) : (val)-(fac))

unsigned char bri_read(unsigned char addr)
{
	unsigned char c = simple_read(addr);
	return check_value(c, BRI_OFF, BRI_RANGE);
}

unsigned char cont_read(unsigned char addr)
{
	unsigned char c = simple_read(addr);
	return check_value(c, CONT_OFF, CONT_RANGE);
}

unsigned char col_read(unsigned char addr)
{
	unsigned char c = simple_read(addr);
	return check_value(c, COL_OFF, COL_RANGE);
}

unsigned char tint_read(unsigned char addr)
{
	unsigned char c = simple_read(addr);
	return check_value(c, TINT_OFF, TINT_RANGE);
}

unsigned char reset_read(unsigned char addr)
{
    unsigned char	Data;
	Data = addr;
	return 0;
}

unsigned char simple_read(unsigned char addr)
{
	unsigned char c;
	at24cxx_read(addr, &c, 1);
	return c;
}

unsigned char bri_step(unsigned char val, unsigned char inc)
{

#if 0
	if (inc && (val-BRI_OFF) <BRI_RANGE) {
		val += BRI_FAC;
	} else if (!inc && val > BRI_OFF) {
		val -= BRI_FAC;
	}


	val = step_value(val, BRI_FAC, inc);
	return check_value2(val, BRI_OFF, BRI_RANGE, inc ? BRI_OFF+BRI_RANGE : BRI_OFF);
#endif
        val = step_value(val, -BRI_FAC, inc);
	return check_value2(val, BRI_OFF, BRI_RANGE, inc ? BRI_OFF : BRI_OFF+BRI_RANGE);


        
}
unsigned char cont_step(unsigned char val, unsigned char inc)
{
#if 0
	if (inc && val > CONT_OFF) {
		val -= CONT_FAC;
	} else if (!inc && (val-CONT_OFF) < CONT_RANGE) {
		val += CONT_FAC;
	}
	return val;
#else
	val = step_value(val, -CONT_FAC, inc);
	return check_value2(val, CONT_OFF, CONT_RANGE, inc ? CONT_OFF : CONT_OFF+CONT_RANGE);
#endif
}

unsigned char col_step(unsigned char val, unsigned char inc)
{
#if 0
	if (inc && (val-COL_OFF) < COL_RANGE) {
		val += COL_FAC;
	} else if (!inc && val > COL_OFF) {
		val -= COL_FAC;
	}
	return val;
#else
	val = step_value(val, COL_FAC, inc);
	return check_value2(val, COL_OFF, COL_RANGE, inc ? COL_OFF+COL_RANGE : COL_OFF);
#endif
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -