📄 leds.c
字号:
#include "leds.h"
#include "..\main\ext_reg.h"
#include "..\main\port.h"
#include "..\comm\serial.h"
#include <intrins.h>
#define NOP() {_nop_(); _nop_();}
#define CH451_RESET 0x0201 //复位
#define CH451_LEFTMOV 0x0300 //设置移动方式_左移
#define CH451_LEFTCYC 0x0301 //设置移动方式-左循
#define CH451_RIGHTMOV 0x0302 //设置移动方式-右移
#define CH451_RIGHTCYC 0x0303 //设置移动方式-右循
#define CH451_SYSOFF 0x0400 //关显示、键盘、看门狗
#define CH451_SYSON1 0x0401 //开显示
#define CH451_SYSON2 0x0403 //开显示、键盘
#define CH451_SYSON3 0x0407 //开显示、键盘、看门狗功能
#define CH451_DSP 0x0500 //设置默认显示方式
#define CH451_BCD 0x0580 //设置BCD译码方式
#define CH451_TWINKLE 0x0600 //设置闪烁控制
#define CH451_DIG0 0x0800 //数码管位0显示
#define CH451_DIG1 0x0900 //数码管位1显示
#define CH451_DIG2 0x0a00 //数码管位2显示
#define CH451_DIG3 0x0b00 //数码管位3显示
#define CH451_DIG4 0x0c00 //数码管位4显示
#define CH451_DIG5 0x0d00 //数码管位5显示
#define CH451_DIG6 0x0e00 //数码管位6显示
#define CH451_DIG7 0x0f00 //数码管位7显示
#define LEDsTOTALPOWER 0x08
#define LEDsTOTALMONEY 0x10
#define LEDsROOMNUMBER 0x20
#define LEDsDATETIME 0x08
#define LEDsBLANCE 0x10
#define LEDsCHARGE 0x20
sbit SPI_DO = P2^0;
sbit SPI_DI = P2^4;
sbit SPI_CLK = P2^2;
sbit SPI_CS_L = P2^3;
sbit SPI_CS_R = P2^1;
// f a b c d e g h
// 0 1 2 3 4 5 6 7
// 8 9 - E F P H L
uchar code LEDs_Code[32] = { 0xfc,0x30,0x6e,0x7a,0xb2,0xda,0xde,0x70,
0xfe,0xfa,0x02,0xce,0xc6,0xe6,0xb6,0x8c,
0xfd,0x31,0x6f,0x7b,0xb3,0xdb,0xdf,0x71,
0xff,0xfb,0x02,0xce,0xc6,0xe6,0xb6,0x00};
void LEDs_Init()
{
SPI_CS_L = 0;
SPI_CS_R = 0;
SPI_DI = 0; // 先低后高,定义4线输入
SPI_DI = 1;
SPI_CLK = 1;
SPI_CS_L = 1;
SPI_CS_R = 1;
LEDs_SendCmd(1,CH451_RESET);
LEDs_SendCmd(2,CH451_RESET);
LEDs_SendCmd(1,CH451_SYSON2); // 开显示、键盘
LEDs_SendCmd(2,CH451_SYSON2);
LEDs_SendCmd(1,CH451_DSP);
LEDs_SendCmd(2,CH451_DSP);
m_RoomNumber_Count=0;
m_RoomNumber_Value=0;
m_RoomMoney_Count=0;
m_RoomMoney_Value=0;
m_LEDsState = TOTALPOWER;
}
void LEDs_Update()
{
switch(m_LEDsState)
{
case TOTALPOWER: //16
LEDs_DisTotalPower();
if(b_DATE)
{ // 显示、调整日期
LEDs_DisDate();
}
else
{ // 显示、调整时间
LEDs_DisTime();
}
m_LEDsL[6] = LEDsTOTALPOWER;
break;
case TOTALMONEY: //17
LEDs_DisTotalMoney();
if(b_DATE)
{ // 显示、调整日期
LEDs_DisDate();
}
else
{ // 显示、调整时间
LEDs_DisTime();
}
m_LEDsL[6] = LEDsTOTALMONEY;
break;
case ROOMNUMBER: //18
LEDs_DisRoomNumber();
m_LEDsL[6] = LEDsROOMNUMBER;
break;
case DATETIME: //19
LEDs_DisTotalPower();
if(b_DATE)
{ // 显示、调整日期
LEDs_DisDate();
}
else
{ // 显示、调整时间
LEDs_DisTime();
}
m_LEDsL[6] = LEDsTOTALPOWER;
m_LEDsR[6] = LEDsDATETIME;
break;
case BLANCE: //20
m_RoomNumber_Count = 4;
LEDs_DisRoomNumber();
LEDs_DisBlance();
m_LEDsL[6] = LEDsROOMNUMBER;
m_LEDsR[6] = LEDsBLANCE;
break;
case CHARGE: //21
m_RoomNumber_Count = 4;
LEDs_DisRoomNumber();
LEDs_DisCharge();
m_LEDsL[6] = LEDsROOMNUMBER;
m_LEDsR[6] = LEDsCHARGE;
break;
default:
m_LEDsState = LEDSTATUS; // 0 = idle
break;
}
LEDs_SendCmd(2,CH451_DIG0|LEDs_Code[m_LEDsL[0]]);
LEDs_SendCmd(2,CH451_DIG1|LEDs_Code[m_LEDsL[1]]);
LEDs_SendCmd(2,CH451_DIG2|LEDs_Code[m_LEDsL[2]]);
LEDs_SendCmd(2,CH451_DIG3|LEDs_Code[m_LEDsL[3]]);
LEDs_SendCmd(2,CH451_DIG4|LEDs_Code[m_LEDsL[4]]);
LEDs_SendCmd(2,CH451_DIG5|LEDs_Code[m_LEDsL[5]]);
LEDs_SendCmd(2,CH451_DIG6|m_LEDsL[6]);
LEDs_SendCmd(1,CH451_DIG0|LEDs_Code[m_LEDsR[0]]);
LEDs_SendCmd(1,CH451_DIG1|LEDs_Code[m_LEDsR[1]]);
LEDs_SendCmd(1,CH451_DIG2|LEDs_Code[m_LEDsR[2]]);
LEDs_SendCmd(1,CH451_DIG3|LEDs_Code[m_LEDsR[3]]);
LEDs_SendCmd(1,CH451_DIG4|LEDs_Code[m_LEDsR[4]]);
LEDs_SendCmd(1,CH451_DIG5|LEDs_Code[m_LEDsR[5]]);
LEDs_SendCmd(1,CH451_DIG6|m_LEDsR[6]);
}
void LEDs_DisTotalPower()
{
ulong tmp;
uchar j;
LEDs_SendCmd(2,CH451_TWINKLE); //停止闪烁
tmp = m_TotalPower;
for(j=0;j<6;j++)
{
m_LEDsL[5-j] = tmp%10;
tmp /= 10;
}
for(j=0;j<6;j++)
{
if(m_LEDsL[j] == 0)
{ m_LEDsL[j] = 31; }
else
break;
}
}
void LEDs_DisTotalMoney()
{
ulong tmp;
uchar j;
LEDs_SendCmd(2,CH451_TWINKLE); //停止闪烁
tmp = m_TotalMoney;
for(j=0;j<6;j++)
{
m_LEDsL[5-j] = tmp%10;
tmp /= 10;
}
m_LEDsL[3] = m_LEDsL[3]+16;
for(j=0;j<3;j++)
{
if(m_LEDsL[j] == 0)
{ m_LEDsL[j] = 31; }
else
break;
}
}
void LEDs_DisDate()
{
LEDs_SendCmd(1,CH451_TWINKLE); //停止闪烁 1 = R
m_LEDsR[0] = Year_G/16;
m_LEDsR[1] = Year_G%16;
m_LEDsR[2] = Month_G/16;
m_LEDsR[3] = Month_G%16;
m_LEDsR[4] = Day_G/16;
m_LEDsR[5] = Day_G%16;
m_LEDsR[6] = LEDsDATETIME;
}
void LEDs_DisTime()
{
m_LEDsR[0] = 31;
m_LEDsR[1] = Hour_G/16;
if(m_LEDsR[1] == 0)
{ m_LEDsR[1] = 31; }
m_LEDsR[2] = Hour_G%16;
m_LEDsR[3] = 10;
LEDs_SendCmd(1,CH451_TWINKLE|8); //'-'闪烁
m_LEDsR[4] = Minute_G/16;
m_LEDsR[5] = Minute_G%16;
m_LEDsR[6] = LEDsDATETIME;
}
void LEDs_DisRoomNumber()
{
uint i;
switch(m_RoomNumber_Count)
{
case 0:
m_LEDsL[0] = 31;
m_LEDsL[1] = 31;
m_LEDsL[2] = 10;
m_LEDsL[3] = 10;
m_LEDsL[4] = 10;
m_LEDsL[5] = 10;
LEDs_SendCmd(2,CH451_TWINKLE|4); //闪烁 2 = L
m_LEDsR[0] = 31;
m_LEDsR[1] = 31;
m_LEDsR[2] = 31;
m_LEDsR[3] = 31;
m_LEDsR[4] = 31;
m_LEDsR[5] = 31;
m_LEDsR[6] = 0;
break;
case 1:
m_LEDsL[0] = 31;
m_LEDsL[1] = 31;
m_LEDsL[2] = m_RoomNumber_Value;
m_LEDsL[3] = 10;
m_LEDsL[4] = 10;
m_LEDsL[5] = 10;
LEDs_SendCmd(2,CH451_TWINKLE|8); //闪烁
break;
case 2:
m_LEDsL[0] = 31;
m_LEDsL[1] = 31;
m_LEDsL[2] = m_RoomNumber_Value/10;
m_LEDsL[3] = m_RoomNumber_Value%10;
m_LEDsL[4] = 10;
m_LEDsL[5] = 10;
LEDs_SendCmd(2,CH451_TWINKLE|0x10); //闪烁
break;
case 3:
m_LEDsL[0] = 31;
m_LEDsL[1] = 31;
i = m_RoomNumber_Value%100;
m_LEDsL[2] = m_RoomNumber_Value/100;
m_LEDsL[3] = i/10;
m_LEDsL[4] = i%10;
m_LEDsL[5] = 10;
LEDs_SendCmd(2,CH451_TWINKLE|0x20); //闪烁
break;
case 4:
m_LEDsL[0] = 31;
m_LEDsL[1] = 31;
m_LEDsL[2] = m_RoomNumber_Value/1000;
i = m_RoomNumber_Value%1000;
m_LEDsL[3] = i/100;
i = i%100;
m_LEDsL[4] = i/10;
m_LEDsL[5] = i%10;
LEDs_SendCmd(2,CH451_TWINKLE); //停止闪烁 2=L
break;
default:
break;
}
}
void LEDs_DisBlance()
{
uint i;
LEDs_SendCmd(1,CH451_TWINKLE); //停止闪烁 1=R
// 调用查询余额函数????????????
i = m_RoomNumber_Value*5;
m_LEDsR[0] = 31;
m_LEDsR[1] = i/10000;
i = i%10000;
m_LEDsR[2] = i/1000;
i = i%1000;
m_LEDsR[3] = i/100;
i = i%100;
m_LEDsR[3] += 16;
m_LEDsR[4] = i/10;
m_LEDsR[5] = i%10;
m_LEDsR[6] = LEDsBLANCE;
}
void LEDs_DisCharge()
{
uint i;
if(m_RoomMoney_Count==0)
{
m_LEDsL[0] = 31;
m_LEDsL[1] = 31;
m_LEDsL[2] = m_RoomNumber_Value/1000;
i = m_RoomNumber_Value%1000;
m_LEDsL[3] = i/100;
i = i%100;
m_LEDsL[4] = i/10;
m_LEDsL[5] = i%10;
LEDs_SendCmd(1,CH451_TWINKLE); //停止闪烁
LEDs_SendCmd(2,CH451_TWINKLE); //停止闪烁
m_LEDsR[0] = 31;
m_LEDsR[1] = 31;
m_LEDsR[2] = 31;
m_LEDsR[3] = 31;
m_LEDsR[4] = 31;
m_LEDsR[5] = 0;
m_LEDsR[6] = LEDsCHARGE;
}
else
{
m_LEDsR[0] = 0;
m_LEDsR[1] = m_RoomMoney_Value/10000;
i = m_RoomMoney_Value%10000;
m_LEDsR[2] = i/1000;
i = i%1000;
m_LEDsR[3] = i/100;
m_LEDsR[3] += 16;
i = i%100;
m_LEDsR[4] = i/10;
m_LEDsR[5] = i%10;
}
if(m_LEDsR[0] == 0)
{
if(b_NEGATIVE)
{
m_LEDsR[0] = 10;
}
else
{
m_LEDsR[0] = 31;
}
}
else
{
return;
}
if(m_LEDsR[1] == 0)
{
if(b_NEGATIVE)
{
m_LEDsR[1] = 10;
m_LEDsR[0] = 31;
}
else
{
m_LEDsR[1] = 31;
}
}
else
{
return;
}
if(m_LEDsR[2] == 0)
{
if(b_NEGATIVE)
{
m_LEDsR[2] = 10;
m_LEDsR[1] = 31;
m_LEDsR[0] = 31;
}
else
{
m_LEDsR[2] = 31;
}
}
else
{
return;
}
}
void LEDs_DisRFlash(uchar x)
{
if(x)
{ LEDs_SendCmd(1,CH451_TWINKLE|0x3f); } //闪烁
else
{ LEDs_SendCmd(1,CH451_TWINKLE); } //停止闪烁
}
void LEDs_SendCmd(uchar cs, uint cmd)
{
uchar j;
if(cs == 1)
{ SPI_CS_L = 0; SPI_CS_R = 1; }
else
{
if(cs == 2)
{ SPI_CS_L = 1; SPI_CS_R = 0; }
else
{ return; }
}
for(j=0;j<12;j++)
{
NOP();
SPI_CLK = 0;
SPI_DI = cmd&1;
cmd >>= 1;
SPI_CLK = 1;
}
SPI_CS_L = 1;
SPI_CS_R = 1;
NOP();
NOP();
}
uchar LEDs_GetKey(uchar cs)
{
uchar j,cmd,keycode;
cmd = 0x07; // 读CH451命令字
if(SPI_DO) return 0xff;
if(cs == 1)
{ SPI_CS_L = 0; }
else
{
if(cs == 2)
{ SPI_CS_R = 0; }
else
{ return 0xff; }
}
for(j=0;j<4;j++)
{
NOP();
SPI_CLK = 0;
SPI_DI = cmd&1;
cmd >>= 1;
SPI_CLK = 1;
}
if(cs == 1)
{ SPI_CS_L = 1; }
if(cs == 2)
{ SPI_CS_R = 1; }
keycode=0;
for(j=0;j<7;j++)
{
NOP();
SPI_CLK = 0;
keycode <<= 1;
keycode |= SPI_DO;
SPI_CLK = 1;
}
return keycode;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -