ブルーブリッジカップ SCM——第 12 回地方大会の一部

トピックの要件:

 

 トピックの要件に従って、今回はデジタル管ディスプレイ、LED、NE555 測定周波数、PCF8091 モジュール、および独立したボタンが含まれます。

デジタル管ディスプレイ: 表示されるインターフェースは 3 つあります。私はサイクルインターフェイスを次のように理解していますT= \frac{1}{f} (これもNE555から)

LEDディスプレイ:

このモジュールは、S7 のロングキーとショートキーに密接に関連しています。このうち、S7の長キーと短キーの使い方は、リトルビー先生のタイマー方式を参考にしていますhttps://blog.csdn.net/ohy3686/article/details/82927113

unsigned char count_7 = 0;//用于定时器计时
unsigned char K_7 = 0;//当开关按下后变为1开关断开后变为0
unsigned char K_7_flag = 0;//用于长按键循环
void key()
{
   if(S7 == 0)
   {
   	  delay(10);
	  if(S7 == 0)
	  {
	      K_7 = 1;
		  while(S7 == 0)
		  {
		     Display();
		  }
		     K_7 = 0;
			 if(count_7 > 5)   //按键长按
             {    
               K_7_flag++;
			   if(K_7_flag > 1)
			   {
			   	 K_7_flag = 0;
			   }
             }
             else              //按键短按
             {
               temp_1_stay = temp_1;//保存当前采集到的频率数据
             }
             count_7 = 0;      //按键计数值清零
		   
	  }
   }
}
//定时器
void InitTimer() //定时器1定时,定时器0计数
{
  TMOD = 0x16;
  
  TH0 = 0xff;
  TL0 = 0xff;
  TH1 = (65536-50000)/256;
  TL1 = (65536-50000)%256;

  EA = 1;
  ET0 = 1;
  ET1 = 1;
  TR0 = 1;
  TR1 = 1;
} 
void Timer1() interrupt 3
{
  TH1 = (65536-50000)/256;
  TL1 = (65536-50000)%256;
  
  count_t++;//测量频率用
  if(count_t == 20)
  {
  	 temp_1 = count_f;
	 temp_2 = 100000/count_f;
	 count_t = 0;
	 count_f = 0;
  } 

  if(K_7 != 0)
  {
  	count_7++;
  }
}
//S7长按键的功能判断在main函数中

PCF8091 :

フォトレジスタやポテンショメータの電圧AD変換結果を表示します。0~255を0~5V以内の電圧表示に変換する必要があります

unsigned char i;//选择通道变量
unsigned char date;//存放得到的数据
//==================================电压
void ad_read()
{
  IIC_Start();
  IIC_SendByte(0x90);
  IIC_WaitAck();
  IIC_SendByte(i);
  IIC_WaitAck();
  IIC_Stop();

  IIC_Start();
  IIC_SendByte(0x91);
  IIC_Stop();
  date = IIC_RecByte();
  IIC_SendAck(0);
}

電圧表示について:

void work()
{
    ad_read();
	temp_3 = date*(50000/255)/100;//此时数码管显示两位小数的0~5v电压
	a = 0xc1;//1100 0001
	b = 0xbf;//1011 1111
	c = SMG[i];
	d = 0xff;
	e = 0xff;
	f = SMG_Point[temp_3/100];
	g = SMG[(temp_3/10)%10];
	h = SMG[temp_3%10];
}
//abcdefgh对于数码管的8位显示内容

メイン機能:

長押しサイクル機能を判定するために多くの方法が試みられてきた。単純にキー関数で K_7_flag が消灯に該当するか表示に該当するかを判定する場合、このようにして得られた結果は長押しで消灯、長押しで点灯することができますが、LED が点灯します。リアルタイム表示の機能はなくなりました。最後にmain関数のwhile(1)に入れてみてトピック要件を満たしました。

void main()
{  
  InitSystem();
  InitTimer();
  while(1)
  {
	key();
  	Work();

	Display();

	if(K_7_flag == 1)//长按键循环功能判断
    {
  	   stat_LED = 0xff;
	   InitHC138(4);
	   P0 = stat_LED;
    }
    else 
    {
       LED ();//只有将判断放入while(1)中LED才能实时显示
    }
  }
}

もっと簡単な方法があれば、提案してください。

おすすめ

転載: blog.csdn.net/weixin_49640235/article/details/124076462