1. 程式人生 > >循跡模組數碼管顯示

循跡模組數碼管顯示

在這裡插入圖片描述

#define out_1 2
#define out_2 3
#define out_3 4
#define out_4 5
#define out_5 6

void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  pinMode(out_1, INPUT);
  pinMode(out_2, INPUT);
  pinMode(out_3, INPUT);
  pinMode(out_4, INPUT);
  pinMode(out_5, INPUT)
; } void loop() { int Value_out_1 = digitalRead(out_1); int Value_out_2 = digitalRead(out_2); int Value_out_3 = digitalRead(out_3); int Value_out_4 = digitalRead(out_4); int Value_out_5 = digitalRead(out_5); Serial.println("五路循跡模組檢測訊號:"); Serial.print("Value_out_1="); Serial.println
(Value_out_1); Serial.print("Value_out_2="); Serial.println(Value_out_2); Serial.print("Value_out_3="); Serial.println(Value_out_3); Serial.print("Value_out_4="); Serial.println(Value_out_4); Serial.print("Value_out_5="); Serial.println(Value_out_5); delay(2000); }

在這裡插入圖片描述

例程資料下載:

http://www.kbgogo.com/forum.php?mod=viewthread&tid=10274

#include "TM1637.h"
#define CLK 3//pins definitions for TM1637 and can be changed to other ports       
#define DIO 2
TM1637 tm1637(CLK,DIO);
void setup()
{
  tm1637.init();
  tm1637.set(BRIGHT_TYPICAL);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
}
void loop()
{
  int8_t NumTab[] = {1,2,3};//0~9,A,b,C,d,E,F
  int8_t ListDisp[4];
  unsigned char i = 0;
  unsigned char count = 0;
  delay(150);
  while(1)
  {
    i = 0;
    for(unsigned char BitSelect = 0;BitSelect < 4;BitSelect ++)
    {
      ListDisp[BitSelect] = NumTab[i];
      i ++;
      if(i == sizeof(NumTab)) i = 0;
    }
    
    tm1637.display(0,ListDisp[0]);
    tm1637.display(1,ListDisp[1]); 
    tm1637.display(2,ListDisp[2]);
    delay(300);
  }
}

在這裡插入圖片描述
TFT


#include \"touch.h\"

#include \"lcd.h\"

#include \"delay.h\"

#include \"stdlib.h\"

#include \"math.h\"

#include \"24cxx.h\"   

#include \"spi.h\"

#include \"mmc_sd.h\"

#include \"led.h\"

#define SPI_TOUCH

 

Pen_Holder Pen_Point;//定義筆實體

//預設為touchtype=0的資料.

u8 CMD_RDX=0XD0;

u8 CMD_RDY=0X90;

// void ADS_Write_Byte(u8 num)   

// { 

//  u8 count=0;  

//  for(count=0;count<8;count++) 

//  {    

//      if(num&0x80)TDIN=1; 

//      else TDIN=0;  

//      num<<=1;   

//      TCLK=0;//上升沿有效      

//      TCLK=1;     

//  }              

// }        

//從7846/7843/XPT2046/UH7843/UH7846讀取adc值      

u16 ADS_Read_AD(u8 CMD)  

{        

    u16 Num=0;

#ifndef SPI_TOUCH  

    u8 count=0;

#endif

    TCLK=0;                    //先拉低時鐘  

    TCS=0;                     //選中ADS7843

#ifdef SPI_TOUCH

  SPI2_SetSpeed(SPI_SPEED_16); 

    SPI2_ReadWriteByte(CMD);   //傳送命令字

#else

    ADS_Write_Byte(CMD);

#endif

    delay_us(6);               //ADS7846的轉換時間最長為6us

    TCLK=1;                    //給1個時鐘,清除BUSY          

    TCLK=0;

#ifdef SPI_TOUCH

  Num=SPI2_ReadWriteByte(0);

    Num<<=8;

  Num=Num|SPI2_ReadWriteByte(0);   

#else

    for(count=0;count<16;count++) 

    {                

        Num<<=1;  

        TCLK=0;//下降沿有效                

        TCLK=1;

        if(DOUT)Num++;      

    }

#endif

    Num>>=4;                   //只有高12位有效.

    TCS=1;                     //釋放ADS7843  

    return(Num);  

}

//讀取一個座標值

//連續讀取READ_TIMES次資料,對這些資料升序排列,

//然後去掉最低和最高LOST_VAL個數,取平均值

#define READ_TIMES 15     //讀取次數

#define LOST_VAL 5        //丟棄值

u16 ADS_Read_XY(u8 xy)

