Delphi-7段显示
我正在努力解决一个问题。我想在7段显示器上显示多个I/O函数(write_byte())。我用的是PCF8574 iic。我试图同时添加两个I/O函数,但一次只有一个段变为红色。我怎样才能使多个区段同时变红并在一段时间内保持红色 这是我的密码Delphi-7段显示,delphi,Delphi,我正在努力解决一个问题。我想在7段显示器上显示多个I/O函数(write_byte())。我用的是PCF8574 iic。我试图同时添加两个I/O函数,但一次只有一个段变为红色。我怎样才能使多个区段同时变红并在一段时间内保持红色 这是我的密码 unit check; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
unit check;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, i2cUsb, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ private-declarationen }
public
{ public-declarationen }
end;
var
Form1: TForm1;
board, slave : Ti2cUsb;
var1:integer;
i: integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
board := Ti2cUsb.Create;
slave := Ti2cUsb.Create;
//Comport Number COM4
var1 := board.Init(4);
Sleep(1000);
board.relais_on;
Sleep(1000);
board.relais_off;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
board.start_iic(False,64,'w');
{
// 7 Segment off:
board.wr_byte_iic($FF);
//all 7 Segments:
board.wr_byte_iic($7F);
board.wr_byte_iic($BF);
board.wr_byte_iic($DF);
board.wr_byte_iic($EF);
board.wr_byte_iic($F7);
board.wr_byte_iic($FB);
board.wr_byte_iic($FD);
board.wr_byte_iic($FE);
}
// Display off
board.wr_byte_iic($FF);
sleep(5000);
//number 0:
board.wr_byte_iic($7F);
board.wr_byte_iic($BF);
board.wr_byte_iic($DF);
board.wr_byte_iic($F7);
board.wr_byte_iic($FB);
board.wr_byte_iic($FD);
sleep(5000);
//number 1:
board.wr_byte_iic($DF);
board.wr_byte_iic($F7);
sleep(5000);
//number 2:
board.wr_byte_iic($BF);
board.wr_byte_iic($DF);
board.wr_byte_iic($FE);
board.wr_byte_iic($FD);
board.wr_byte_iic($FB);
sleep(5000);
//number 3:
board.wr_byte_iic($BF);
board.wr_byte_iic($DF);
board.wr_byte_iic($FE);
board.wr_byte_iic($F7);
board.wr_byte_iic($FB);
sleep(5000);
//number 4:
board.wr_byte_iic($7F);
board.wr_byte_iic($FE);
board.wr_byte_iic($DF);
board.wr_byte_iic($F7);
board.wr_byte_iic($EF);
sleep(5000);
//number 5:
board.wr_byte_iic($BF);
board.wr_byte_iic($7F);
board.wr_byte_iic($FE);
board.wr_byte_iic($F7);
board.wr_byte_iic($FB);
sleep(5000);
//number 6:
board.wr_byte_iic($EF);
board.wr_byte_iic($BF);
board.wr_byte_iic($7F);
board.wr_byte_iic($FD);
board.wr_byte_iic($FB);
board.wr_byte_iic($F7);
board.wr_byte_iic($FE);
sleep(5000);
//number 7:
board.wr_byte_iic($BF);
board.wr_byte_iic($DF);
board.wr_byte_iic($F7);
sleep(5000);
//number 8:
board.wr_byte_iic($FF);
board.wr_byte_iic($7F);
board.wr_byte_iic($BF);
board.wr_byte_iic($DF);
board.wr_byte_iic($F7);
board.wr_byte_iic($FB);
board.wr_byte_iic($FD);
board.wr_byte_iic($FE);
sleep(5000);
//number 9:
board.wr_byte_iic($EF);
board.wr_byte_iic($FE);
board.wr_byte_iic($7F);
board.wr_byte_iic($BF);
board.wr_byte_iic($DF);
board.wr_byte_iic($F7);
board.wr_byte_iic($FB);
sleep(5000);
// Display off
board.wr_byte_iic($FF);
end;
end.
提前谢谢 当您尝试写入多个段时,每次写入都会替换您以前编写的内容。您需要计算出与要显示的段组合相对应的数字,然后一次性写入该组合数字 有很多方法可以做到这一点。我想我会这样做:
实施
const ALL_OFF=$ff;
常量段_1=$20;//仅设置一位,需要设置的位
常量段_2=$08;//为该段关闭
程序SetNumberOne();
变量
ByteToWrite:字节;
开始
ByteToWrite:=全部异或(段1或段2);
board.wr_byte_iic(ByteToWrite);
结束;
因此,你有常数来标记需要设置的位,你把它们组合在一起以得到正确的位组合,然后用$FF关闭与你想要显示的段对应的位。据我所知,当你写一个字节(即8位)时,每一位对应一段,当对应位为零时,该段开启。这意味着$FF关闭所有区段,$00打开所有区段(“8”)和$D7打开两个区段(“1”)。试着告诉我…是的,你是对的。但是您怎么知道$D7打开了两段(“1”)?这是在您的代码注释“//number 1”下:“$DF是二进制11011111,$F7是二进制11110111,您只是误解了如何组合两个“负逻辑”数字(0是活动的)。它使用AND运算符$DF,$F7是$D7(11010111=>两个零将打开两个段)。我尝试了您的解决方案,但没有成功。在调试器中,您是否检查了
ByteToWrite
是否是您期望的值($D7
),以及这是您想要的值?