ホームページ > バックエンド開発 > C#.Net チュートリアル > C 言語メモ - C 言語に基づく流水ティッカー

C 言語メモ - C 言語に基づく流水ティッカー

little bottle
リリース: 2019-04-10 13:56:20
転載
4799 人が閲覧しました

今日、大学 2 年生のときにマーキーについて学んだことを突然思い出しました。そのときは、コードを 1 つずつ入力して、最終的にマーキー状態を実行しました。実行したときの最終的な効果は今でも覚えています。エンティティのコードは本当に楽しいので、早速、マーキーの作成プロセスを共有します。

#1. タイトル:

##マーキー

( 1) 基本要件

正確なタイミングのために 8254 を使用すると、LED 点灯パターンは LED8 ~ LED1 になり、各 LED の点灯時間間隔はロジック レベル スイッチ K1、K2、および K3 によって決まります。選択。 K1 の時間間隔は 0.5 秒、K2 の時間間隔は 1.0 秒、K3 の時間間隔は 1.5 秒です。ホストのキーボードのいずれかのキーが押されると、プレゼンテーションを停止します。

(2) 設計のヒント

8255 の A ポートを使用して LED ライトを接続し、B ポートを使用してロジック レベルを接続します。スイッチ K1、K2、および K3 。ライトの制御は8254の割り込みサービスプログラムで完了します。メインプログラムはスイッチの変化を検出し、LEDライトの点灯時間間隔を変更します。

# (3) さらなる設計要件

LED の点灯パターンは LED8-LED1-LED8


2. 分析:

基本原理設計

ステップ 1: 8255 は B ポートを使用してモード 0 で動作し、入力を実行し、スイッチを取得します (注: コース設定操作を容易にするために、同じ実装要件を持つ K3、K2、K1 を K2、K1、K0 に置き換えます。) K2K1K0 の値、ここには 3 つの値があり、バイナリ エンコードでは 100,010,001、つまり 4、2、1 になります。 LEDの点灯点にそれぞれ対応する10進数で、点灯時間間隔は1.5秒、1.0秒、0.5秒です。


ステップ 2: 8254 は作業方法 3 を採用します。固定周波数の方形波を生成して、割り込みサービス ルーチンを継続的にトリガーします。メインプログラムでは、8255のポートBの入力値を取得し、その入力値に応じて8254のカウンタ1に対応する初期値を書き込み、OUT1端に固定周波数の方形波信号を取得します。ランプは方形波の発生を確認するために使用され、方形波の周波数は、1.5秒、1.0秒、0.5秒の時間間隔に相当するランプの点滅周波数によって大まかに判断できます。


ステップ 3: 8254 によって生成された方形波信号を出力します。割り込みインターフェイス IR10 に接続され、方形波信号の周波数を使用して、特定の時間間隔で割り込みサービス プログラムを開始するために使用されます。

#ステップ 4: 割り込みサービス プログラムがロードされ、8254 の方形波周波数に従って特定の時間間隔内で実行されます。割り込みサービスプログラムでは、8255のポートAの出力を変更してLED7~LED0の点滅変化を制御、つまりマーキーを実現しています。


3. コードの実装:

#
//******************************************************************************************************************
/*
实验接线:
	8254:
		片选信号CS接Y0;GATE0、GATE1级联接+5V;CLK0接1MHz;CLK1接OUT0;
		OUT1接k5(进行8254的方波显示);
	8255:
		片选信号CS接Y1;A口作为输出用排线接LED灯;PB0、PB1、PB2作为输入分别接K0、K1、K2;
	中断:
		IR10接OUT1(中断控制程序控制LED灯的闪烁变化);
*/
//******************************************************************************************************************
//8255模块的设置
void  init(void);//初始化
void	ISR(void);
int i=0,j=0;
const unsigned short
Port8255Base = 0x288;  
const unsigned char
    ControlWord8255 = 0x82;
