📄 main.c
字号:
#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 + -