循跡模組數碼管顯示
阿新 • • 發佈:2019-01-08
#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);