编写库的基础知识

自从在Digilent工作以来,我学到了很多。其中之一是,每当我完成一个库的编程,我应该通过使用它创建一个小的副业项目来获得一些乐趣。通过这种方式,我可以在一个新的深度上理解我的库,并找到其中的任何限制或错误。而且我也能玩得很开心,总是很开心!

20160816 _150920
玩得很开心!

上周就发生了一个很好的例子。我刚建完一个图书馆PMODSD.,这是一个2位7段显示。这个Pmod使用12引脚。引脚1到7在显示屏上分别点亮一个片段,而引脚8在左右数字之间切换。这个显示器一次只能显示一个数字,所以为了模拟一个2位数的数字,它需要在两边快速闪烁数字,以便人眼能够同时看到两个数字。

这是我想到的:

空白SnakePattern () {
/ /开始计时
long startTimer =计数器;
while(startTimer + displayTime >计数器){
//选择左边的数字
digitalWrite (pinArray[7],高);
//打印A段的蛇的左位数
digitalWrite (pinArray[0],高);
DigitalWrite(Pinarray [1],低);
digitalWrite (pinArray[2],低);
DigitalWrite(Pinarray [3],低);
DigitalWrite(Pinarray [4],低);
digitalWrite (pinArray[5],低);
digitalWrite (pinArray[6],低);
延迟(1);

//选择正确的数字
digitalWrite (pinArray[7],低);
//在右位的段中打印蛇
digitalWrite (pinArray[0],高);
DigitalWrite(Pinarray [1],低);
digitalWrite (pinArray[2],低);
DigitalWrite(Pinarray [3],低);
DigitalWrite(Pinarray [4],低);
digitalWrite (pinArray[5],低);
digitalWrite (pinArray[6],低);
延迟(1);

starttimer =计数器;
while(startTimer + displayTime >计数器){
//选择左边的数字
digitalWrite (pinArray[7],低);
//在右位上打印蛇
DigitalWrite(Pinarray [0],低);
DigitalWrite(Pinarray [1],高);
digitalWrite (pinArray[2],低);
DigitalWrite(Pinarray [3],低);
DigitalWrite(Pinarray [4],低);
digitalWrite (pinArray[5],低);
digitalWrite (pinArray[6],低);
延迟(1);

//这个过程一直持续,直到模式完成。有很多线条。

我的图书馆非常简单,正如你可以看到的那样。基本上,它需要一个数字,将其与交换机语句中的案例匹配,并且该案例执行7个数字交易()以显示该号码PMODSD..这个函数起作用了,我正要发布它。

然而,我按照我的经验,决定找点乐子!数字太无聊了,我想在显示器上做一些奢侈的图案。所以我开始模拟一条蛇在显示屏周围盘旋的图案。

我以相同的方式编码了这种模式,我通过单独地将引脚1到7单独讲述所显示的数字来编码显示的数字。正如您可以想象的那样,这需要大量的代码行,因此很多屏幕滚动。不想要制作这种模式,我不知道我的代码是多么浪费。要使它更有效,请将所有7行的数字交错()将所有7行符合到单个二进制数组中。


void DisplayPattern(int binarray1 [7],int binarray1 [7]){
//从计时器开始当前时间开始倒计时
long startTimer =计数器;
while(startTimer + displayTime >计数器){
//向后开始,以便将数字选择写入第一个
For (int I = 7;我> = 0;我(){
如果(binArray1[我]= = 1){
digitalWrite (pinArray[我],高);
其他}{
digitalWrite (pinArray[我],低);


For (int I = 7;我> = 0;我(){
如果(binArray2[我]= = 1){
digitalWrite (pinArray[我],高);
其他}{
digitalWrite (pinArray[我],低);



空白SnakePattern () {
//打印A段的蛇的左位数
int snakearray1 [] = {1,0,0,0,0,0,0,0,1};
int snakearray2 [] = {0,0,0,0,0,0,0,0,0};
DisplayBinnaryArray(Snakearray1,Snakearray1);
延迟(1);

//在右位的段中打印蛇
int snakeArray1[] = {0, 0, 0, 0, 0, 0, 0, 0, 1};
int snakeArray2[] = {1,0,0,0,0,0,0,0,0};
DisplayBinnaryArray(Snakearray1,Snakearray1);

//打印右边数字B段的蛇
int snakeArray1[] = {0, 0, 0, 0, 0, 0, 0, 0, 1};
int snakeArray2[] = {0,1,0,0,0,0,0,0,0};
DisplayBinnaryArray(Snakearray1,Snakearray1);

//打印右边数字C段的snake
int snakeArray1[] = {0, 0, 0, 0, 0, 0, 0, 0, 1};
int snakeArray2[] = {0,0,1,0,0,0,0,0,0};
DisplayBinnaryArray(Snakearray1,Snakearray1);

//打印右位的段D处的蛇
int snakeArray1[] = {0, 0, 0, 0, 0, 0, 0, 0, 1};
int snakearray2 [] = {0,0,0,1,0,0,0,0};
DisplayBinnaryArray(Snakearray1,Snakearray1);

/ /继续

这个解决方案减少了大量的代码行。然而,它还可以降低更多。我没有传递二进制数组,而是编写了一个函数,它接受0到255之间的数字,将其解释为二进制数组,并在PMODSD..这取得了我以前的解决方案,并将其推入一个简单的整数。现在我可以轻松地在一系列字节中编写整个模式。

空白DisplayByte (int字节){
if(字节<0 ||字节> 255){
返回;

int mask = 1 <<(7);for(int x = 7; x> = 0; x - ){
if((字节和掩码)== 0){
DigitalWrite(Pinarray [x],低);
其他}{
DigitalWrite(pinarray [x],高);

面具>> = 1;

延迟(1);

void displayarrayofbytes(int bytearray [],long disponstime){
//从计时器开始当前时间开始倒计时
长开始时间;
Int I = 0;
而(中ByteArray[我]!= 1) {
starttimer =计数器;
while(startTimer + displayTime >计数器){
DisplayByte(中ByteArray[我]);
//稍等片刻

DisplayByte(ByteAray [I + 1]);
//稍等片刻

我+ = 2;

//发送DisplayByte一个包含蛇图案的字节数组
空白SnakePattern () {
int circleAnimation[15] = {129, 1, 128, 3, 128, 6, 128, 12, 136, 8, 152, 0, 176, 0, -1};
DisplayBinnaryArray(CircleAnimation);

原来需要26行代码的东西现在只需要2行代码!我的藏书室现在似乎正处于最佳状态。如果没有用我的库创建一个有趣的项目,我不知道它还能有多大的改进。

当然,大多数东西都可以更加最优。如果您有任何改进我的代码的想法,请在下面发表评论!请记住,这不是库中的实际代码,您可以找到哪些库这里,但它设计背后的想法的代表性。现在我的图书馆发表了,我对模式有点疯狂......

我希望这篇文章能够对库的创建提供一些见解,以及进行项目来测试您所提出的内容的重要性!

0
是第一个投票。

关于埃里克·马什

通过Eric Marsh查看所有帖子→

发表评论

您的电子邮件地址不会被公开。必填字段被标记