Heim  >  Artikel  >  Backend-Entwicklung  >  Hinweise zur C-Sprache – Fließwasserticker basierend auf der C-Sprache

Hinweise zur C-Sprache – Fließwasserticker basierend auf der C-Sprache

little bottle
little bottlenach vorne
2019-04-10 13:56:054671Durchsuche

Heute fiel mir plötzlich ein, dass ich im zweiten Studienjahr etwas über Marquee gelernt habe. Damals habe ich den Code einzeln eingegeben und schließlich den Marquee-Status ausgeführt Der Code für die Entität ist wirklich angenehm. Ohne weitere Umschweife werde ich Ihnen den Marquee-Produktionsprozess vorstellen.

1. Frage:

Festzelt

(1)Grundlegende Anforderungen

Unter Verwendung von 8254 für präzises Timing ist das LED-Leuchtmuster LED8-LED1. Das Leuchtzeitintervall jeder LED wird durch die Logikpegelschalter K1, K2 und bestimmt K3-Auswahl. Das Zeitintervall von K1 beträgt 0,5 S, das Zeitintervall von K2 beträgt 1,0 S und das Zeitintervall von K3 beträgt 1,5 S. Stoppt die Präsentation, wenn eine beliebige Taste auf der Host-Tastatur gedrückt wird.

(2) Designtipps

Verwenden Sie den A-Port des 8255, um das LED-Licht anzuschließen, und den B-Port, um die Logikebene anzuschließen Schalter K1, K2 und K3 . Die Steuerung des Lichts wird im Interrupt-Service-Programm von 8254 abgeschlossen. Das Hauptprogramm erkennt die Änderung des Schalters und ändert das Zeitintervall für das Aufleuchten des LED-Lichts.

(3) Weitere Designanforderungen

Das Beleuchtungsmuster von LED wird zu LED8-LED1-LED8


2. Analyse:

Grundprinzip-Design

Schritt 1: 8255 verwendet den B-Port, um im Modus 0 zu arbeiten, Eingaben durchzuführen und Schalter zu erhalten (Hinweis: Um Kurseinstellungsvorgänge zu erleichtern, verwenden wir K2 , K1, K0 ersetzen K3, K2, K1 mit denselben Implementierungsanforderungen.) Der Wert von K2K1K0, hier gibt es drei Werte, die 100.010.001 in Binärcodierung sind, also 4, 2 und 1 in Dezimalzahl. entsprechend den LED-Lichtpunkten. Die Beleuchtungszeitintervalle betragen 1,5 s, 1,0 s und 0,5 s.


Schritt 2: 8254 übernimmt Arbeitsmodus drei Erzeugen Sie eine Rechteckwelle mit fester Frequenz, um die Interrupt-Serviceroutine kontinuierlich auszulösen. Rufen Sie im Hauptprogramm den Eingangswert von Port B von 8255 ab, schreiben Sie den entsprechenden Anfangswert entsprechend dem Eingangswert in Zähler 1 von 8254 und erhalten Sie am OUT1-Ende ein Rechteckwellensignal mit fester Frequenz. Hier schließen wir einen entsprechenden K7 an Die Lampe wird verwendet, um die Erzeugung der Rechteckwelle zu überprüfen, und die Frequenz der Rechteckwelle kann grob anhand der Blinkfrequenz der Lampe beurteilt werden, die den Zeitintervallen 1,5 s, 1,0 s und 0,5 s entspricht.


Schritt 3: Geben Sie das von 8254 erzeugte Rechtecksignal aus , Angeschlossen an die Interrupt-Schnittstelle IR10, dient es dazu, die Frequenz des Rechtecksignals zu nutzen, um in bestimmten Zeitintervallen das Interrupt-Serviceprogramm zu initiieren.

Schritt 4: Das Interrupt-Service-Programm wird geladen und innerhalb eines bestimmten Zeitintervalls gemäß der Rechteckwellenfrequenz von 8254 ausgeführt. Im Interrupt-Service-Programm wird der Ausgang von Port A von 8255 geändert, um die blinkenden Änderungen von LED7-LED0 zu steuern, also den Laufschriftbereich zu realisieren.


3. Code-Implementierung:

//******************************************************************************************************************
/*
实验接线:
	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);
}

[Empfohlener Kurs: C-Video-Tutorial]

Das obige ist der detaillierte Inhalt vonHinweise zur C-Sprache – Fließwasserticker basierend auf der C-Sprache. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen