使用Windows Form設計學號跑馬燈
發想
在我高中三年級的時候,我們的數位邏輯老師要求我們全班用數位邏輯電路做專題,兩位同學一組。題目共兩題,分別為"學號跑馬燈"和"紅綠燈",每一組同學可以自行選擇一個題目,在考統測之前繳交。如果功能完全符合老師題目的要求,就能拿到100分。我選擇的題目是"學號跑馬燈",功能大致如下:
- 使用兩個七段顯示器顯示自己的學號(我的學號是13050059),學號可以隨著無穩態多諧振盪器的振盪移動
- 設計一個開關。輸入高電位時,學號左移;輸入低電位時,學號右移。
電路圖:

由於電路體積龐大,這個專題花了我兩個多月的時間才得以在課堂上完成。現今除了高職的課程會使用不同的積體電路組合電路,大部分都採用可程式邏輯裝置設計電路,減少時間和出錯的機率。那麼,這個專題是否也能在Windows Form執行呢?
設計學號跑馬燈
設計表單

物件名稱
- Label:label1、lbLeft、lbRight、Direction
- TextBox:SudentIDNo
- RadioButton:SheftLeft、SheftRight
- Button:Start、Stop
- Timer:timer1

程式碼
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 StudentIDNo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string num = ""; //宣告字串
private void Form1_Load(object sender, EventArgs e)
{
//畫面執行時所產生的事件
ShiftLeft.Checked = true; //預設選取左移
timer1.Enabled = false; //停止計時
timer1.Interval = 1000; //計時時間為1秒
Start.Enabled = false; //"開始"按鈕停用
Stop.Enabled = false; //"停止"按鈕停用
Direction.Visible = false; //隱藏"移動方向"標籤
lbLeft.Enabled = false; //學號開始跑前設為灰字
lbRight.Enabled = false; //學號開始跑前設為灰字
}
private void Start_Click(object sender, EventArgs e)
{
//按下"開始"按鈕時所產生的事件
StudentIDNo.Enabled = false; //學號不能輸入
num = StudentIDNo.Text; //將學號存到num字串
timer1.Enabled = true; //開始計時
Start.Enabled = false; //"開始"按鈕停用
Stop.Enabled = true; //"停止"按鈕啟用
if (ShiftLeft.Checked == true) //如果選擇"左移"
{
ShiftRight.Enabled = false; //"右移"按鈕停用
Direction.Text = "← ← ← ← ←"; //顯示位移方向
}
else if (ShiftRight.Enabled == true) //如果選擇"右移"
{
ShiftLeft.Enabled = false; //"左移"按鈕停用
Direction.Text = "→ → → → →"; //顯示位移方向
}
}
private void Stop_Click(object sender, EventArgs e)
{
//按下"停止"按鈕時所產生的事件
StudentIDNo.Enabled = true; //可以輸入新的學號
timer1.Enabled = false; //開始計時
Start.Enabled = true; //"開始"按鈕停用
Stop.Enabled = false; //"停止"按鈕啟用
Direction.Visible = false; //隱藏"移動方向"標籤
ShiftLeft.Enabled = true; //"左移"按鈕啟用
ShiftRight.Enabled = true; //"右移"按鈕啟用
num = StudentIDNo.Text; //將學號重新存到num字串
}
private void timer1_Tick(object sender, EventArgs e)
{
//Timer1觸發所產生的事件
Direction.Visible = true; //顯示"移動方向"標籤
lbLeft.Enabled = true; //學號開始跑後設為黑字
lbRight.Enabled = true; //學號開始跑後設為黑字
if (ShiftLeft.Checked == true) //如果選擇"左移"
{
lbLeft.Text = num.Substring(0, 1); //左邊標籤的字為學號第1碼
lbRight.Text = num.Substring(1, 1); //右邊標籤的字為學號第2碼
}
else if (ShiftRight.Checked == true) //如果選擇"右移"
{
lbRight.Text = num.Substring(0, 1); //右邊標籤的字為學號第1碼
lbLeft.Text = num.Substring(1, 1); //左邊標籤的字為學號第2碼
}
num = num.Substring(1, StudentIDNo.TextLength - 1) + num.Substring(0, 1); //將學號第1碼排到最後面
}
private void StudentIDNo_TextChanged(object sender, EventArgs e)
{
//輸入字串所產生的事件
if (StudentIDNo.TextLength ==0) //如果沒有輸入學號
{
Start.Enabled = false; //"開始"按鈕停用
}
else //如果有輸入學號
{
Start.Enabled = true; //"開始"按鈕啟用
}
}
}
}
