标题:
触摸屏版dtmf模拟电话拨码系统STM32源程序
[打印本页]
作者:
jetty-9
时间:
2019-6-29 17:29
标题:
触摸屏版dtmf模拟电话拨码系统STM32源程序
自己设计的,模拟dtmf电话拨码系统,开发板用的是stm32,功能是通过按键输出到stm32,并通过TFTLCD显示。刚开始用的矩阵键盘,但由于开发板io口有限,自己做了一个触摸屏,并在触摸屏上显示数字,通过tlc5615输出两路叠加的模拟信号。本工程为大致工程,有问题请回帖
单片机源程序如下:
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "lcd.h"
#include "key.h"
#include "24cxx.h"
#include "touch.h"
#include <stdlib.h>
#include "delay.h"
#include "tlc5615.h"
#include "wave_form.h"
//#include "stm32f10x_rcc.h"
//#include "stm32f10x_spi.h"
//#include "stm32f10x_gpio.h"
void Draw_Board(void);
void Scan_Board(void);
//void TCL5615_init(void);
//void sin_wave(void);
void Load_Drow_Dialog(void)
{
LCD_Clear(WHITE);//清屏
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(lcddev.width-24,0,200,16,16,"RST");//显示清屏区域
POINT_COLOR=RED;//设置画笔蓝色
}
////////////////////////////////////////////////////////////////////////////////
//电容触摸屏专有部分
//画水平线
//x0,y0:坐标
//len:线长度
//color:颜色
void gui_draw_hline(u16 x0,u16 y0,u16 len,u16 color)
{
if(len==0)return;
LCD_Fill(x0,y0,x0+len-1,y0,color);
}
//画实心圆
//x0,y0:坐标
//r:半径
//color:颜色
void gui_fill_circle(u16 x0,u16 y0,u16 r,u16 color)
{
u32 i;
u32 imax = ((u32)r*707)/1000+1;
u32 sqmax = (u32)r*(u32)r+(u32)r/2;
u32 x=r;
gui_draw_hline(x0-r,y0,2*r,color);
for (i=1;i<=imax;i++)
{
if ((i*i+x*x)>sqmax)// draw lines from outside
{
if (x>imax)
{
gui_draw_hline (x0-i+1,y0+x,2*(i-1),color);
gui_draw_hline (x0-i+1,y0-x,2*(i-1),color);
}
x--;
}
// draw lines from inside (center)
gui_draw_hline(x0-x,y0+i,2*x,color);
gui_draw_hline(x0-x,y0-i,2*x,color);
}
}
//两个数之差的绝对值
//x1,x2:需取差值的两个数
//返回值:|x1-x2|
u16 my_abs(u16 x1,u16 x2)
{
if(x1>x2)return x1-x2;
else return x2-x1;
}
//画一条粗线
//(x1,y1),(x2,y2):线条的起始坐标
//size:线条的粗细程度
//color:线条的颜色
void lcd_draw_bline(u16 x1, u16 y1, u16 x2, u16 y2,u8 size,u16 color)
{
u16 t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy,uRow,uCol;
if(x1<size|| x2<size||y1<size|| y2<size)return;
delta_x=x2-x1; //计算坐标增量
delta_y=y2-y1;
uRow=x1;
uCol=y1;
if(delta_x>0)incx=1; //设置单步方向
else if(delta_x==0)incx=0;//垂直线
else {incx=-1;delta_x=-delta_x;}
if(delta_y>0)incy=1;
else if(delta_y==0)incy=0;//水平线
else{incy=-1;delta_y=-delta_y;}
if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
else distance=delta_y;
for(t=0;t<=distance+1;t++ )//画线输出
{
gui_fill_circle(uRow,uCol,size,color);//画点
xerr+=delta_x ;
yerr+=delta_y ;
if(xerr>distance)
{
xerr-=distance;
uRow+=incx;
}
if(yerr>distance)
{
yerr-=distance;
uCol+=incy;
}
}
}
////////////////////////////////////////////////////////////////////////////////
//5个触控点的颜色
//电阻触摸屏测试函数
void rtp_test(void)
{
u8 key;
u8 i=0;
while(1)
{
key=KEY_Scan(0);
Scan_Board();
// tp_dev.scan(0);
// if(tp_dev.sta&TP_PRES_DOWN) //触摸屏被按下
// {
// if(tp_dev.x[0]<lcddev.width&&tp_dev.y[0]<lcddev.height)
// {
// if(tp_dev.x[0]>(lcddev.width-24)&&tp_dev.y[0]<16)
// {
// Load_Drow_Dialog();//清除
// LCD_ShowString(30,40,200,24,24,"1");
// }
//// else TP_Draw_Big_Point(tp_dev.x[0],tp_dev.y[0],RED); //画图
// }
// }else delay_ms(10); //没有按键按下的时候
if(key==KEY0_PRES) //KEY0按下,则执行校准程序
{
LCD_Clear(WHITE);//清屏
TP_Adjust(); //屏幕校准
TP_Save_Adjdata();
Load_Drow_Dialog();
}
i++;
if(i%20==0)LED0=!LED0;
}
}
const u16 POINT_COLOR_TBL[CT_MAX_TOUCH]={RED,GREEN,BLUE,BROWN,GRED};
//电容触摸屏测试函数
void ctp_test(void)
{
u8 t=0;
u8 i=0;
u16 lastpos[5][2]; //最后一次的数据
while(1)
{
tp_dev.scan(0);
for(t=0;t<CT_MAX_TOUCH;t++)//最多5点触摸
{
if((tp_dev.sta)&(1<<t))//判断是否有点触摸?
{
if(tp_dev.x[t]<lcddev.width&&tp_dev.y[t]<lcddev.height)//在LCD范围内
{
if(lastpos[t][0]==0XFFFF)
{
lastpos[t][0] = tp_dev.x[t];
lastpos[t][1] = tp_dev.y[t];
}
lcd_draw_bline(lastpos[t][0],lastpos[t][1],tp_dev.x[t],tp_dev.y[t],2,POINT_COLOR_TBL[t]);//画线
lastpos[t][0]=tp_dev.x[t];
lastpos[t][1]=tp_dev.y[t];
if(tp_dev.x[t]>(lcddev.width-24)&&tp_dev.y[t]<16)
{
Load_Drow_Dialog();//清除
}
}
}else lastpos[t][0]=0XFFFF;
}
delay_ms(5);i++;
if(i%20==0)LED0=!LED0;
}
}
void Draw_Check(void)
{
LCD_DrawLine(10,195+10,240-10,195+10);//00
LCD_DrawLine(10,230+10,240-10,230+10);
LCD_DrawLine(10,265+10,240-10,265+10);
LCD_DrawLine(10+55,160+10,10+55,320-10);
LCD_DrawLine(10+55,160+10,10+55,320-10);
LCD_DrawLine(10+110,160+10,10+110,320-10);
LCD_DrawLine(10+165,160+10,10+165,320-10);
}
void LCD_ShowNumber(void)
{
LCD_ShowString(25,175,25,25,24,"1");
LCD_ShowString(75,175,25,25,24,"2");
LCD_ShowString(125,175,25,25,24,"3");
LCD_ShowString(180,175,25,25,24,"A");
LCD_ShowString(25,210,25,25,24,"4");
LCD_ShowString(75,210,25,25,24,"5");
LCD_ShowString(125,210,25,25,24,"6");
LCD_ShowString(180,210,25,25,24,"B");
LCD_ShowString(25,245,25,25,24,"7");
LCD_ShowString(75,245,25,25,24,"8");
LCD_ShowString(125,245,25,25,24,"9");
LCD_ShowString(180,245,25,25,24,"C");
LCD_ShowString(25,280,25,25,24,"*");
LCD_ShowString(75,280,25,25,24,"0");
LCD_ShowString(125,280,25,25,24,"#");
LCD_ShowString(180,280,25,25,24,"D");
}
void Draw_Board(void)
{
LCD_DrawRectangle(10,160+10,240-10,320-10);
}
//void Scan_Board(void)
//{
//// u8 show_string[8];00
////show_string = (u8 *) malloc(1);00
// tp_dev.scan(0);
// if(tp_dev.sta&TP_PRES_DOWN) //触摸屏被按下
// {
//// printf("x:%3d, y:%3d\r\n",tp_dev.x[0], tp_dev.y[0]);00
// if(tp_dev.x[0]<(240-5)&&tp_dev.y[0]<(320-5))
// {
// if(tp_dev.x[0]>(5)&&tp_dev.y[0]>(160+5));
// {
// LCD_ShowString(30,40,200,24,24,"X:");
// LCD_ShowxNum(60,40,(u32)tp_dev.x[0],3,24,0x00);
// LCD_ShowString(30,70,200,24,24,"Y:");
// LCD_ShowxNum(60,70,(u32)tp_dev.y[0],3,24,0x00);
// }
// }
// }else delay_ms(10); //没有按键按下的时候
//// free(show_string); 00
//}
void Scan_Board(void)
{
tp_dev.scan(0);
if(tp_dev.sta&TP_PRES_DOWN) //触摸屏被按下
{
if(tp_dev.x[0]<(65)&&tp_dev.y[0]<(205)&&tp_dev.x[0]>10&&tp_dev.y[0]>170)
{
LCD_ShowString(60,50,200,16,16,"The Number Is:");
LCD_ShowString(60,70,200,16,16,"1");
sin_wave();
}
if(tp_dev.x[0]<(120)&&tp_dev.y[0]<(205)&&tp_dev.x[0]>65&&tp_dev.y[0]>170)
{
LCD_ShowString(60,50,200,16,16,"The Number Is:");
LCD_ShowString(60,70,200,16,16,"2");
}
if(tp_dev.x[0]<(175)&&tp_dev.y[0]<(205)&&tp_dev.x[0]>120&&tp_dev.y[0]>170)
{
LCD_ShowString(60,50,200,16,16,"The Number Is:");
LCD_ShowString(60,70,200,16,16,"3");
}
if(tp_dev.x[0]<(230)&&tp_dev.y[0]<(205)&&tp_dev.x[0]>175&&tp_dev.y[0]>170)
{
LCD_ShowString(60,50,200,16,16,"The Number Is:");
LCD_ShowString(60,70,200,16,16,"A");
}
if(tp_dev.x[0]<(65)&&tp_dev.y[0]<(240)&&tp_dev.x[0]>10&&tp_dev.y[0]>205)
{
LCD_ShowString(60,50,200,16,16,"The Number Is:");
LCD_ShowString(60,70,200,16,16,"4");
}
if(tp_dev.x[0]<(120)&&tp_dev.y[0]<(240)&&tp_dev.x[0]>65&&tp_dev.y[0]>205)
{
LCD_ShowString(60,50,200,16,16,"The Number Is:");
LCD_ShowString(60,70,200,16,16,"5");
}
if(tp_dev.x[0]<(175)&&tp_dev.y[0]<(240)&&tp_dev.x[0]>120&&tp_dev.y[0]>205)
{
LCD_ShowString(60,50,200,16,16,"The Number Is:");
LCD_ShowString(60,70,200,16,16,"6");
}
if(tp_dev.x[0]<(230)&&tp_dev.y[0]<(240)&&tp_dev.x[0]>175&&tp_dev.y[0]>205)
{
LCD_ShowString(60,50,200,16,16,"The Number Is:");
LCD_ShowString(60,70,200,16,16,"B");
}
if(tp_dev.x[0]<(65)&&tp_dev.y[0]<(275)&&tp_dev.x[0]>10&&tp_dev.y[0]>240)
{
LCD_ShowString(60,50,200,16,16,"The Number Is:");
LCD_ShowString(60,70,200,16,16,"7");
}
if(tp_dev.x[0]<(120)&&tp_dev.y[0]<(275)&&tp_dev.x[0]>65&&tp_dev.y[0]>240)
{
LCD_ShowString(60,50,200,16,16,"The Number Is:");
LCD_ShowString(60,70,200,16,16,"8");
}
if(tp_dev.x[0]<(175)&&tp_dev.y[0]<(275)&&tp_dev.x[0]>120&&tp_dev.y[0]>240)
{
LCD_ShowString(60,50,200,16,16,"The Number Is:");
LCD_ShowString(60,70,200,16,16,"9");
}
if(tp_dev.x[0]<(230)&&tp_dev.y[0]<(275)&&tp_dev.x[0]>175&&tp_dev.y[0]>240)
{
LCD_ShowString(60,50,200,16,16,"The Number Is:");
LCD_ShowString(60,70,200,16,16,"C");
}
if(tp_dev.x[0]<(65)&&tp_dev.y[0]<(310)&&tp_dev.x[0]>10&&tp_dev.y[0]>275)
{
LCD_ShowString(60,50,200,16,16,"The Number Is:");
LCD_ShowString(60,70,200,16,16,"*");
}
if(tp_dev.x[0]<(120)&&tp_dev.y[0]<(310)&&tp_dev.x[0]>65&&tp_dev.y[0]>275)
{
LCD_ShowString(60,50,200,16,16,"The Number Is:");
LCD_ShowString(60,70,200,16,16,"0");
}
if(tp_dev.x[0]<(175)&&tp_dev.y[0]<(310)&&tp_dev.x[0]>120&&tp_dev.y[0]>275)
{
LCD_ShowString(60,50,200,16,16,"The Number Is:");
LCD_ShowString(60,70,200,16,16,"#");
}
if(tp_dev.x[0]<(230)&&tp_dev.y[0]<(310)&&tp_dev.x[0]>175&&tp_dev.y[0]>275)
{
LCD_ShowString(60,50,200,16,16,"The Number Is:");
LCD_ShowString(60,70,200,16,16,"D");
}
}
}
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
uart_init(72,9600); //串口初始化为9600
delay_init(72); //延时初始化
LED_Init(); //初始化与LED连接的硬件接口
LCD_Init(); //初始化LCD
KEY_Init(); //按键初始化
TCL5615_init();
tp_dev.init(); //触摸屏初始化
POINT_COLOR=RED;//设置字体为红色
// LCD_ShowString(60,50,200,16,16,"The Number Is:");
// LCD_ShowString(60,70,200,16,16,"TOUCH TEST");
// LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
// LCD_ShowString(60,110,200,16,16,"2014/3/11");
//if(tp_dev.touchtype!=0XFF)LCD_ShowString(60,130,200,16,16,"Press KEY0 to Adjust");//电阻屏才显示
delay_ms(1500);
Load_Drow_Dialog();//清屏
LCD_ShowNumber();
// LCD_ShowString(25,175,25,25,24,"1");
// LCD_ShowString(75,175,25,25,24,"2");
// LCD_ShowString(125,175,25,25,24,"3");
// LCD_ShowString(180,175,25,25,24,"A");
// LCD_ShowString(25,210,25,25,24,"4");
// LCD_ShowString(75,210,25,25,24,"5");
// LCD_ShowString(125,210,25,25,24,"6");
// LCD_ShowString(180,210,25,25,24,"B");
// LCD_ShowString(25,245,25,25,24,"7");
// LCD_ShowString(75,245,25,25,24,"8");
// LCD_ShowString(125,245,25,25,24,"9");
// LCD_ShowString(180,245,25,25,24,"C");
// LCD_ShowString(25,280,25,25,24,"*");
// LCD_ShowString(75,280,25,25,24,"0");
// LCD_ShowString(125,280,25,25,24,"#");
// LCD_ShowString(180,280,25,25,24,"D");
// LCD_DrawLine(10,195+10,240-10,195+10);//00
// LCD_DrawLine(10,230+10,240-10,230+10);
// LCD_DrawLine(10,265+10,240-10,265+10);
// LCD_DrawLine(10+55,160+10,10+55,320-10);
// LCD_DrawLine(10+55,160+10,10+55,320-10);
// LCD_DrawLine(10+110,160+10,10+110,320-10);
// LCD_DrawLine(10+165,160+10,10+165,320-10);
Draw_Check();
Draw_Board();
if(tp_dev.touchtype&0X80)ctp_test(); //电容屏测试
else rtp_test(); //电阻屏测试
}
复制代码
所有资料51hei提供下载:
触摸屏按键.7z
(271.78 KB, 下载次数: 20)
2019-6-29 17:40 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1