{

    u16 i, j;

    u16 buf[READ_TIMES];

    u16 sum=0;

    u16 temp;

    for(i=0;i<READ_TIMES;i++)

    {               

        buf[i]=ADS_Read_AD(xy);    

    }                  

    for(i=0;i<READ_TIMES-1; i++)//排序

    {

        for(j=i+1;j<READ_TIMES;j++)

        {

            if(buf[i]>buf[j])       //升序排列

            {

                temp=buf[i];

                buf[i]=buf[j];

                buf[j]=temp;

            }

        }

    }    

    sum=0;

    for(i=LOST_VAL;i<READ_TIMES-LOST_VAL;i++)sum+=buf[i];

    temp=sum/(READ_TIMES-2*LOST_VAL);

    return temp;  

}

//帶濾波的座標讀取

//最小值不能少於100.

u8 Read_ADS(u16 *x,u16 *y)

{

    u16 xtemp,ytemp;                         

    xtemp=ADS_Read_XY(CMD_RDX);

    ytemp=ADS_Read_XY(CMD_RDY);                                                   

    if(xtemp<100||ytemp<100)return 0;//讀數失敗

    *x=xtemp;

    *y=ytemp;

    return 1;                        //讀數成功

}  

//2次讀取ADS7846,連續讀取2次有效的AD值,且這兩次的偏差不能超過

//50,滿足條件,則認為讀數正確,否則讀數錯誤.     

//該函式能大大提高準確度

#define ERR_RANGE 50 //誤差範圍

u8 Read_ADS2(u16 *x,u16 *y)

{

    u16 x1,y1;

    u16 x2,y2;

    u8 flag;   

    flag=Read_ADS(&x1,&y1);  

    if(flag==0)return(0);

    flag=Read_ADS(&x2,&y2);   

    if(flag==0)return(0);  

    if(((x2<=x1&&x1<x2+ERR_RANGE)||(x1<=x2&&x2<x1+ERR_RANGE))//前後兩次取樣在+-50內

    &&((y2<=y1&&y1<y2+ERR_RANGE)||(y1<=y2&&y2<y1+ERR_RANGE)))

    {

        *x=(x1+x2)/2;

        *y=(y1+y2)/2;

        return 1;

    }else return 0;  

}

//讀取一次座標值  

//僅僅讀取一次,知道PEN鬆開才返回!                      

u8 Read_TP_Once(void)

{

    u8 t=0;    

    Pen_Int_Set(0);           //關閉中斷

    Pen_Point.Key_Sta=Key_Up;

    Read_ADS2(&Pen_Point.X,&Pen_Point.Y);

    while(PEN==0&&t<=250)

    {

        t++;

        delay_ms(10);

    };

    Pen_Int_Set(1);//開啟中斷       

    if(t>=250)return 0;//按下2.5s 認為無效

    else return 1; 

}

 

//////////////////////////////////////////////////

//與LCD部分有關的函式 

//畫一個觸控點

//用來校準用的

void Drow_Touch_Point(u8 x,u16 y)

{

    LCD_DrawLine(x-12,y,x+13,y);//橫線

    LCD_DrawLine(x,y-12,x,y+13);//豎線

    LCD_DrawPoint(x+1,y+1);

    LCD_DrawPoint(x-1,y+1);

    LCD_DrawPoint(x+1,y-1);

    LCD_DrawPoint(x-1,y-1);

    Draw_Circle(x,y,6);//畫中心圈

}    

//畫一個大點

//2*2的點           

void Draw_Big_Point(u8 x,u16 y)

{      

    LCD_DrawPoint(x,y);//中心點

    LCD_DrawPoint(x+1,y);

    LCD_DrawPoint(x,y+1);

    LCD_DrawPoint(x+1,y+1);        

}

//////////////////////////////////////////////////

 

//轉換結果

//根據觸控式螢幕的校準引數來決定轉換後的結果,儲存在X0,Y0中

void Convert_Pos(void)

{            

    if(Read_ADS2(&Pen_Point.X,&Pen_Point.Y))

    {

        Pen_Point.X0=Pen_Point.xfac*Pen_Point.X+Pen_Point.xoff;

        Pen_Point.Y0=Pen_Point.yfac*Pen_Point.Y+Pen_Point.yoff; 

    }

}     

//中斷,檢測到PEN腳的一個下降沿.

//置位Pen_Point.Key_Sta為按下狀態

//中斷線11線上的中斷檢測

void EXTI9_5_IRQHandler(void)

{                   

    Pen_Point.Key_Sta=Key_Down;//按鍵按下

  LED0=~LED0;  

    EXTI->PR=1<<5;  //清除LINE5上的中斷標誌位

}

//PEN中斷設定   

void Pen_Int_Set(u8 en)

{

    if(en)EXTI->IMR|=1<<5;   //開啟line5上的中斷    

    else EXTI->IMR&=~(1<<5); //關閉line5上的中斷   

}        

//////////////////////////////////////////////////////////////////////////

//此部分涉及到使用外部EEPROM,如果沒有外部EEPROM,遮蔽此部分即可

