用csharp编写8x8横向取模软件
2018-10-21 01:04:48

点阵扫描原理:

点阵是通过扫描来实现的,什么是点阵扫描呢?

扫描其实就是利用肉眼看不到的时间范围内变化点阵上面的二极管是否点亮,然后达到看到宏观的图形的目的。如果不理解,这里举个例子,拿数码管说话,比如说有四个数码管,你想让它显示1、2、3、4,数码管有段选和位选,段选是控制数码管的显示图案的,而位选则是控制第N个数码管是否点亮的。这样做的话主要是节省IO口,如果你每一个段选控制一个数码管的话,控制一个段选需要8个IO管脚,如果控制四个数码管,就需要4*8个IO管脚,而通过位选段选的方式则只需要8+4个管脚。那么具体是个什么流程呢?其实就是第一个时间段,比如说10ms,片选选中第一个,段选亮一个1,第二个时间段,片选选中第二个,段选亮一个2。。。。如此到第四个时间段,然后再无限循环下去。这样算加起来一共40ms(其实应该更短),人的肉眼很难分辨出来,所以看起来就是1,2,3,4的样子。

点阵的原理和数码管差不多,先选中第一行(或列),然后显示列的图案,然后是第二行。。。一直到第8行。

点阵分为共阴极和共阳极,共阴极的话就是二极管公共端接地(共阳为公共端接电源或者高电平)。共阴的话,对每一行来说就是赋值1的就是亮的,0的就是不亮的。而共阳刚好取反。而对于一行中某一个元素,其实是有个权的,具体的看代码就好了。

代码使用说明:

软件只适合共阴的点阵,共阳的话直接取个反就好了。
可以直接点击拖动鼠标得到自己想要的图形。如果画错的话,把颜色改成黑色再涂掉就好了

运行效果:

效果

代码:

Form1.cs——展示取模的图案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace qumo
{
public partial class Form1 : Form
{
private bool flag;
private Rectangle[,] rectangles;
private bool[,] myColors;
private Point point = new Point(45, 15);
private Color brushColor;


void RectangleInit()
{
myColors = new bool[8, 8];
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
myColors[i, j] = false;
}
}
rectangles = new Rectangle[8, 8];
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
rectangles[i, j].Height = 25;
rectangles[i, j].Width = 25;
rectangles[i, j].X = point.X + 25 * i;
rectangles[i, j].Y = point.Y + 25 * j;
}
}
}

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
RectangleInit();
this.flag = false;
brushColor = Color.FromArgb(255, 0, 0);
rbtnRed.Checked = true;
}

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
this.flag = true;
}

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (flag)
{
Graphics g = CreateGraphics();
try
{
if (e.X >= point.X && e.X < 200+point.X && e.Y >= point.Y && e.Y < 200+point.Y)//rectangles4
{
int tempX = (e.X - point.X) / 25;
int tempY = (e.Y - point.Y) / 25;
g.FillRectangle(new SolidBrush(brushColor), rectangles[tempX, tempY]);
if (!brushColor.Equals(Color.Black))
{
myColors[tempX, tempY] = true;
}
else
{
myColors[tempX, tempY] = false;
}
}
}
catch { }

for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
g.DrawRectangle(new Pen(Color.White), rectangles[i, j]);
}
}
}
}

private void Form1_MouseUp(object sender, MouseEventArgs e)
{
this.flag = false;
}

private void Form1_Paint(object sender, PaintEventArgs e)
{
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
e.Graphics.FillRectangle(new SolidBrush(Color.Black),
rectangles[i, j]);
}
}

for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
e.Graphics.DrawRectangle(new Pen(Color.White),
rectangles[i, j]);
}
}

}

private void button1_Click(object sender, EventArgs e)
{
var frm = new Form2();
frm.color = myColors;
frm.Show();
}

private void rbtnBlue_CheckedChanged(object sender, EventArgs e)
{
brushColor = Color.Blue;
}

private void rbtnRed_CheckedChanged(object sender, EventArgs e)
{
brushColor = Color.Red;
}

private void rbtnBlack_CheckedChanged(object sender, EventArgs e)
{
brushColor = Color.Black;
}

}
}

Form2.cs——用于显示取模结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace qumo
{
public partial class Form2 : Form
{
public bool[,] color;
private int[] res;

StringBuilder textStr = new StringBuilder("{");
public Form2()
{
color = new bool[8, 8];
res = new int[8];
InitializeComponent();
}


private void Form2_Load(object sender, EventArgs e)
{

for (int i = 0; i < 8; i++)
{
res[i] = getNumFromBinary(getRow(color, i));
}

for (int j = 0; j < 8; j++)
{
textStr.Append("0x" + Convert.ToString(res[j], 16));
if (j != 7)
{
textStr.Append(',');
}
}
textStr.Append("};");

textBox1.Text = textStr.ToString();
}

/// <summary>
/// 获取二维数组的行指针
/// </summary>
/// <param name="arr"></param>
/// <param name="j"></param>
/// <returns></returns>
bool[] getRow(bool[,] arr, int j)
{
bool[] result = new bool[8];
for (int i = 0; i < 8; i++)
{
result[i] = arr[i, j];
}
return result;
}
/// <summary>
/// 根据数组的一行得到16进制数
/// </summary>
/// <param name="arr"></param>
/// <returns></returns>
int getNumFromBinary(bool[] arr)
{
int temp = 0;
for (int i = 7; i >= 0; i--)
{
if (arr[i])
{
temp += (int)Math.Pow(2, 7-i);
}
}
return temp;
}

}
}
2018-10-21 01:04:48
Next