Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi-7段显示_Delphi - Fatal编程技术网

Delphi-7段显示

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,

我正在努力解决一个问题。我想在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,
  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
),以及这是您想要的值?