#ifdef ADJ_SAVE_ENABLE

//儲存在EEPROM裡面的地址區間基址,佔用13個位元組(RANGE:SAVE_ADDR_BASE~SAVE_ADDR_BASE+12)

#define SAVE_ADDR_BASE 40

//儲存校準引數                                           

void Save_Adjdata(void)

{

      s32 temp;         

    //儲存校正結果!                                    

      temp=Pen_Point.xfac*100000000;//儲存x校正因素     

    AT24CXX_WriteLenByte(SAVE_ADDR_BASE,temp,4);  

      temp=Pen_Point.yfac*100000000;//儲存y校正因素   

    AT24CXX_WriteLenByte(SAVE_ADDR_BASE+4,temp,4);

    //儲存x偏移量

    AT24CXX_WriteLenByte(SAVE_ADDR_BASE+8,Pen_Point.xoff,2);           

    //儲存y偏移量

      AT24CXX_WriteLenByte(SAVE_ADDR_BASE+10,Pen_Point.yoff,2);

    //儲存觸屏型別

      AT24CXX_WriteOneByte(SAVE_ADDR_BASE+12,Pen_Point.touchtype); 

      temp=0X0A;//標記校準過了

      AT24CXX_WriteOneByte(SAVE_ADDR_BASE+13,temp);         

}

//得到儲存在EEPROM裡面的校準值

//返回值:1,成功獲取資料

//        0,獲取失敗,要重新校準

u8 Get_Adjdata(void)

{                    

    s32 tempfac;

//  tempfac=AT24CXX_ReadOneByte(SAVE_ADDR_BASE+13);//讀取標記字,看是否校準過!      

    if(AT24CXX_ReadOneByte(SAVE_ADDR_BASE+13)==0X0A)//觸控式螢幕已經校準過了           

    {                                                   

        tempfac=AT24CXX_ReadLenByte(SAVE_ADDR_BASE,4);        

        Pen_Point.xfac=(float)tempfac/100000000;//得到x校準引數

        tempfac=AT24CXX_ReadLenByte(SAVE_ADDR_BASE+4,4);                     

        Pen_Point.yfac=(float)tempfac/100000000;//得到y校準引數

        //得到x偏移量

        Pen_Point.xoff=AT24CXX_ReadLenByte(SAVE_ADDR_BASE+8,2);              

        //得到y偏移量

        Pen_Point.yoff=AT24CXX_ReadLenByte(SAVE_ADDR_BASE+10,2);                     

        Pen_Point.touchtype=AT24CXX_ReadOneByte(SAVE_ADDR_BASE+12);//讀取觸屏型別標記

        if(Pen_Point.touchtype)//X,Y方向與螢幕相反

        {

            CMD_RDX=0X90;

            CMD_RDY=0XD0;   

        }else                  //X,Y方向與螢幕相同

        {

            CMD_RDX=0XD0;

            CMD_RDY=0X90;   

        }       

        return 1;   

    }

    return 0;

}

#endif 

//

void ADJ_INFO_SHOW(u8*str)

{

    LCD_ShowString(40,40,\"x1:       y1:       \");

    LCD_ShowString(40,60,\"x2:       y2:       \");

    LCD_ShowString(40,80,\"x3:       y3:       \");

    LCD_ShowString(40,100,\"x4:       y4:       \");

    LCD_ShowString(40,100,\"x4:       y4:       \");

    LCD_ShowString(40,120,str);                   

}

      

//觸控式螢幕校準程式碼

//得到四個校準引數

void Touch_Adjust(void)

{                               

    signed short pos_temp[4][2];//座標快取值

    u8  cnt=0; 

    u16 d1,d2;

    u32 tem1,tem2;

    float fac;    

    cnt=0;             

    POINT_COLOR=BLUE;

    BACK_COLOR =WHITE;

    LCD_Clear(WHITE);//清屏  

    POINT_COLOR=RED;//紅色

    LCD_Clear(WHITE);//清屏

    Drow_Touch_Point(20,20);//畫點1

    Pen_Point.Key_Sta=Key_Up;//消除觸發訊號

    Pen_Point.xfac=0;//xfac用來標記是否校準過,所以校準之前必須清掉!以免錯誤    

    while(1)

    {

        if(Pen_Point.Key_Sta==Key_Down)//按鍵按下了

        {

            if(Read_TP_Once())//得到單次按鍵值

            {                                 

                pos_temp[cnt][0]=Pen_Point.X;

                pos_temp[cnt][1]=Pen_Point.Y;

                cnt++;

            }           

            switch(cnt)

            {             

                case 1:

                    LCD_Clear(WHITE);//清屏

                    Drow_Touch_Point(220,20);//畫點2

                    break;

                case 2:

                    LCD_Clear(WHITE);