社区导航

 
查看: 833|回复: 1

[原创] 【新版CH554评测-DIY】4.带LCD触摸LED灯

[复制链接]

483

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2018-5-15 11:06:51 | 显示全部楼层 |阅读模式
前段时间有点忙评测耽搁了,本次内容实现带LCD液晶显示的触摸调光灯
在上一贴的基础上,加上液晶显示(使用Nokia5110 LCD点阵液晶模块-无字库)
使用字符显示;
开关效果
IMG_20180515_001953.jpg

IMG_20180515_001938.jpg

调光效果
QQ图片20180515095135.png

QQ图片20180515095109.png

部分代码



  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;
  27. bit led;



  28. void  COM(void)        //?????????
  29. {
  30.         UINT8 i;
  31.         for(i=0;i<8;i++)        
  32.         {
  33.                 U8FLAG=2;        
  34.                 while((!P1_0)&&U8FLAG++);//??254? ???????? 50us???????
  35.                 mDelayuS(40);
  36.                 U8temp=0;          //??????0??1         ?????????0????????? 1
  37.                 if(P1_0)U8temp=1;
  38.                 U8FLAG=2;
  39.                 while((P1_0)&&U8FLAG++);           //??0/1???????
  40.                 //?????for??                  
  41.                 // if(U8FLAG==1)break;                        //??255us ???????                    
  42.                 U8comdata<<=1;
  43.                 U8comdata|=U8temp;        
  44.         }
  45. }

  46. void RH(void)
  47. {
  48.   //????18ms
  49.    P1_0=0;
  50.    mDelaymS(20);
  51.    P1_0=1;
  52. //????????? ????20us
  53.          mDelayuS(30);
  54.   
  55. //?????? ????????
  56.    P1_0=1;
  57. //?????????????? ?????????,???????         
  58.    if(!P1_0) //p20==0????         
  59.    {
  60.    U8FLAG=2;
  61. //?????? 80us ????????????         
  62.    while((!P1_0)&&U8FLAG++);  //??????????254us
  63.    U8FLAG=2;
  64.   //?????? 80us ????,????????????
  65.    while((P1_0)&&U8FLAG++);
  66. //??????                 
  67.    COM();
  68.    U8RH_data_H_temp=U8comdata;
  69.    COM();
  70.    U8RH_data_L_temp=U8comdata;
  71.    COM();
  72.    U8T_data_H_temp=U8comdata;
  73.    COM();
  74.    U8T_data_L_temp=U8comdata;
  75.    COM();
  76.    U8checkdata_temp=U8comdata;
  77.    P1_0=1;
  78. //????

  79.    U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  80.     if(U8temp==U8checkdata_temp)
  81.      {
  82.              U8RH_data_H=U8RH_data_H_temp;
  83.              U8RH_data_L=U8RH_data_L_temp;  //????0
  84.           U8T_data_H=U8T_data_H_temp;
  85.              U8T_data_L=U8T_data_L_temp;    //????0
  86.              U8checkdata=U8checkdata_temp;
  87.      }
  88.    }
  89. }
  90. void convert(UINT8 a,UINT8 b)
  91. {
  92.   UINT8 i,j;
  93.         i=a%10;
  94.         j=a/10;
  95.   outdata[0]=i+0x30;
  96.   outdata[1]=j+0x30;
  97.         i=b%10;
  98.         j=b/10;
  99.   outdata[2]=i+0x30;
  100.   outdata[3]=j+0x30;
  101. }



  102. void initio( )
  103. {
  104.    // Port1Cfg(3,0);   //p1.0
  105.         Port1Cfg(3,2);   //p1.2
  106.    //          Port3Cfg(3,1);   //p1.1
  107.    // Port3Cfg(3,1);   //p3.2
  108.     Port3Cfg(3,2);   //p3.3
  109.         Port3Cfg(3,3);   //p3.4
  110.     Port3Cfg(3,4);   //p3.5
  111.         Port3Cfg(3,5);   //p3.6
  112. //        Port3Cfg(3,6);   //p3.6
  113. //        Port3Cfg(3,7);   //p3.6
  114. }

  115. void LCD_dis()
  116. {
  117.                 convert(U8RH_data_H,U8T_data_H);  //转换成字符
  118. //                LCD_write_english_string(0,0," Hello World! ");
  119.         //        mDelaymS(500);
  120. //        LCD_write_english_string(0,0," Nokia5110 LCD");
  121.         //        mDelaymS(500);
  122.                 LCD_write_english_string(0,2,"DHT11 Testing");
  123. //                mDelaymS(500);
  124.                
  125.                 LCD_write_english_string(0,3,"  Shi du: ");
  126.                 LCD_write_char(outdata[1]);   //湿度高位
  127.                 LCD_write_char(outdata[0]);   //湿度地位
  128.                 LCD_write_char('%');
  129.                 LCD_write_english_string(0,4," Wen du: ");
  130.                 LCD_write_char(outdata[3]); //温度高位
  131.                 LCD_write_char(outdata[2]);  //温度低位
  132.                 LCD_write_char(0x27);   
  133.                 LCD_write_char('C');
  134.         //        mDelaymS(500);
  135. //                LCD_write_chinese_string(12,4,12,4,0,5);
  136.                
  137.         //        LCD_clear();


  138. }



  139. main( )
  140. {
  141.     /*
  142.        
  143.         CfgFsys( );                                                                //CH554时钟选择配置   
  144.     mDelaymS(5);                                                               //配置时钟后,建议延时稳定时钟
  145.     mInitSTDIO( );
  146.         init_PWM();

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

  149.     while(1)
  150.         {
  151.                 get_TK();
  152.                 mDelaymS(100);
  153.     }

  154.         */
  155.         UINT16 j = 0;
  156.     CfgFsys( );                                                                //CH554时钟选择配置   
  157.     mDelaymS(20);
  158.         mInitSTDIO( );
  159.    
  160.         init_PWM();       
  161.         init_TK();
  162.     initio( );
  163.     LCD_init(); //?????   
  164.         LCD_clear();
  165.         mDelaymS(50);
  166.         LCD_write_english_string(0,0,"  LED -- OFF ");
  167.         while(1)  
  168.         {
  169.                 get_TK();
  170.         //        RH();   //测量温湿度
  171.          //   LCD_dis();
  172.         //        mDelaymS(500);
  173.                 mDelaymS(50);
  174.    
  175.                

  176.         }       


  177. }

  178. void init_PWM(void)
  179. {
  180.            PWM1PINAlter( );

  181. //   P3_MOD_OC &= ~(bPWM1_| bPWM2_);                                             //设置PWM引脚为推挽输出
  182. //   P3_DIR_PU |= bPWM1_ | bPWM2_;
  183.         Port3Cfg(1,0);   //p3.0       
  184. //        Port3Cfg(1,1);   //p3.1               
  185.    
  186.     SetPWMClk(4);                                                              //PWM时钟配置        ,4分频
  187.     ForceClearPWMFIFO( );                                                      //强制清除PWM FIFO和COUNT
  188.     CancleClearPWMFIFO( );                                                     //取消清除PWM FIFO和COUNT
  189.     PWM1OutEnable( );                                                          //允许PWM1输出                           
  190. //   PWM2OutEnable( );                                                          //允许PWM2输出        

  191.     PWM1OutPolarHighAct( );                                                    //PWM1输出默认低,高有效                                                   
  192. //    PWM2OutPolarLowAct( );                                                     //PWM2输出默认高,低有效
  193.         SetPWM1Dat(0x00);                                                          //占空比0x10/256                                                         
  194. //    SetPWM2Dat(0xf0);       

  195. }

  196. /*
  197. void init_GPIO( void )
  198. {
  199.     Port1Cfg(1,6);                                                             //P16设置推挽模式
  200.     Port1Cfg(1,7);                                                             //P17设置推挽模式
  201.     LED0 = 0;
  202.     LED1 = 0;       

  203.    // GPIOInterruptCfg();                                                        //GPIO中断配置函数       
  204.   //  EA = 1;
  205. }
  206.   */
  207. void init_TK(void)
  208. {
  209.     TK_Init( BIT4+BIT5+BIT6+BIT7,  1, 1 );                /* Choose TIN2, TIN3, TIN4, TIN5 for touchkey input. enable interrupt. */
  210.         TK_SelectChannel(0);                                                                                        /* NOTICE: ch is not compatible with the IO actually. */
  211.         EA = 1;       

  212. }
  213. void get_TK(void)
  214. {
  215.                   if( Touch_IN != 0 )
  216.                 {
  217.                         if( Touch_IN & CH2 )
  218.                         {
  219.                         //        printf("CH2 is pressed.\n");
  220.                         //        printf("LED ON.\n");
  221.                         //        LED0=1 ;
  222.                         //        LED1=1 ;
  223.                            led=0;
  224.                            x=0;
  225.                            SetPWM1Dat(x);
  226.                            LCD_write_english_string(0,0,"  LED -- OFF ");
  227.                         }
  228.                         if( Touch_IN & CH3 )
  229.                         {
  230.                         //        printf("CH3 is pressed.\n");
  231.                         //        printf("LED OFF.\n");
  232.                         //        LED0=0 ;
  233.                         //        LED1=0 ;
  234.                             led=1;
  235.                             x=0x2f;
  236.                            SetPWM1Dat(x);
  237.                            LCD_write_english_string(0,0,"  LED -- ON  ");
  238.                         }
  239.                         if( Touch_IN & CH4 )
  240.                         {
  241.                         //        printf("CH3 is pressed.\n");
  242.                         //        printf("LED OFF.\n");
  243.                         //        LED0=0 ;
  244.                         //        LED1=0 ;
  245.                             if(x<255&led==1)
  246.                                 {
  247.                              x=x+3;
  248.                              SetPWM1Dat(x);
  249.                                  LCD_write_english_string(0,2," Light: ++++ ");
  250.                          //LCD_write_char('*');
  251.                                  mDelaymS(50);
  252.                                  LCD_write_english_string(0,2,"             ");
  253.                             }
  254.                                 else LCD_write_english_string(0,2," Light: MAX  ");
  255.                                
  256.                         }
  257.                         if( Touch_IN & CH5 )
  258.                         {
  259.                         //        printf("CH3 is pressed.\n");
  260.                         //        printf("LED OFF.\n");
  261.                         //        LED0=0 ;
  262.                         //        LED1=0 ;
  263.                             if(x>1&led==1)
  264.                             {
  265.                                  x=x-3;
  266.                              SetPWM1Dat(x);
  267.                                  LCD_write_english_string(0,2," Light: ---- ");
  268.                                  mDelaymS(50);
  269.                                  LCD_write_english_string(0,2,"             ");
  270.                             }
  271.                                 else
  272.                                 LCD_write_english_string(0,2," Light: MIN  ");
  273.                         }
  274.        
  275.                         Touch_IN = 0;
  276.                 }
  277.         //        LCD_dis();
  278. }


  279. void check_PWM(void)
  280. {
  281.         UINT8 x=0x00;
  282.         if(PWM_CTRL&bPWM_IF_END)
  283.           {
  284.         PWM_CTRL |= bPWM_IF_END;                                               //清除PWM中断                               
  285.         
  286.          for(x=0;x<255;x++)
  287.                 {
  288.                 SetPWM1Dat(x);
  289.                 mDelaymS(10);
  290.                 }
  291.                  for(x=255;x>0;x--)
  292.                 {
  293.                 SetPWM1Dat(x);
  294.                 mDelaymS(10);
  295.                 }
  296.                
  297. /*                       
  298. #ifdef DE_PRINTF
  299.     printf("PWM_CYC_END  %02X\n",(UINT16)PWM_CTRL);
  300. #endif           */
  301.              
  302.       }         





  303. }
复制代码



后续将实现LCD汉字显示,外加传感器,实现温湿度显示等功能。

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










此帖出自单片机论坛


回复

使用道具 举报

207

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-5-16 09:11:00 | 显示全部楼层
单价1.3元的USB和Touchkey单片机CH552G已全面供货,试样QQ:1258305301


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-8-18 20:13 , Processed in 0.079018 second(s), 16 queries , Gzip On, Redis On.

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