[原创] 【新版CH554评测-DIY】6.触控台灯(功能完成)

zhang7309   2018-5-23 22:32 楼主
查看之前的申请帖,发现时间显示功能未完成,因此本帖在上一贴的基础上进行改进完善

首先介绍一下触控台灯的功能:
可实现对LED灯的开关、调光控制,显示对当前按键的操作;
实时显示温湿度值,显示当前时间,并可对时间进行调整。

具体触摸按键功能如下:
板载K1、K2控制灯的开、关;K3、K4实现调光及调整时间;
LED开的情况下,按K3调亮LED,按K4键调暗LED;
LED关的情况下,按K3调整“时”(按一次,时加1);按K4键调整“分”(按一次,分加1)

单片机资源使用情况:
P10温湿度传感器接口;P30LED驱动板(输出PWM信号调光)
P12、P32-P35外节LCD液晶模块;P14-P17板载触摸按键
调光控制利用单片机PWM输出功能,复用到P3口;
时间使用看门狗定时器产生秒时基,软件实现时间显示功能(时间会有一定的误差),
IMG_20180522_225645.jpg
IMG_20180522_225650.jpg
IMG_20180522_225702.jpg
IMG_20180522_230116.jpg
IMG_20180522_230118.jpg
IMG_20180522_230132.jpg
IMG_20180522_230134.jpg

代码部分



  1. #include "..\Public\CH554.H"                                                   
  2. #include "..\Public\Debug.H"
  3. #include "TouchKey.H"
  4. #include "PWM.H"
  5. #include "stdio.h"
  6. #include "GPIO.H"
  7. #include <string.h>
  8. #include <intrins.h>
  9. #include "nokia_5110.h"
  10. #include "bmp_pixel.h"

  11. #pragma  NOAREGS
  12. sbit  P1_0= P1^0;  //DHT11数据口
  13. UINT8  U8FLAG,k;  
  14. UINT8  U8count,U8temp;  
  15. UINT8  U8T_data_H=0,U8T_data_L,U8RH_data_H=0,U8RH_data_L,U8checkdata;
  16. UINT8   U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  17. UINT8  U8comdata;  
  18. UINT8  outdata[4];
  19. //sbit LED0 = P1^6;
  20. //sbit LED1 = P1^7;

  21. void init_PWM(void);
  22. //void init_GPIO(void);
  23. void init_TK(void);
  24. void get_TK(void);
  25. void check_PWM(void);
  26. UINT8 x,y,t=0,h=22,m=52;
  27. bit led;


  28. void init_WDT(void)
  29. {
  30. CH554WDTModeSelect(0);
  31. IE_WDOG=0;
  32. CH554WDTFeed(0x48);

  33. }

  34. void get_time()
  35. {
  36. if(t>59)
  37. {
  38.   t=0;
  39.   m++;
  40. }
  41. if(m>59)
  42. {
  43.   m=0;
  44.   h++;
  45. }
  46. if(h>23)
  47. {
  48.   h=0;   
  49. }

  50. }



  51. void  COM(void)        //?????????
  52. {
  53.         UINT8 i;
  54.         for(i=0;i<8;i++)        
  55.         {
  56.                 U8FLAG=2;        
  57.                 while((!P1_0)&&U8FLAG++);//??254? ???????? 50us???????
  58.                 mDelayuS(40);
  59.                 U8temp=0;          //??????0??1         ?????????0????????? 1
  60.                 if(P1_0)U8temp=1;
  61.                 U8FLAG=2;
  62.                 while((P1_0)&&U8FLAG++);           //??0/1???????
  63.                 //?????for??                  
  64.                 // if(U8FLAG==1)break;                        //??255us ???????                    
  65.                 U8comdata<<=1;
  66.                 U8comdata|=U8temp;        
  67.         }
  68. }

  69. void RH(void)
  70. {
  71.   //????18ms
  72.    P1_0=0;
  73.    mDelaymS(20);
  74.    P1_0=1;
  75. //????????? ????20us
  76.          mDelayuS(30);
  77.   
  78. //?????? ????????
  79.    P1_0=1;
  80. //?????????????? ?????????,???????         
  81.    if(!P1_0) //p20==0????         
  82.    {
  83.    U8FLAG=2;
  84. //?????? 80us ????????????         
  85.    while((!P1_0)&&U8FLAG++);  //??????????254us
  86.    U8FLAG=2;
  87.   //?????? 80us ????,????????????
  88.    while((P1_0)&&U8FLAG++);
  89. //??????                 
  90.    COM();
  91.    U8RH_data_H_temp=U8comdata;
  92.    COM();
  93.    U8RH_data_L_temp=U8comdata;
  94.    COM();
  95.    U8T_data_H_temp=U8comdata;
  96.    COM();
  97.    U8T_data_L_temp=U8comdata;
  98.    COM();
  99.    U8checkdata_temp=U8comdata;
  100.    P1_0=1;
  101. //????

  102.    U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  103.     if(U8temp==U8checkdata_temp)
  104.      {
  105.              U8RH_data_H=U8RH_data_H_temp;
  106.              U8RH_data_L=U8RH_data_L_temp;  //????0
  107.           U8T_data_H=U8T_data_H_temp;
  108.              U8T_data_L=U8T_data_L_temp;    //????0
  109.              U8checkdata=U8checkdata_temp;
  110.      }
  111.    }
  112. }
  113. void convert(UINT8 a,UINT8 b)
  114. {
  115.   UINT8 i,j;
  116.         i=a%10;
  117.         j=a/10;
  118.   outdata[0]=i+0x30;
  119.   outdata[1]=j+0x30;
  120.         i=b%10;
  121.         j=b/10;
  122.   outdata[2]=i+0x30;
  123.   outdata[3]=j+0x30;
  124. }



  125. void initio( )
  126. {
  127.    // Port1Cfg(3,0);   //p1.0
  128.         Port1Cfg(3,2);   //p1.2
  129.    //          Port3Cfg(3,1);   //p1.1
  130.    // Port3Cfg(3,1);   //p3.2
  131.     Port3Cfg(3,2);   //p3.3
  132.         Port3Cfg(3,3);   //p3.4
  133.     Port3Cfg(3,4);   //p3.5
  134.         Port3Cfg(3,5);   //p3.6
  135. //        Port3Cfg(3,6);   //p3.6
  136. //        Port3Cfg(3,7);   //p3.6
  137. }

  138. void LCD_dis()
  139. {
  140.                 convert(U8RH_data_H,U8T_data_H);  //转换成字符
  141. //                LCD_write_english_string(0,0," Hello World! ");
  142.         //        mDelaymS(500);
  143. //        LCD_write_english_string(0,0," Nokia5110 LCD");
  144.         //        mDelaymS(500);
  145.         //        LCD_write_english_string(0,3,"DHT11 Testing");
  146. //                mDelaymS(500);
  147.         LCD_write_chinese_string(12,0,12,4,10,5);
  148.                 LCD_write_chinese_string(12,2,12,4,4,5);
  149.        
  150.                 LCD_write_english_string(0,4,"T:");
  151.                 LCD_write_char(outdata[3]); //温度高位
  152.                 LCD_write_char(outdata[2]);  //温度低位
  153.                 LCD_write_char(0x7c);   
  154.                 LCD_write_char('C');  LCD_write_char(' ');
  155.                 LCD_write_char('H');LCD_write_char(':');
  156.                 LCD_write_char(outdata[1]);   //湿度高位
  157.                 LCD_write_char(outdata[0]);   //湿度地位
  158.                 LCD_write_char('%');
  159.                 LCD_write_english_string(0,5,"Time ");
  160.             LCD_write_char(h/10+48);
  161.                 LCD_write_char(h%10+48);
  162.                 LCD_write_char(':');
  163.                 LCD_write_char(m/10+48);
  164.                 LCD_write_char(m%10+48);
  165.                 LCD_write_char(':');
  166.                 LCD_write_char(t/10+48);
  167.                 LCD_write_char(t%10+48);
  168.         //        mDelaymS(500);
  169. //                LCD_write_chinese_string(12,4,12,4,0,5);
  170.                
  171.         //        LCD_clear();


  172. }



  173. main( )
  174. {
  175.     /*
  176.        
  177.         CfgFsys( );                                                                //CH554时钟选择配置   
  178.     mDelaymS(5);                                                               //配置时钟后,建议延时稳定时钟
  179.     mInitSTDIO( );
  180.         init_PWM();

  181.         init_TK();                                                            //串口0初始化
  182.     printf("start ...\n");

  183.     while(1)
  184.         {
  185.                 get_TK();
  186.                 mDelaymS(100);
  187.     }

  188.         */
  189.         UINT16 j = 0;
  190.     CfgFsys( );                                                                //CH554时钟选择配置   
  191.     mDelaymS(20);
  192.         mInitSTDIO( );
  193.            y=0x2f;
  194.         init_PWM();       
  195.         init_TK();
  196.     initio( );
  197.     LCD_init(); //?????   
  198.         LCD_clear();
  199.         mDelaymS(50);
  200.         LCD_write_chinese_string(12,0,12,4,10,5);
  201.         LCD_write_chinese_string(12,4,12,4,0,5);
  202.         mDelaymS(1000);
  203.         RH();
  204.          LCD_clear();
  205.         mDelaymS(50);
  206. //        LCD_write_english_string(0,0,"  LED -- OFF ");
  207.         init_WDT();
  208.         while(1)  
  209.         {
  210.                 if(WDOG_COUNT>=0xb6)
  211.                  {
  212.                    t++;
  213.                    WDOG_COUNT=0x00;
  214.                  }
  215.                  get_time();
  216.                 get_TK();
  217.                  if(t%3==0)
  218.                  RH();   //测量温湿度
  219.             LCD_dis();
  220.        
  221.   
  222.                

  223.         }       


  224. }

  225. void init_PWM(void)
  226. {
  227.            PWM1PINAlter( );

  228. //   P3_MOD_OC &= ~(bPWM1_| bPWM2_);                                             //设置PWM引脚为推挽输出
  229. //   P3_DIR_PU |= bPWM1_ | bPWM2_;
  230.         Port3Cfg(1,0);   //p3.0       
  231. //        Port3Cfg(1,1);   //p3.1               
  232.    
  233.     SetPWMClk(4);                                                              //PWM时钟配置        ,4分频
  234.     ForceClearPWMFIFO( );                                                      //强制清除PWM FIFO和COUNT
  235.     CancleClearPWMFIFO( );                                                     //取消清除PWM FIFO和COUNT
  236.     PWM1OutEnable( );                                                          //允许PWM1输出                           
  237. //   PWM2OutEnable( );                                                          //允许PWM2输出        

  238.     PWM1OutPolarHighAct( );                                                    //PWM1输出默认低,高有效                                                   
  239. //    PWM2OutPolarLowAct( );                                                     //PWM2输出默认高,低有效
  240.         SetPWM1Dat(0x00);                                                          //占空比0x10/256                                                         
  241. //    SetPWM2Dat(0xf0);       

  242. }

  243. /*
  244. void init_GPIO( void )
  245. {
  246.     Port1Cfg(1,6);                                                             //P16设置推挽模式
  247.     Port1Cfg(1,7);                                                             //P17设置推挽模式
  248.     LED0 = 0;
  249.     LED1 = 0;       

  250.    // GPIOInterruptCfg();                                                        //GPIO中断配置函数       
  251.   //  EA = 1;
  252. }
  253.   */
  254. void init_TK(void)
  255. {
  256.     TK_Init( BIT4+BIT5+BIT6+BIT7,  1, 1 );                /* Choose TIN2, TIN3, TIN4, TIN5 for touchkey input. enable interrupt. */
  257.         TK_SelectChannel(0);                                                                                        /* NOTICE: ch is not compatible with the IO actually. */
  258.         EA = 1;       

  259. }
  260. void get_TK(void)
  261. {
  262.                   if( Touch_IN != 0 )
  263.                 {
  264.                         if( Touch_IN & CH2 )
  265.                         {
  266.                         //        printf("CH2 is pressed.\n");
  267.                         //        printf("LED ON.\n");
  268.                         //        LED0=1 ;
  269.                         //        LED1=1 ;
  270.                            led=0;
  271.                            x=0;
  272.                            SetPWM1Dat(x);
  273.                            LCD_write_english_string(0,0,"  LED -- OFF ");
  274.                            LCD_write_english_string(0,1,"             ");
  275.                            mDelaymS(500);
  276.                            LCD_write_english_string(0,0,"             ");
  277.                         }
  278.                         if( Touch_IN & CH3 )
  279.                         {
  280.                         //        printf("CH3 is pressed.\n");
  281.                         //        printf("LED OFF.\n");
  282.                         //        LED0=0 ;
  283.                         //        LED1=0 ;
  284.                             led=1;
  285.                             x=y;
  286.                            SetPWM1Dat(x);
  287.                            LCD_write_english_string(0,0,"  LED -- ON  ");
  288.                            LCD_write_english_string(0,1,"             ");
  289.                            mDelaymS(500);
  290.                            LCD_write_english_string(0,0,"             ");
  291.                         }
  292.                         if( Touch_IN & CH4 )
  293.                         {
  294.                         //        printf("CH3 is pressed.\n");
  295.                         //        printf("LED OFF.\n");
  296.                         //        LED0=0 ;
  297.                         //        LED1=0 ;
  298.                            if(led==1)
  299.                            {
  300.                             
  301.                             if(x<255&led==1)
  302.                                 {
  303.                              x=x+3;
  304.                              SetPWM1Dat(x);
  305.                                  LCD_write_english_string(0,0,"  LED -- ON  ");
  306.                                  LCD_write_english_string(0,1," Light: ++++ ");
  307.                          //LCD_write_char('*');
  308.                                  mDelaymS(50);
  309.                                  LCD_write_english_string(0,1,"             ");
  310.                             }
  311.                                 else
  312.                                 {
  313.                                 LCD_write_english_string(0,0,"  LED -- ON  ");
  314.                                 LCD_write_english_string(0,1," Light: MAX  ");
  315.                                
  316.                                 }
  317.                                 y=x;
  318.                                 LCD_write_english_string(0,0,"             ");
  319.                            }
  320.                            else
  321.                             {
  322.                              h++;
  323.                                  mDelaymS(200);
  324.                                 }
  325.                         }
  326.                         if( Touch_IN & CH5 )
  327.                         {
  328.                         //        printf("CH3 is pressed.\n");
  329.                         //        printf("LED OFF.\n");
  330.                         //        LED0=0 ;
  331.                         //        LED1=0 ;
  332.                           if(led==1)
  333.                           {
  334.                             if(x>1&led==1)
  335.                             {
  336.                                  x=x-3;
  337.                              SetPWM1Dat(x);
  338.                                  LCD_write_english_string(0,0,"  LED -- ON  ");
  339.                                  LCD_write_english_string(0,1," Light: ---- ");
  340.                                  mDelaymS(50);
  341.                                  LCD_write_english_string(0,1,"             ");
  342.                             }
  343.                                 else
  344.                                 {
  345.                                 LCD_write_english_string(0,0,"  LED -- ON  ");
  346.                                 LCD_write_english_string(0,1," Light: MIN  ");
  347.                                
  348.                                 }
  349.                                 y=x;
  350.                                 LCD_write_english_string(0,0,"             ");
  351.                           }
  352.                           else
  353.                           {
  354.                             m++;
  355.                                 mDelaymS(200);
  356.                                 }
  357.                         }
  358.        
  359.                         Touch_IN = 0;
  360.                 }
  361.         //        LCD_dis();
  362. }


  363. void check_PWM(void)
  364. {
  365.         UINT8 x=0x00;
  366.         if(PWM_CTRL&bPWM_IF_END)
  367.           {
  368.         PWM_CTRL |= bPWM_IF_END;                                               //清除PWM中断                               
  369.         
  370.          for(x=0;x<255;x++)
  371.                 {
  372.                 SetPWM1Dat(x);
  373.                 mDelaymS(10);
  374.                 }
  375.                  for(x=255;x>0;x--)
  376.                 {
  377.                 SetPWM1Dat(x);
  378.                 mDelaymS(10);
  379.                 }
  380.                
  381. /*                       
  382. #ifdef DE_PRINTF
  383.     printf("PWM_CYC_END  %02X\n",(UINT16)PWM_CTRL);
  384. #endif           */
  385.              
  386.       }         





  387. }



DIY部分完成。



此内容由EEWORLD论坛网友zhang7309原创,如需转载或用于商业用途需征得作者同意并注明出处


视频效果地址:http://v.youku.com/v_show/id_XMz ... j.8428770.3416059.1











回复评论 (1)

存储芯片/MCU/SRAM/PSRAM/DDR/FLASH/MRAM。web.www.sramsun.com  QQ3161422826 TEL:13751192923
点赞  2018-5-24 09:33
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复