找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1982|回复: 0
收起左侧

触摸屏版dtmf模拟电话拨码系统STM32源程序

[复制链接]
ID:311215 发表于 2019-6-29 17:29 | 显示全部楼层 |阅读模式
自己设计的,模拟dtmf电话拨码系统,开发板用的是stm32,功能是通过按键输出到stm32,并通过TFTLCD显示。刚开始用的矩阵键盘,但由于开发板io口有限,自己做了一个触摸屏,并在触摸屏上显示数字,通过tlc5615输出两路叠加的模拟信号。本工程为大致工程,有问题请回帖

单片机源程序如下:
  1. #include "sys.h"
  2. #include "usart.h"               
  3. #include "delay.h"        
  4. #include "led.h"   
  5. #include "lcd.h"  
  6. #include "key.h"  
  7. #include "24cxx.h"  
  8. #include "touch.h"  
  9. #include <stdlib.h>
  10. #include "delay.h"
  11. #include "tlc5615.h"
  12. #include "wave_form.h"
  13. //#include "stm32f10x_rcc.h"
  14. //#include "stm32f10x_spi.h"
  15. //#include "stm32f10x_gpio.h"

  16.            
  17. void Draw_Board(void);
  18. void Scan_Board(void);
  19. //void TCL5615_init(void);
  20. //void sin_wave(void);
  21. void Load_Drow_Dialog(void)
  22. {
  23.         LCD_Clear(WHITE);//清屏   
  24.          POINT_COLOR=BLUE;//设置字体为蓝色
  25.         LCD_ShowString(lcddev.width-24,0,200,16,16,"RST");//显示清屏区域
  26.           POINT_COLOR=RED;//设置画笔蓝色
  27. }
  28. ////////////////////////////////////////////////////////////////////////////////
  29. //电容触摸屏专有部分
  30. //画水平线
  31. //x0,y0:坐标
  32. //len:线长度
  33. //color:颜色
  34. void gui_draw_hline(u16 x0,u16 y0,u16 len,u16 color)
  35. {
  36.         if(len==0)return;
  37.         LCD_Fill(x0,y0,x0+len-1,y0,color);        
  38. }
  39. //画实心圆
  40. //x0,y0:坐标
  41. //r:半径
  42. //color:颜色
  43. void gui_fill_circle(u16 x0,u16 y0,u16 r,u16 color)
  44. {                                                                                          
  45.         u32 i;
  46.         u32 imax = ((u32)r*707)/1000+1;
  47.         u32 sqmax = (u32)r*(u32)r+(u32)r/2;
  48.         u32 x=r;
  49.         gui_draw_hline(x0-r,y0,2*r,color);
  50.         for (i=1;i<=imax;i++)
  51.         {
  52.                 if ((i*i+x*x)>sqmax)// draw lines from outside  
  53.                 {
  54.                          if (x>imax)
  55.                         {
  56.                                 gui_draw_hline (x0-i+1,y0+x,2*(i-1),color);
  57.                                 gui_draw_hline (x0-i+1,y0-x,2*(i-1),color);
  58.                         }
  59.                         x--;
  60.                 }
  61.                 // draw lines from inside (center)  
  62.                 gui_draw_hline(x0-x,y0+i,2*x,color);
  63.                 gui_draw_hline(x0-x,y0-i,2*x,color);
  64.         }
  65. }  
  66. //两个数之差的绝对值
  67. //x1,x2:需取差值的两个数
  68. //返回值:|x1-x2|
  69. u16 my_abs(u16 x1,u16 x2)
  70. {                        
  71.         if(x1>x2)return x1-x2;
  72.         else return x2-x1;
  73. }  
  74. //画一条粗线
  75. //(x1,y1),(x2,y2):线条的起始坐标
  76. //size:线条的粗细程度
  77. //color:线条的颜色
  78. void lcd_draw_bline(u16 x1, u16 y1, u16 x2, u16 y2,u8 size,u16 color)
  79. {
  80.         u16 t;
  81.         int xerr=0,yerr=0,delta_x,delta_y,distance;
  82.         int incx,incy,uRow,uCol;
  83.         if(x1<size|| x2<size||y1<size|| y2<size)return;
  84.         delta_x=x2-x1; //计算坐标增量
  85.         delta_y=y2-y1;
  86.         uRow=x1;
  87.         uCol=y1;
  88.         if(delta_x>0)incx=1; //设置单步方向
  89.         else if(delta_x==0)incx=0;//垂直线
  90.         else {incx=-1;delta_x=-delta_x;}
  91.         if(delta_y>0)incy=1;
  92.         else if(delta_y==0)incy=0;//水平线
  93.         else{incy=-1;delta_y=-delta_y;}
  94.         if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
  95.         else distance=delta_y;
  96.         for(t=0;t<=distance+1;t++ )//画线输出
  97.         {  
  98.                 gui_fill_circle(uRow,uCol,size,color);//画点
  99.                 xerr+=delta_x ;
  100.                 yerr+=delta_y ;
  101.                 if(xerr>distance)
  102.                 {
  103.                         xerr-=distance;
  104.                         uRow+=incx;
  105.                 }
  106.                 if(yerr>distance)
  107.                 {
  108.                         yerr-=distance;
  109.                         uCol+=incy;
  110.                 }
  111.         }  
  112. }   
  113. ////////////////////////////////////////////////////////////////////////////////
  114. //5个触控点的颜色                                                                                                
  115. //电阻触摸屏测试函数
  116. void rtp_test(void)
  117. {
  118.         u8 key;
  119.         u8 i=0;         
  120.         while(1)
  121.         {
  122.                  key=KEY_Scan(0);
  123.                 Scan_Board();
  124. //                tp_dev.scan(0);                  
  125. //                if(tp_dev.sta&TP_PRES_DOWN)                        //触摸屏被按下
  126. //                {        
  127. //                         if(tp_dev.x[0]<lcddev.width&&tp_dev.y[0]<lcddev.height)
  128. //                        {        
  129. //                                if(tp_dev.x[0]>(lcddev.width-24)&&tp_dev.y[0]<16)
  130. //                                {
  131. //                                        Load_Drow_Dialog();//清除
  132. //                                        LCD_ShowString(30,40,200,24,24,"1");
  133. //                                }
  134. ////                                else TP_Draw_Big_Point(tp_dev.x[0],tp_dev.y[0],RED);                //画图                                    
  135. //                        }
  136. //                }else delay_ms(10);        //没有按键按下的时候            
  137.                 if(key==KEY0_PRES)        //KEY0按下,则执行校准程序
  138.                 {
  139.                         LCD_Clear(WHITE);//清屏
  140.                     TP_Adjust();  //屏幕校准
  141.                         TP_Save_Adjdata();         
  142.                         Load_Drow_Dialog();
  143.                 }
  144.                 i++;
  145.                 if(i%20==0)LED0=!LED0;
  146.         }
  147. }
  148. const u16 POINT_COLOR_TBL[CT_MAX_TOUCH]={RED,GREEN,BLUE,BROWN,GRED};  
  149. //电容触摸屏测试函数
  150. void ctp_test(void)
  151. {
  152.         u8 t=0;
  153.         u8 i=0;                     
  154.          u16 lastpos[5][2];                //最后一次的数据
  155.         while(1)
  156.         {
  157.                 tp_dev.scan(0);
  158.                 for(t=0;t<CT_MAX_TOUCH;t++)//最多5点触摸
  159.                 {
  160.                         if((tp_dev.sta)&(1<<t))//判断是否有点触摸?
  161.                         {
  162.                                 if(tp_dev.x[t]<lcddev.width&&tp_dev.y[t]<lcddev.height)//在LCD范围内
  163.                                 {
  164.                                         if(lastpos[t][0]==0XFFFF)
  165.                                         {
  166.                                                 lastpos[t][0] = tp_dev.x[t];
  167.                                                 lastpos[t][1] = tp_dev.y[t];
  168.                                         }
  169.                                         lcd_draw_bline(lastpos[t][0],lastpos[t][1],tp_dev.x[t],tp_dev.y[t],2,POINT_COLOR_TBL[t]);//画线
  170.                                         lastpos[t][0]=tp_dev.x[t];
  171.                                         lastpos[t][1]=tp_dev.y[t];
  172.                                         if(tp_dev.x[t]>(lcddev.width-24)&&tp_dev.y[t]<16)
  173.                                         {
  174.                                                 Load_Drow_Dialog();//清除
  175.                                         }
  176.                                 }
  177.                         }else lastpos[t][0]=0XFFFF;
  178.                 }
  179.                
  180.                 delay_ms(5);i++;
  181.                 if(i%20==0)LED0=!LED0;
  182.         }        
  183. }
  184. void Draw_Check(void)
  185. {
  186.         LCD_DrawLine(10,195+10,240-10,195+10);//00
  187.         LCD_DrawLine(10,230+10,240-10,230+10);
  188.         LCD_DrawLine(10,265+10,240-10,265+10);
  189.         LCD_DrawLine(10+55,160+10,10+55,320-10);
  190.         LCD_DrawLine(10+55,160+10,10+55,320-10);
  191.         LCD_DrawLine(10+110,160+10,10+110,320-10);
  192.         LCD_DrawLine(10+165,160+10,10+165,320-10);
  193. }
  194. void LCD_ShowNumber(void)
  195. {
  196.         LCD_ShowString(25,175,25,25,24,"1");
  197.         LCD_ShowString(75,175,25,25,24,"2");
  198.         LCD_ShowString(125,175,25,25,24,"3");
  199.         LCD_ShowString(180,175,25,25,24,"A");
  200.         LCD_ShowString(25,210,25,25,24,"4");
  201.         LCD_ShowString(75,210,25,25,24,"5");
  202.         LCD_ShowString(125,210,25,25,24,"6");
  203.         LCD_ShowString(180,210,25,25,24,"B");
  204.         LCD_ShowString(25,245,25,25,24,"7");
  205.         LCD_ShowString(75,245,25,25,24,"8");
  206.         LCD_ShowString(125,245,25,25,24,"9");
  207.         LCD_ShowString(180,245,25,25,24,"C");
  208.         LCD_ShowString(25,280,25,25,24,"*");
  209.         LCD_ShowString(75,280,25,25,24,"0");
  210.         LCD_ShowString(125,280,25,25,24,"#");
  211.         LCD_ShowString(180,280,25,25,24,"D");
  212. }
  213. void Draw_Board(void)
  214. {
  215.         LCD_DrawRectangle(10,160+10,240-10,320-10);
  216. }

  217. //void Scan_Board(void)
  218. //{
  219. ////        u8 show_string[8];00
  220. ////show_string = (u8 *) malloc(1);00
  221. //                tp_dev.scan(0);                  
  222. //                if(tp_dev.sta&TP_PRES_DOWN)                        //触摸屏被按下
  223. //                {        
  224. ////                        printf("x:%3d, y:%3d\r\n",tp_dev.x[0], tp_dev.y[0]);00
  225. //                         if(tp_dev.x[0]<(240-5)&&tp_dev.y[0]<(320-5))
  226. //                        {        
  227. //                                if(tp_dev.x[0]>(5)&&tp_dev.y[0]>(160+5));
  228. //                                {
  229. //                                        LCD_ShowString(30,40,200,24,24,"X:");
  230. //                                        LCD_ShowxNum(60,40,(u32)tp_dev.x[0],3,24,0x00);
  231. //                                        LCD_ShowString(30,70,200,24,24,"Y:");
  232. //                                        LCD_ShowxNum(60,70,(u32)tp_dev.y[0],3,24,0x00);
  233. //                                }                             
  234. //                        }
  235. //                }else delay_ms(10);        //没有按键按下的时候
  236. ////        free(show_string);        00        
  237. //}
  238. void Scan_Board(void)
  239. {
  240.         tp_dev.scan(0);                  
  241.                 if(tp_dev.sta&TP_PRES_DOWN)                        //触摸屏被按下
  242.                 {        
  243.                         if(tp_dev.x[0]<(65)&&tp_dev.y[0]<(205)&&tp_dev.x[0]>10&&tp_dev.y[0]>170)
  244.                         {
  245.                                 LCD_ShowString(60,50,200,16,16,"The Number Is:");        
  246.                                 LCD_ShowString(60,70,200,16,16,"1");
  247.                                 sin_wave();
  248.                         }                        
  249.                         if(tp_dev.x[0]<(120)&&tp_dev.y[0]<(205)&&tp_dev.x[0]>65&&tp_dev.y[0]>170)
  250.                         {
  251.                                 LCD_ShowString(60,50,200,16,16,"The Number Is:");        
  252.                                 LCD_ShowString(60,70,200,16,16,"2");
  253.                         }
  254.                         if(tp_dev.x[0]<(175)&&tp_dev.y[0]<(205)&&tp_dev.x[0]>120&&tp_dev.y[0]>170)
  255.                         {
  256.                                 LCD_ShowString(60,50,200,16,16,"The Number Is:");        
  257.                                 LCD_ShowString(60,70,200,16,16,"3");
  258.                         }
  259.                         if(tp_dev.x[0]<(230)&&tp_dev.y[0]<(205)&&tp_dev.x[0]>175&&tp_dev.y[0]>170)
  260.                         {
  261.                                 LCD_ShowString(60,50,200,16,16,"The Number Is:");        
  262.                                 LCD_ShowString(60,70,200,16,16,"A");
  263.                         }
  264.                         if(tp_dev.x[0]<(65)&&tp_dev.y[0]<(240)&&tp_dev.x[0]>10&&tp_dev.y[0]>205)
  265.                         {
  266.                                 LCD_ShowString(60,50,200,16,16,"The Number Is:");        
  267.                                 LCD_ShowString(60,70,200,16,16,"4");
  268.                         }                        
  269.                         if(tp_dev.x[0]<(120)&&tp_dev.y[0]<(240)&&tp_dev.x[0]>65&&tp_dev.y[0]>205)
  270.                         {
  271.                                 LCD_ShowString(60,50,200,16,16,"The Number Is:");        
  272.                                 LCD_ShowString(60,70,200,16,16,"5");
  273.                         }                        
  274.                         if(tp_dev.x[0]<(175)&&tp_dev.y[0]<(240)&&tp_dev.x[0]>120&&tp_dev.y[0]>205)
  275.                         {
  276.                                 LCD_ShowString(60,50,200,16,16,"The Number Is:");        
  277.                                 LCD_ShowString(60,70,200,16,16,"6");
  278.                         }               
  279.       if(tp_dev.x[0]<(230)&&tp_dev.y[0]<(240)&&tp_dev.x[0]>175&&tp_dev.y[0]>205)
  280.                         {
  281.                                 LCD_ShowString(60,50,200,16,16,"The Number Is:");        
  282.                                 LCD_ShowString(60,70,200,16,16,"B");
  283.                         }               
  284.       if(tp_dev.x[0]<(65)&&tp_dev.y[0]<(275)&&tp_dev.x[0]>10&&tp_dev.y[0]>240)
  285.                         {
  286.                                 LCD_ShowString(60,50,200,16,16,"The Number Is:");        
  287.                                 LCD_ShowString(60,70,200,16,16,"7");
  288.                         }
  289.       if(tp_dev.x[0]<(120)&&tp_dev.y[0]<(275)&&tp_dev.x[0]>65&&tp_dev.y[0]>240)
  290.                         {
  291.                                 LCD_ShowString(60,50,200,16,16,"The Number Is:");        
  292.                                 LCD_ShowString(60,70,200,16,16,"8");
  293.                         }
  294.       if(tp_dev.x[0]<(175)&&tp_dev.y[0]<(275)&&tp_dev.x[0]>120&&tp_dev.y[0]>240)
  295.                         {
  296.                                 LCD_ShowString(60,50,200,16,16,"The Number Is:");        
  297.                                 LCD_ShowString(60,70,200,16,16,"9");
  298.                         }
  299.                         if(tp_dev.x[0]<(230)&&tp_dev.y[0]<(275)&&tp_dev.x[0]>175&&tp_dev.y[0]>240)
  300.                         {
  301.                                 LCD_ShowString(60,50,200,16,16,"The Number Is:");        
  302.                                 LCD_ShowString(60,70,200,16,16,"C");
  303.                         }
  304.       if(tp_dev.x[0]<(65)&&tp_dev.y[0]<(310)&&tp_dev.x[0]>10&&tp_dev.y[0]>275)
  305.                         {
  306.                                 LCD_ShowString(60,50,200,16,16,"The Number Is:");        
  307.                                 LCD_ShowString(60,70,200,16,16,"*");
  308.                         }
  309.                         if(tp_dev.x[0]<(120)&&tp_dev.y[0]<(310)&&tp_dev.x[0]>65&&tp_dev.y[0]>275)
  310.                         {
  311.                                 LCD_ShowString(60,50,200,16,16,"The Number Is:");        
  312.                                 LCD_ShowString(60,70,200,16,16,"0");
  313.                         }
  314.                         if(tp_dev.x[0]<(175)&&tp_dev.y[0]<(310)&&tp_dev.x[0]>120&&tp_dev.y[0]>275)
  315.                         {
  316.                                 LCD_ShowString(60,50,200,16,16,"The Number Is:");        
  317.                                 LCD_ShowString(60,70,200,16,16,"#");
  318.                         }
  319.                         if(tp_dev.x[0]<(230)&&tp_dev.y[0]<(310)&&tp_dev.x[0]>175&&tp_dev.y[0]>275)
  320.                         {
  321.                                 LCD_ShowString(60,50,200,16,16,"The Number Is:");        
  322.                                 LCD_ShowString(60,70,200,16,16,"D");
  323.                         }
  324.                 }
  325.         }

  326. int main(void)
  327. {                 
  328.          Stm32_Clock_Init(9);        //系统时钟设置
  329.         uart_init(72,9600);                 //串口初始化为9600
  330.         delay_init(72);                            //延时初始化
  331.         LED_Init();                                  //初始化与LED连接的硬件接口
  332.         LCD_Init();                                   //初始化LCD         
  333.         KEY_Init();                                //按键初始化
  334.   TCL5615_init();        
  335.         tp_dev.init();                        //触摸屏初始化
  336.          POINT_COLOR=RED;//设置字体为红色
  337. //        LCD_ShowString(60,50,200,16,16,"The Number Is:");        
  338. //        LCD_ShowString(60,70,200,16,16,"TOUCH TEST");        
  339. //        LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
  340. //        LCD_ShowString(60,110,200,16,16,"2014/3/11");
  341.            //if(tp_dev.touchtype!=0XFF)LCD_ShowString(60,130,200,16,16,"Press KEY0 to Adjust");//电阻屏才显示
  342.         delay_ms(1500);
  343.         Load_Drow_Dialog();//清屏
  344.         LCD_ShowNumber();
  345. //        LCD_ShowString(25,175,25,25,24,"1");
  346. //        LCD_ShowString(75,175,25,25,24,"2");
  347. //        LCD_ShowString(125,175,25,25,24,"3");
  348. //        LCD_ShowString(180,175,25,25,24,"A");
  349. //        LCD_ShowString(25,210,25,25,24,"4");
  350. //        LCD_ShowString(75,210,25,25,24,"5");
  351. //        LCD_ShowString(125,210,25,25,24,"6");
  352. //        LCD_ShowString(180,210,25,25,24,"B");
  353. //        LCD_ShowString(25,245,25,25,24,"7");
  354. //        LCD_ShowString(75,245,25,25,24,"8");
  355. //        LCD_ShowString(125,245,25,25,24,"9");
  356. //        LCD_ShowString(180,245,25,25,24,"C");
  357. //        LCD_ShowString(25,280,25,25,24,"*");
  358. //        LCD_ShowString(75,280,25,25,24,"0");
  359. //        LCD_ShowString(125,280,25,25,24,"#");
  360. //        LCD_ShowString(180,280,25,25,24,"D");
  361. //        LCD_DrawLine(10,195+10,240-10,195+10);//00
  362. //        LCD_DrawLine(10,230+10,240-10,230+10);
  363. //        LCD_DrawLine(10,265+10,240-10,265+10);
  364. //        LCD_DrawLine(10+55,160+10,10+55,320-10);
  365. //        LCD_DrawLine(10+55,160+10,10+55,320-10);
  366. //        LCD_DrawLine(10+110,160+10,10+110,320-10);
  367. //        LCD_DrawLine(10+165,160+10,10+165,320-10);
  368.   Draw_Check();
  369.         Draw_Board();        
  370.         if(tp_dev.touchtype&0X80)ctp_test();        //电容屏测试
  371.         else rtp_test();                                                 //电阻屏测试
  372. }
复制代码

所有资料51hei提供下载:
触摸屏按键.7z (271.78 KB, 下载次数: 20)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表