void init8255(void);// 8255初始化
//******************************************************************************************************************
//关于8254模块的设置
//通道0: 控制字00110110 -> 36H,即0x36,CLK0=1MHz,OUT0=0.01s,初值=F(clk)*T(out) 初始值:COUNT0=10000
//通道1: 控制字01110110 -> 76H,即0x76,CLK1=OUT0,初值=T1(out)/T1(clk)
//当OUT1=0.5s,k3=0,k2=0,k0=1,1 初始值:COUNT1=50
//当OUT1=1.0s,k3=0,k2=1,k0=0,2 初始值:COUNT1=100
//当OUT1=1.5s,k3=1,k2=0,k0=0,4 初始值:COUNT1=150
void	init8254(void);// 8254初始化
const unsigned short
Port8254Base = 0x280,   //计数器1端口地址为p8254Base+1,端口地址为p8254Base+3.
counter0=10000;
const unsigned char
ControlWord8254ch0 = 0x36, ControlWord8254ch1 = 0x76;
unsigned short  
	counter1=100;//计数器初值
byte   pData; 
unsigned char pdata=0x80;
bool flag=true;
//******************************************************************************************************************

//主函数
void main()
{  
      init();
	  init8254();// 8254初始化
	  init8255();//8255初始化
	  printf("\n start...\n");
	  while (!_kbhit())
	  {
			PortReadByte(Port8255Base + 1, &pData);	
			
			//写入计数器1的初始值
			if(pData==1){
				//k0为1的情况,k2k1k0=001,即时间间隔为0.5秒
				counter1=50;
				PortWriteByte(Port8254Base+1 , counter1%256); // 写计数器1计数初值低8位
				PortWriteByte(Port8254Base+1 , counter1/256); // 写计数器1计数初值高8位
				printf("=switch state:%x  LED灯点亮间隔0.5秒=\n",pData);	
			}
			if(pData==2){
				//k1为1的情况,k2k1k0=010,即时间间隔为1.0秒
				counter1=100;
				PortWriteByte(Port8254Base+1 , counter1%256); // 写计数器1计数初值低8位
				PortWriteByte(Port8254Base+1 , counter1/256); // 写计数器1计数初值高8位
				printf("=switch state:%x  LED灯点亮间隔1.0秒=\n",pData);	

			}
			if(pData==4){
				//k2为1的情况,k2k1k0=100,即时间间隔为1.5秒
				counter1=150;
				PortWriteByte(Port8254Base+1 , counter1%256); // 写计数器1计数初值低8位
				PortWriteByte(Port8254Base+1 , counter1/256); // 写计数器1计数初值高8位
				printf("=switch state:%x  LED灯点亮间隔1.5秒=\n",pData);	
	     }		 
		  sleep(3000);// delay 1s

		  EnableIntr(); // 开中断,功能等效于汇编语言指令sti
		  RegisterLocalISREx(ISR,10); // 加载中断服务程
		  printf("Wait for the switch state change...\n\n");
          }
	  _getch();
	   printf("\n Press any key over...\n");
       //DisableIntr(); // 开中断,功能等效于汇编语言指令cli
	   Cleanup();
}

//中断服务程序,实现跑马灯的流水
void	ISR(void)
 {
     if(flag)
	 {
		_asm
		{
			 ror  pdata,1  //循环右移指令		 
		}
	 }
	 else
	 {
		_asm
		{
			rol  pdata,1  //循环左移指令
		}
	 }
	j++;
	if(j==7)
	{
		flag = false;
	}
	if(j==14){
		flag = true;
		j=0;
	}
	 PortWriteByte(Port8255Base,pdata);
 }

//机箱的初始化
void  init(void)
{
     if(!Startup())	// 加载实验平台I/O驱动程序		
	   {
		  printf("\n\n        ERROR: Open Device Error!请打开实验箱电源\n");
		   _getch();
		  exit(0); // return to Windows
	   }
  }

//8254初始化
void	init8254(void)
 {
	PortWriteByte(Port8254Base + 3, ControlWord8254ch0); // 写计数器0控制字
	PortWriteByte(Port8254Base + 3, ControlWord8254ch1); // 写计数器1控制字
	PortWriteByte(Port8254Base , counter0%256); // 写计数器0计数初值低8位
	PortWriteByte(Port8254Base , counter0/256); // 写计数器0计数初值高8位
 }

//8255初始化
void	init8255(void)
{
    PortWriteByte(Port8255Base + 3, ControlWord8255); // 写8255控制字  
	PortWriteByte(Port8255Base,pdata);
}
ログイン後にコピー

[推奨コース: C ビデオチュートリアル]

以上がC 言語メモ - C 言語に基づく流水ティッカーの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート