📄 c_demo.c
字号:
uchar code calendar[3][4][8] = {
{0x00,0x20,0x10,0xFC,0x13,0x12,0x12,0xFE,
0x12,0x12,0x12,0x12,0x02,0x00,0x00,0x00,
0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x1F,
0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00}, /* '年' */
{0x00,0x00,0x00,0x00,0xFF,0x11,0x11,0x11,
0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x10,0x0C,0x03,0x01,0x01,0x01,
0x09,0x11,0x11,0x0F,0x00,0x00,0x00,0x00}, /* '月' */
{0x00,0x00,0x00,0xFF,0x21,0x21,0x21,0x21,
0x21,0x21,0x21,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x1F,0x08,0x08,0x08,0x08,
0x08,0x08,0x08,0x1F,0x00,0x00,0x00,0x00}, /* '日' */
};
uchar code tris[4][4][8] = {
{0x00,0x00,0x02,0x42,0x42,0x42,0x42,0x42,
0x42,0x42,0x42,0x42,0x02,0x00,0x00,0x00,
0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00}, /* '三' */
{0x00,0x74,0x14,0x14,0xFF,0x14,0x54,0x74,
0x00,0xFC,0x00,0x00,0xFF,0x00,0x00,0x00,
0x00,0x04,0x02,0x01,0x1F,0x01,0x02,0x06,
0x00,0x03,0x08,0x10,0x0F,0x00,0x00,0x00}, /* '刺' */
{0x00,0x31,0x86,0x40,0xBE,0xAA,0xEB,0xAA,
0xBE,0x28,0xCF,0x88,0x78,0x08,0x00,0x00,
0x00,0x1F,0x00,0x10,0x08,0x07,0x12,0x12,
0x0E,0x18,0x06,0x01,0x06,0x18,0x00,0x00}, /* '激' */
{0x00,0x20,0x10,0xFC,0x03,0x02,0xFA,0xAA,
0xAA,0xAF,0xAA,0xAA,0xFA,0x02,0x00,0x00,
0x00,0x00,0x00,0x1F,0x00,0x08,0x0F,0x0A,
0x0A,0x0A,0x0A,0x0A,0x0F,0x08,0x00,0x00} /* '值' */
};
/***** 斜率 *****/
int code slope[65]={
20621, 20628, 20589, 20563,
20531, 20492, 20441, 20378, 20271,
20092, 19854, 19513, 19088, 18554,
17860, 17037, 16038, 14833, 13169,
11019, 8289, 5011, 1330, -2562,
-6308, -9760,
-7661, -6149, -5174,
-4445, -3779, -3131, -2463, -1726,
-883, 122, 1366, 2941, 5004,
7784,
8554, 5725, 3757, 2344,
1334, 574, 21, -392, -697,
-925, -1102, -1245, -1358, -1444,
-1510, -1559, -1595, -1618, -1637,
-1652, -1667, -1679, -1687, -1692,
-1694
};
/***** 函数声明 *****/
/*延时*/
void wait(void);
void delay(uchar time);
/* 液晶 */
void funcreg1(uchar command);
void disdata1(uchar value);
void funcreg2(uchar command);
void disdata2(uchar value);
void initlcd(void);
void clslcd(void);
void dis68(uchar *s, uchar x, uchar y);
void dis88(uchar *s, uchar x, uchar y);
void dis816(uchar (*s)[8], uchar x, uchar y);
void dis1616(uchar (*s)[8], uchar x, uchar y);
uchar dis_int(uint disnum, uchar x, uchar y);
void dis_float(float disnum, uchar x, uchar y);
/* 显示 */
void dis_cover(void);
void dis_menu(void);
void dis_arrow(uchar y);
void dis_sample(void);
void dis_samples(uchar num);
void dis_wait(void);
void dis_result(void);
void dis_clock(uchar *pclk);
/* DS1302 */
void WrByte(uchar val);
uchar RdByte(void);
void WrData(uchar addr, uchar value);
uchar RdData(uchar addr);
void SetClk(uchar *pClk);
void GetClk(uchar *pClk);
/* TLC1549 */
uint adconvert(void);
/* 计算 */
void color(float Ir, float Ig, float Ib, uchar i);
uint measure(uchar led);
float Eab(void);
float Euv(void);
int wavelength(float x, float y);
uchar wl_num(uchar n1, uchar n2, long k);
/* 操作 */
void init(void);
void MeaC(void);
void MeaC1(void);
void MeaC2(void);
void MeaC3(void);
void all_result(uchar i);
void C_result(void);
void Cp_result(void);
void Wl_result(void);
void MeaE(void);
void MeaE1(void);
void MeaE2(void);
void MeaE3(void);
void MeaE4(void);
void ChangeTime(void);
/* KEY */
uchar getkey(void);
/* 其他 */
uchar B_BCD(uchar val);
uchar BCD_B(uchar val);
float tqrt(float x);
/* 主函数 */
void main(void);
/***************************************************************************
* 函数原型:void wait(void);
* 函数功能:短时间延时程序。
***************************************************************************/
void wait(void)
{
uchar i;
for (i=0; i<1; i++);
}
/***************************************************************************
* 函数原型:void delay(uchar time);
* 函数功能:长时间延时程序。
***************************************************************************/
void delay(uchar time)
{
uchar i,j,k;
for (i=0; i<time; i++)
for (j=0; j<109; j++)
for (k=0; k<40; k++);
}
/***** MG-12864-5液晶模块 *****/
/***************************************************************************
* 函数原型:void funcreg1(uchar command);
* 函数功能:CS1 = 0,CS2 = 1时对液晶模块写命令。
***************************************************************************/
void funcreg1(uchar command)
{
PB = 0x08;
PB = 0x18;
PA = command;
PB = 0x08;
}
/***************************************************************************
* 函数原型:void disdata1(uchar digit);
* 函数功能:CS1 = 0,CS2 = 1时对液晶模块写数据。
***************************************************************************/
void disdata1(uchar value)
{
PB = 0x08;
PB = 0x19;
PA = value;
PB = 0x09;
PB = 0x08;
}
/***************************************************************************
* 函数原型:void funcreg2(uchar command);
* 函数功能:CS1 = 1,CS2 = 0时对液晶模块写命令。
***************************************************************************/
void funcreg2(uchar command)
{
PB = 0x04;
PB = 0x14;
PA = command;
PB = 0x04;
}
/***************************************************************************
* 函数原型:void disdata2(uchar digit);
* 函数功能:CS1 = 1,CS2 = 0时对液晶模块写数据。
***************************************************************************/
void disdata2(uchar value)
{
PB = 0x04;
PB = 0x15;
PA = value;
PB = 0x05;
PB = 0x04;
}
/***************************************************************************
* 函数原型:void initlcd(void);
* 函数功能:初始化LCD。
***************************************************************************/
void initlcd(void)
{
delay(30);
COM8155 = 0x03; /*PA口输出;PB口输出;PC口输入*/
funcreg1(0x3f); /*开显示区1*/
funcreg2(0x3f); /*开显示区2*/
funcreg1(0xc0); /*设置显示区1起始行为0*/
funcreg2(0xc0); /*设置显示区2起始行为0*/
}
/***************************************************************************
* 函数原型:void clslcd(void);
* 函数功能:清空LCD显示区。
***************************************************************************/
void clslcd(void)
{
uchar i,j;
for (i=0xb8; i<=0xbf; i++)
{
funcreg1(0x40);
funcreg2(0x40); /*设置Y地址*/
funcreg1(i);
funcreg2(i); /*设置X地址*/
for (j=0; j<64; j++)
{
disdata1(0x00);
disdata2(0x00);
}
}
delay(8);
}
/***************************************************************************
* 函数原型:void dis68(uchar *s, uchar x, uchar y);
* 函数功能:在LCD的(x,y)位置显示一个6×8字符,x在0到20之间,y在0到7之间。
***************************************************************************/
void dis68(uchar *s,uchar x,uchar y)
{
uchar i;
if((x<10)&&(x>=0))
{
funcreg1(0xb8+y);
funcreg1(0x43+x*6);
for(i=0;i<5;i++)
{
disdata1(*(s+i));
}
}
else if((x>=10)&&(x<20))
{
funcreg2(0xb8+y);
funcreg2(0x40+6*(x-10));
for(i=0;i<5;i++)
{
disdata2(*(s+i));
}
}
}
/***************************************************************************
* 函数原型:void dis88(uchar *s, uchar x, uchar y);
* 函数功能:在LCD的(x,y)位置显示一个8×8字符,x在0到15之间,y在0到7之间。
***************************************************************************/
void dis88(uchar *s, uchar x, uchar y)
{
uchar i;
if ((x>=0)&&(x<8))
{
funcreg1(0xb8+y);
funcreg1(0x40+x*8);
for (i=0; i<8; i++)
{
disdata1(*(s+i));
}
}
if ((x>=8)&&(x<16))
{
funcreg2(0xb8+y);
funcreg2(0x40+(x - 8)*8);
for (i=0; i<8; i++)
{
disdata2(*(s+i));
}
}
}
/***************************************************************************
* 函数原型:void dis816(uchar (*s)[8], uchar x, uchar y);
* 函数功能:在LCD的(x,y)位置显示一个8×16字符,x在0到15之间,y在0到6之间。
***************************************************************************/
void dis816(uchar (*s)[8], uchar x, uchar y)
{
dis88(*s, x, y);
dis88(*(s+1), x, y+1);
}
/***************************************************************************
* 函数原型:void dis1616(uchar (*s)[8], uchar x, uchar y);
* 函数功能:在LCD的(x,y)位置显示一个16×16字符,x在0到14之间,y在0到6之间。
***************************************************************************/
void dis1616(uchar (*s)[8], uchar x, uchar y)
{
dis88(*s, x, y);
dis88(*(s+1), x+1, y);
dis88(*(s+2), x, y+1);
dis88(*(s+3), x+1, y+1);
}
/***************************************************************************
* 函数原型:uchar dis_int(uint disnum, uchar x, uchar y);
* 函数功能:在LCD的(x,y)位置显示一个0--65535的整数,并返回位数。
* x在0到15之间,y在0到6之间。
***************************************************************************/
uchar dis_int(uint disnum, uchar x, uchar y)
{
uchar i, j;
uchar temp;
if (disnum == 0)
{
j = 1;
dis816(*number, x, y);
}
else
{
if (disnum >= 10000)
{
j = 5;
}
else if (disnum >= 1000)
{
j = 4;
}
else if (disnum >= 100)
{
j = 3;
}
else if (disnum >=10)
{
j = 2;
}
else
{
j = 1;
}
for (i=1; i<=j; i++)
{
temp = disnum % 10;
disnum /= 10;
dis816(*(number+temp), x+j-i, y);
}
}
return j;
}
/***************************************************************************
* 函数原型:void dis_float(float disnum, uchar x, uchar y);
* 函数功能:在LCD的(x,y)位置显示一个0--1的整数,保留小数点后3位,
* x在0到15之间,y在0到6之间。
***************************************************************************/
void dis_float(float disnum, uchar x, uchar y)
{
uchar i, j;
j = dis_int((uint)disnum, x, y);
dis816(dot, x+j, y);
for(i=1; i<=3; i++)
{
disnum -= (uint)disnum;
disnum *= 10;
dis816(*(number+(uint)disnum), x+j+i, y);
}
}
/***** 屏幕 *****/
/***************************************************************************
* 函数原型:void dis_cover(void);
* 函数功能:显示开机画面。
***************************************************************************/
void dis_cover(void)
{
uchar i;
clslcd();
dis1616(icon, 1, 0);
for (i=0; i<3; i++)
{
dis816(*(ver+i), 10+i, 0);
}
dis816(*(number_s+1), 13, 0);
dis816(dot_s, 14, 0);
dis816(*number_s, 15, 0);
dis1616(*(title_big), 1, 3);
dis1616(*(title_big+1), 4, 3);
dis1616(*(title_big), 7, 3);
dis1616(*(title_big+2), 10, 3);
dis1616(*(title_big+3), 13, 3);
for (i=0; i<6; i++)
{
dis1616(*(company+i), 2+2*i, 6);
}
}
/***************************************************************************
* 函数原型:void dis_menu(void);
* 函数功能:显示“选项”。
***************************************************************************/
void dis_menu(void)
{
uchar i;
clslcd();
for (i=0; i<3; i++)
{
dis1616(*(menu+i), 5+2*i, 0);
}
dis1616(*title, 4, 2);
dis1616(*(title+1), 6, 2);
dis1616(*(sample+6), 8, 2);
dis1616(*result, 10,2);
dis1616(*title, 4, 4);
dis1616(*(title+2), 6, 4);
dis1616(*(sample+6), 8, 4);
dis1616(*result, 10,4);
for (i=0; i<4; i++)
{
dis1616(*(settime+i), 4+2*i, 6);
}
}
/***************************************************************************
* 函数原型:void dis_arrow(uchar y);
* 函数功能:显示箭头。
***************************************************************************/
void dis_arrow(uchar y)
{
uchar i;
for (i=0; i<3; i++)
{
dis816(blank, 2, 2+2*i);
}
dis816(arrow, 2, 2+2*y);
}
/***************************************************************************
* 函数原型:void dis_blank(void);
* 函数功能:显示“请放入空白样品”。
***************************************************************************/
void dis_blank(void)
{
uchar i;
clslcd();
for (i=0; i<5; i++)
{
dis1616(*(sample+i), 1+2*i, 2);
}
for (i=7; i<9; i++)
{
dis1616(*(sample+i), 2*i-3, 2);
}
for (i=0; i<6; i++)
{
dis1616(*(next+i), 2+2*i, 5);
}
}
/***************************************************************************
* 函数原型:void dis_sample(void);
* 函数功能:显示“请放入待测样品”。
***************************************************************************/
void dis_sample(void)
{
uchar i;
clslcd();
for (i=0; i<3; i++)
{
dis1616(*(sample+i), 1+2*i, 2);
}
for (i=5; i<9; i++)
{
dis1616(*(sample+i), 2*i-3, 2);
}
for (i=0; i<6; i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -