📄 led.cpp
字号:
// Led.cpp: implementation of the CLed class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Led.h"
#include "conio.h"
#include "memory.h"
#include "math.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CLedDisplay::CLedDisplay()
{
}
CLedDisplay::~CLedDisplay()
{
}
//显示单个数字
//Dig---位
//Num---数字
//IsDot---是否有小数点
int CLedDisplay::DisplaySingleNum(int Dig,int Num,bool IsDot)
{
//数位
unsigned char Digital[][8]={
{0,0,0,0,0,0,0,1},
{0,0,0,0,0,0,1,0},
{0,0,0,0,0,0,1,1},
{0,0,0,0,0,1,0,0},
{0,0,0,0,0,1,0,1},
{0,0,0,0,0,1,1,0},
{0,0,0,0,0,1,1,1},
{0,0,0,0,1,0,0,0}};
//显示数字
unsigned char Number[][8]={
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,1},
{0,0,0,0,0,0,1,0},
{0,0,0,0,0,0,1,1},
{0,0,0,0,0,1,0,0},
{0,0,0,0,0,1,0,1},
{0,0,0,0,0,1,1,0},
{0,0,0,0,0,1,1,1},
{0,0,0,0,1,0,0,0},
{0,0,0,0,1,0,0,1},
{0,0,0,0,1,0,1,0},
{0,0,0,0,1,0,1,1},
{0,0,0,0,1,1,0,0},
{0,0,0,0,1,1,0,1},
{0,0,0,0,1,1,1,0},
{0,0,0,0,1,1,1,1}};
unsigned char reg[16];
for(int i=0;i<8;i++)
reg[i]=Digital[Dig][i];
for(i=0;i<8;i++)
reg[i+8]=Number[Num][i];
if(IsDot)
reg[8]=1;
SendData(reg);
return 0;
}
void CLedDisplay::Config()
{
}
//2005.8.10/11:00基本完成,功能已实现,需要扩展
//数据位0:CLK, 高电平clk^=0x01,低电平:clk&=0xFE
//数据位1:LOAD 高电平cs^=0x02,低电平:cs&=0xFD
//数据位2:DI,data 高电平data^=0x04,低电平:data&=0xFB
void CLedDisplay::SendData(unsigned char Register[16])
{
unsigned char clk=0;
unsigned char data=0;
// unsigned char load=0;用于7219
unsigned char cs=0;
unsigned char Data_Read=0;
_outp(0x378,cs); //首先清零
// Data_Read=_inp(0x378);
cs=Data_Read&0xFD;
_outp(0x378,cs); //产生片选低电平
for(int i=0;i<16;i++)
{
Data_Read=_inp(0x378);
clk=Data_Read&0xFE;
_outp(0X378,clk); //产生时钟低电平
Data_Read=_inp(0x378);
if(Register[i]==1)
data=Data_Read|0x04;
else
data=Data_Read&0xFB;
_outp(0x378,data); //送入数据
Data_Read=_inp(0x378);
clk=Data_Read|0x01;
_outp(0X378,clk); //产生时钟高电平,在上升沿加入
}
Data_Read=_inp(0x378);
cs=Data_Read|0x02;
_outp(0x378,cs); //产生片选高电平,在上升沿锁存
}
void CLedDisplay::Init()
{
unsigned char TEST_MODE0[]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0};
unsigned char TEST_MODE1[]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
SendData(TEST_MODE1);
unsigned char Scan_Limit[]={0,0,0,0,1,0,1,1,0,0,0,0,0,1,1,1};
SendData(Scan_Limit); //扫描限制,8位全选
unsigned char Decode_Mode[]={0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1};
SendData(Decode_Mode); //解码模式,选用8位,B-decode
unsigned char Intensity[]={0,0,0,0,1,0,1,0,1,1,1,1,1,1,1,1};
SendData(Intensity); //最亮模式
unsigned char ShutDown0[]={0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,0};
SendData(ShutDown0);
unsigned char ShutDown1[]={0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1};
SendData(ShutDown1);/**/
SendData(TEST_MODE0); //全部点亮1秒后,熄灭作为测试用
}
//显示数字:暂定显示5位整数和三位小数
void CLedDisplay::DisplayNum(double Num)
{
//整数部分只能做到保留后五位
double a,b; //整数部分和小数部分
a=modf(Num,&b);
int temp=(int )b%100000;
b=temp;
//以下显示五位整数
int chushu=0;
int yushu=0;
for(int i=0;i<4;i++)
{
chushu=pow(10,4-i);
yushu=(int)b/chushu;
DisplaySingleNum(7-i,yushu,0);
b-=yushu*chushu;
}
DisplaySingleNum(3,(int)b,1);
//以下显示三位小数
int ji=a*1000; //
for(i=0;i<3;i++)
{
chushu=pow(10,2-i);
yushu=ji/chushu;
DisplaySingleNum(2-i,yushu,0);
ji-=yushu*chushu;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -