发新帖本帖赏金 10.00元(功能说明)我要提问
1234下一页
返回列表
打印
[开源硬件]

DIY多功能12864液晶显示电子台历(STM8S207+DS3231+SHT31)-V1.0版

[复制链接]
13390|73
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
经过一个月的业余时间DIY设计,本大叔的“多功能12864液晶显示电子台历”终于完成的差不多了,哈哈因为现在业余时间有其他商业电子设计项目想做,所以今天先把比较基础的、功能瘸腿的V1.0版代码贴出来,等以后有时间再慢慢完善其他功能,呵呵,好了,话不多说,上实物图、上源代码、上PCB图!



亚克力面板.png (46.05 KB )

亚克力面板.png

DIY多功能12864液晶显示电子台历-1.jpg (503.24 KB )

DIY多功能12864液晶显示电子台历-1.jpg

DIY多功能12864液晶显示电子台历-2.jpg (414.05 KB )

DIY多功能12864液晶显示电子台历-2.jpg

DIY多功能12864液晶显示电子台历-3.jpg (385.45 KB )

DIY多功能12864液晶显示电子台历-3.jpg

DIY多功能12864液晶显示电子台历-4.jpg (436.88 KB )

DIY多功能12864液晶显示电子台历-4.jpg

DIY多功能12864液晶显示电子台历-5.jpg (364.54 KB )

DIY多功能12864液晶显示电子台历-5.jpg

DIY多功能12864液晶显示电子台历-6.jpg (398.28 KB )

DIY多功能12864液晶显示电子台历-6.jpg

DIY多功能12864液晶显示电子台历-7.jpg (406.4 KB )

DIY多功能12864液晶显示电子台历-7.jpg

DIY多功能12864液晶显示电子台历-8.jpg (375.96 KB )

DIY多功能12864液晶显示电子台历-8.jpg

DIY多功能12864液晶显示电子台历-9.jpg (375.64 KB )

DIY多功能12864液晶显示电子台历-9.jpg

DIY多功能12864液晶显示电子台历-10.jpg (405.12 KB )

DIY多功能12864液晶显示电子台历-10.jpg

程序源文件.rar

105.46 KB

PCB原理图设计.rar

20.6 KB

DS3231中文数据手册.pdf

2.2 MB

SHT3x_DIS_B.pdf

904.51 KB

打赏榜单

21ic小喇叭 打赏了 10.00 元 2018-08-28

相关帖子

沙发
henangongda123|  楼主 | 2018-7-8 08:38 | 只看该作者
PCB源文件我用的是AD6.9软件画的,文件有点大,上传不了有大佬知道怎么缩小吗?就是.PCBDOC文件,谢谢!

使用特权

评论回复
板凳
henangongda123|  楼主 | 2018-7-8 08:50 | 只看该作者
因为时间原因,原规划的声控背光功能没有实现!后续有时间了,先会把声控这个功能实现,另外还要实现亮度调节功能(夜里点亮太亮了!)。
如果还有时间,我觉得还是用环境照度控制背光好一点(当初规划的时候没有想到这点),类似手机的自动亮度功能,这样更方便一点,哈哈

使用特权

评论回复
地板
springvirus| | 2018-7-8 12:43 | 只看该作者
好作品,一定要顶下!!

使用特权

评论回复
5
henangongda123|  楼主 | 2018-7-8 15:41 | 只看该作者
springvirus 发表于 2018-7-8 12:43
好作品,一定要顶下!!

谢谢!有空再继续

使用特权

评论回复
6
henangongda123|  楼主 | 2018-7-9 20:58 | 只看该作者
可能是工作上养成的习惯,总感觉没做完的事情不舒服!
这两天抽空还是把V2.0版搞完吧,不留遗憾,或者让遗憾一直堆着。目前有2个想法要实现:一是增加农历算法和显示;二是实现PWM调节液晶显示器背光功能。这两点暂时不需要动目前的硬件部分,两点实现后准备取消之前规划的**肋:声控背光,改成照度传感器自动背光!

使用特权

评论回复
7
henangongda123|  楼主 | 2018-7-12 14:51 | 只看该作者
网上找的阳历转农历算法(查表法),好像就这个比较靠谱:
#include <time.h>
#include <stdio.h>
#include <string.h>

unsigned int LunarCalendarDay;
unsigned int LunarCalendarTable[199] =
{
        0x04AE53,0x0A5748,0x5526BD,0x0D2650,0x0D9544,0x46AAB9,0x056A4D,0x09AD42,0x24AEB6,0x04AE4A,/*1901-1910*/
        0x6A4DBE,0x0A4D52,0x0D2546,0x5D52BA,0x0B544E,0x0D6A43,0x296D37,0x095B4B,0x749BC1,0x049754,/*1911-1920*/
        0x0A4B48,0x5B25BC,0x06A550,0x06D445,0x4ADAB8,0x02B64D,0x095742,0x2497B7,0x04974A,0x664B3E,/*1921-1930*/
        0x0D4A51,0x0EA546,0x56D4BA,0x05AD4E,0x02B644,0x393738,0x092E4B,0x7C96BF,0x0C9553,0x0D4A48,/*1931-1940*/
        0x6DA53B,0x0B554F,0x056A45,0x4AADB9,0x025D4D,0x092D42,0x2C95B6,0x0A954A,0x7B4ABD,0x06CA51,/*1941-1950*/
        0x0B5546,0x555ABB,0x04DA4E,0x0A5B43,0x352BB8,0x052B4C,0x8A953F,0x0E9552,0x06AA48,0x6AD53C,/*1951-1960*/
        0x0AB54F,0x04B645,0x4A5739,0x0A574D,0x052642,0x3E9335,0x0D9549,0x75AABE,0x056A51,0x096D46,/*1961-1970*/
        0x54AEBB,0x04AD4F,0x0A4D43,0x4D26B7,0x0D254B,0x8D52BF,0x0B5452,0x0B6A47,0x696D3C,0x095B50,/*1971-1980*/
        0x049B45,0x4A4BB9,0x0A4B4D,0xAB25C2,0x06A554,0x06D449,0x6ADA3D,0x0AB651,0x093746,0x5497BB,/*1981-1990*/
        0x04974F,0x064B44,0x36A537,0x0EA54A,0x86B2BF,0x05AC53,0x0AB647,0x5936BC,0x092E50,0x0C9645,/*1991-2000*/
        0x4D4AB8,0x0D4A4C,0x0DA541,0x25AAB6,0x056A49,0x7AADBD,0x025D52,0x092D47,0x5C95BA,0x0A954E,/*2001-2010*/
        0x0B4A43,0x4B5537,0x0AD54A,0x955ABF,0x04BA53,0x0A5B48,0x652BBC,0x052B50,0x0A9345,0x474AB9,/*2011-2020*/
        0x06AA4C,0x0AD541,0x24DAB6,0x04B64A,0x69573D,0x0A4E51,0x0D2646,0x5E933A,0x0D534D,0x05AA43,/*2021-2030*/
        0x36B537,0x096D4B,0xB4AEBF,0x04AD53,0x0A4D48,0x6D25BC,0x0D254F,0x0D5244,0x5DAA38,0x0B5A4C,/*2031-2040*/
        0x056D41,0x24ADB6,0x049B4A,0x7A4BBE,0x0A4B51,0x0AA546,0x5B52BA,0x06D24E,0x0ADA42,0x355B37,/*2041-2050*/
        0x09374B,0x8497C1,0x049753,0x064B48,0x66A53C,0x0EA54F,0x06B244,0x4AB638,0x0AAE4C,0x092E42,/*2051-2060*/
        0x3C9735,0x0C9649,0x7D4ABD,0x0D4A51,0x0DA545,0x55AABA,0x056A4E,0x0A6D43,0x452EB7,0x052D4B,/*2061-2070*/
        0x8A95BF,0x0A9553,0x0B4A47,0x6B553B,0x0AD54F,0x055A45,0x4A5D38,0x0A5B4C,0x052B42,0x3A93B6,/*2071-2080*/
        0x069349,0x7729BD,0x06AA51,0x0AD546,0x54DABA,0x04B64E,0x0A5743,0x452738,0x0D264A,0x8E933E,/*2081-2090*/
        0x0D5252,0x0DAA47,0x66B53B,0x056D4F,0x04AE45,0x4A4EB9,0x0A4D4C,0x0D1541,0x2D92B5          /*2091-2099*/
};
int MonthAdd[12] = {0,31,59,90,120,151,181,212,243,273,304,334};
int LunarCalendar(int year,int month,int day)
{
        int Spring_NY,Sun_NY,StaticDayCount;
        int index,flag;
        //Spring_NY 记录春节离当年元旦的天数。
        //Sun_NY 记录阳历日离当年元旦的天数。
        if ( ((LunarCalendarTable[year-1901] & 0x0060) >> 5) == 1)
                Spring_NY = (LunarCalendarTable[year-1901] & 0x001F) - 1;
        else
                Spring_NY = (LunarCalendarTable[year-1901] & 0x001F) - 1 + 31;
        Sun_NY = MonthAdd[month-1] + day - 1;
        if ( (!(year % 4)) && (month > 2))
                Sun_NY++;
        //StaticDayCount记录大小月的天数 29 或30
        //index 记录从哪个月开始来计算。
        //flag 是用来对闰月的特殊处理。
        //判断阳历日在春节前还是春节后
        if (Sun_NY >= Spring_NY)//阳历日在春节后(含春节那天)
        {
                Sun_NY -= Spring_NY;
                month = 1;
                index = 1;
                flag = 0;
                if ( ( LunarCalendarTable[year - 1901] & (0x80000 >> (index-1)) ) ==0)
                        StaticDayCount = 29;
                else
                        StaticDayCount = 30;
                while (Sun_NY >= StaticDayCount)
                {
                        Sun_NY -= StaticDayCount;
                        index++;
                        if (month == ((LunarCalendarTable[year - 1901] & 0xF00000) >> 20) )
                        {
                                flag = ~flag;
                                if (flag == 0)
                                        month++;
                        }
                        else
                                month++;
                        if ( ( LunarCalendarTable[year - 1901] & (0x80000 >> (index-1)) ) ==0)
                                StaticDayCount=29;
                        else
                                StaticDayCount=30;
                }
                day = Sun_NY + 1;
        }
        else //阳历日在春节前
        {
                Spring_NY -= Sun_NY;
                year--;
                month = 12;
                if ( ((LunarCalendarTable[year - 1901] & 0xF00000) >> 20) == 0)
                        index = 12;
                else
                        index = 13;
                flag = 0;
                if ( ( LunarCalendarTable[year - 1901] & (0x80000 >> (index-1)) ) ==0)
                        StaticDayCount = 29;
                else
                        StaticDayCount = 30;
                while (Spring_NY > StaticDayCount)
                {
                        Spring_NY -= StaticDayCount;
                        index--;
                        if (flag == 0)
                                month--;
                        if (month == ((LunarCalendarTable[year - 1901] & 0xF00000) >> 20))
                                flag = ~flag;
                        if ( ( LunarCalendarTable[year - 1901] & (0x80000 >> (index-1)) ) ==0)
                                StaticDayCount = 29;
                        else
                                StaticDayCount = 30;
                }
                day = StaticDayCount - Spring_NY + 1;
        }
        LunarCalendarDay |= day;
        LunarCalendarDay |= (month << 6);
        if (month == ((LunarCalendarTable[year - 1901] & 0xF00000) >> 20))
                return 1;
        else
                return 0;
}
main()
{
        const char *ChDay[] = {"*","初一","初二","初三","初四","初五",
                               "初六","初七","初八","初九","初十",
                               "十一","十二","十三","十四","十五",
                               "十六","十七","十八","十九","二十",
                               "廿一","廿二","廿三","廿四","廿五",
                               "廿六","廿七","廿八","廿九","三十"
                              };
        const char *ChMonth[] = {"*","正","二","三","四","五","六","七","八","九","十","十一","腊"};
        struct tm * Local;
        long t;
        int year,month,day;
        char str[13] = "";
#if 0
        t = time(NULL);
        Local = localtime(&t);
        year = Local->tm_year + 1900;
        month = Local->tm_mon + 1;
        day = Local-> tm_mday;
#else
        year = 2013;
        month = 2;
        day = 10;
        printf("请依次输入公历的年月日(例如2013年1月2日,输入:2013-1-2)");
        scanf("%d-%d-%d", &year, &month, &day);
#endif
        printf("%d年%d月%d日\t",year,month,day);
        if (LunarCalendar(year,month,day))
        {
                strcat(str,"闰");
                strcat(str,ChMonth[(LunarCalendarDay & 0x3C0) >> 6]);
        }
        else
                strcat(str,ChMonth[(LunarCalendarDay & 0x3C0) >> 6]);
        strcat(str,"月");
        strcat(str,ChDay[LunarCalendarDay & 0x3F]);
        puts(str);
        getchar();
}

使用特权

评论回复
8
陈乐乐| | 2018-7-13 10:45 | 只看该作者
支持楼主好作品,一定要顶下

使用特权

评论回复
9
lxtiger| | 2018-7-13 11:26 | 只看该作者
支持楼主好作品,弱弱的问一下开发环境用的是什么?

使用特权

评论回复
10
henangongda123|  楼主 | 2018-7-13 12:19 | 只看该作者
陈乐乐 发表于 2018-7-13 10:45
支持楼主好作品,一定要顶下

谢谢!正在搞V2.0版,更多功能

使用特权

评论回复
11
henangongda123|  楼主 | 2018-7-13 12:21 | 只看该作者
lxtiger 发表于 2018-7-13 11:26
支持楼主好作品,弱弱的问一下开发环境用的是什么?

ST单片机官方STVD软件,编译器是COSMIC C编译器,ST-LINK下载仿真线

使用特权

评论回复
12
henangongda123|  楼主 | 2018-7-13 12:22 | 只看该作者
昨晚吧公历转农历程序移植成功了!
/********* 公历年月日数据转换为农历年月日数据操作 **********
此算法为直接移植网友【赖皮】于2017年2月发布的【最强万年历】程序,
目前我也不太明白这个算法是怎么做出来的,所以注释部分比较少!
/***********************************************************
函数名: Moonday_Get()
功  能: 读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0
参  数: month_p    --- 月份指向
                          table_addr --- 年份数据表地址
返回值: 1 --- 大月
        0 --- 小月
***********************************************************/
uchar Moonday_Get(uchar month_p,ushort table_addr)
{
        switch (month_p)
        {
                case 1:                   //1月
                {
                        if((year_code[table_addr]&0x08)==0)
                  return(0);
                  else
                  return(1);
                }
                case 2:                   //2月
                {
                        if((year_code[table_addr]&0x04)==0)
                        return(0);
                        else
                        return(1);
                }
                case 3:                   //3月
                {
                        if((year_code[table_addr]&0x02)==0)
                        return(0);
                        else
                        return(1);
                }
                case 4:                   //4月
                {
                        if((year_code[table_addr]&0x01)==0)
                        return(0);
                        else
                        return(1);
                }
                case 5:                   //5月
                {
                        if((year_code[table_addr+1]&0x80)==0)
                        return(0);
                        else
                        return(1);
                }
                case 6:                   //6月
                {
                        if((year_code[table_addr+1]&0x40)==0)
                        return(0);
                        else
                        return(1);
                }
                case 7:                   //7月
                {
                        if((year_code[table_addr+1]&0x20)==0)
                        return(0);
                        else
                        return(1);
                }
                case 8:                   //8月
                {
                        if((year_code[table_addr+1]&0x10)==0)
                        return(0);
                        else
                        return(1);
                }
                case 9:                   //9月
                {
                        if((year_code[table_addr+1]&0x08)==0)
                        return(0);
                        else
                        return(1);
                }
                case 10:                  //10月
                {
                        if((year_code[table_addr+1]&0x04)==0)
                        return(0);
                        else
                        return(1);
                }
                case 11:                  //11月
                {
                        if((year_code[table_addr+1]&0x02)==0)
                        return(0);
                        else
                        return(1);
                }
                case 12:                  //12月
                {
                        if((year_code[table_addr+1]&0x01)==0)
                        return(0);
                        else
                        return(1);
                }
                case 13:                  //13月
                {
                        if((year_code[table_addr+2]&0x80)==0)
                        return(0);
                        else
                        return(1);
                }
        }
}
/***********************************************************
函数名: Nongli_Get()
功  能: 将程序读取到的公历年月日数据转换为农历年月日数据
参  数: 无
返回值: 无
***********************************************************/
void Nongli_Get(void)
{                        
  uchar temp1,temp2,temp3,month_p;//定义一下,便于后面运算使用
  uchar flag2,flag_y;         //定义一下,便于后面运算使用
        ushort temp4,table_addr;    //定义一下,便于后面运算使用
        year_n = year_r;            //农历年数据初值赋公历值
        month_n = month_r;          //农历月数据初值赋公历值
        day_n = day_r;              //农历日数据初值赋公历值
  table_addr=(year_n+100-1)*3;//定位年份数据表地址(20XX年,例如2018年位置为351: 数组第352个数值开始)
        temp1=year_code[table_addr+2]&0x60;//取当年春节所在的公历月份
        temp1>>=5;
  temp2=year_code[table_addr+2]&0x1f;//取当年春节所在的公历日
        if(temp1==1)                //计算当年春节离当年元旦的天数(春节只会在公历1月或2月)
        {  
                temp3=temp2-1;
        }  
        else
        {
    temp3=temp2+31-1;
        }
        /*
        计算公历日离当年元旦的天数:
        为了减少运算,用了两个表,day_code1[9],day_code2[3];
        如果公历月在九月或前,天数会少于0xff,用表day_code1[9],在九月后,天数大于0xff,用表day_code2[3];
        如输入公历日为8月10日,则公历日离元旦天数为day_code1[8-1]+10-1;
        如输入公历日为11月10日,则公历日离元旦天数为day_code2[11-10]+10-1;
        */
        if(month_n<10)
        {
    temp4=day_code1[month_n-1]+day_n-1;
        }
        else
        {
    temp4=day_code2[month_n-10]+day_n-1;
        }
        if((month_n>0x02)&&((year_n%0x04)==0))//如果公历月大于2月并且该年的2月为闰月,天数加1
        {  
                temp4+=1;
        }
        if(temp4>=temp3)            //公历日在春节后或春节当日使用下面代码进行运算
        {
                temp4-=temp3;
                month_n=1;
                month_p=1;                //month_p为月份指向,公历日在春节前或就是春节当日month_p指向首月
                flag_y=0;
          flag2=Moonday_Get(month_p,table_addr);//检查该农历月为大小还是小月,大月返回1,小月返回0
                if(flag2==0)
                {
                  temp1=29;               //小月29天
                }
                else
                {
                  temp1=30;               //大小30天
                }
                temp2=year_code[table_addr]/16;//从数据表中取该年的闰月月份,如为0则该年无闰月
                while(temp4>=temp1)
                {
      temp4-=temp1;
      month_p+=1;
      if(month_n==temp2)
                        {
        flag_y=~flag_y;
        if(flag_y==0)
                                {
                                  month_n+=1;
                                }
                        }
                        else
                        {
                                month_n+=1;
                        }
                        flag2=Moonday_Get(month_p,table_addr);
                        if(flag2==0)
                        {
                          temp1=29;
                        }
      else
                        {
                          temp1=30;
                        }
                }
    day_n=temp4+1;
        }
        else                        //公历日在春节前使用下面代码进行运算
        {  
                temp3-=temp4;
                year_n-=1;
    table_addr-=3;
                month_n=12;
          temp2=year_code[table_addr]/16;
                if(temp2==0)
                {
                  month_p=12;
                }
                else
                {
                  month_p=13;             //month_p为月份指向,如果当年有闰月,一年有十三个月,月指向13,无闰月指向12
                }
                flag_y=0;
                flag2=Moonday_Get(month_p,table_addr);
                if(flag2==0)
    {
                  temp1=29;
                }
                else
                {
                  temp1=30;
                }
                while(temp3>temp1)
                {
                        temp3-=temp1;
                        month_p-=1;
                  if(flag_y==0)
                        {
                          month_n-=1;
                        }
                  if(month_n==temp2)
                        {
                          flag_y=~flag_y;
                        }
                  flag2=Moonday_Get(month_p,table_addr);
                  if(flag2==0)
                        {
                          temp1=29;
                        }
                  else
                        {
                          temp1=30;
                        }
                }
          day_n=temp1-temp3+1;
        }
}

使用特权

评论回复
13
henangongda123|  楼主 | 2018-7-13 12:23 | 只看该作者
上面的2017更正为:2007!

使用特权

评论回复
14
henangongda123|  楼主 | 2018-7-13 22:04 | 只看该作者
背光亮度调节功能基本实现,LED背光就是方便啊,很容易通过PWM调节占空比的方式调节亮度!

12864液晶显示器背光亮度调节.jpg (407.95 KB )

12864液晶显示器背光亮度调节.jpg

使用特权

评论回复
15
henangongda123|  楼主 | 2018-7-13 22:06 | 只看该作者
贴硬件PWM代码,另外明天准备买ON9658可见光照度传感器,尽快实现手动+自动背光亮度调节功能!12864模块100%亮度的背光有点刺眼了,特别是晚上!
/***********************************************************
函数名:T1_Init()
功  能:定时器1初始化(产生PWM波形,用于液晶背光亮度调节)
参  数:无
返回值:无
/**********************************************************/
void T1_Init(void)
{
//        TIM1_PSCRH = 0x3E;
//        TIM1_PSCRL = 0x7F;          //分频系数15999+1,T1时钟1KHz
        TIM1_CCMR2 = 0x30;          //配置OC2M,翻转OC2REF信号
        TIM1_CCR2H = 0x1F;
        TIM1_CCR2L = 0x40;          //配置OC2REF占空比(T1_CCR2/T1_ARR)
        TIM1_ARRH = 0x3E;
        TIM1_ARRL = 0x80;           //配置OC2REF信号频率1kHz(16M/16000)
        TIM1_CCER1 = 0x10;
        TIM1_BKR = 0x80;            //T1_CH2输出
        TIM1_CR1 = 0x01;            //开定时器1
}

使用特权

评论回复
16
elelevi| | 2018-7-13 23:34 | 只看该作者
    透明面板似乎不太美观,建议换个颜色的吧;
    还有目测你要显示的内容比较多,建议把显示时间作为主要内容,毕竟显示时间是第一要素。可以考虑用大号数字,或者自定义,本来屏幕就不大,最好简洁~,一目了然
    纯属个人意见,希望可以更完善

使用特权

评论回复
17
henangongda123|  楼主 | 2018-7-14 08:11 | 只看该作者
elelevi 发表于 2018-7-13 23:34
透明面板似乎不太美观,建议换个颜色的吧;
    还有目测你要显示的内容比较多,建议把显示时间作为主 ...

谢谢建议,我这个是把生日提醒什么的作为重点显示对象

使用特权

评论回复
18
henangongda123|  楼主 | 2018-7-14 23:50 | 只看该作者
12864液晶背光亮度调节功能已基本完全实现,就等周一照度传感器到了后,增加ADC自动调节亮度了

背光亮度调节界面.jpg (344.77 KB )

背光亮度调节界面.jpg

使用特权

评论回复
19
henangongda123|  楼主 | 2018-7-14 23:52 | 只看该作者
贴部分源代码:
/***********************************************************
函数名:T1_Init()
功  能:定时器1初始化(产生PWM波形,用于液晶背光亮度调节)
参  数:无
返回值:无
/**********************************************************/
void T1_Init(void)
{
        TIM1_PSCRH = 0x00;
        TIM1_PSCRL = 0x0F;          //分频系数15+1,T1时钟1MHz
        TIM1_CCMR2 |= 0x70;         //配置OC2M(T1_CH2),PWM模式1
        TIM1_CCER1 |= 0x30;         //CC2E开启,高电平有效
        TIM1_ARRH = 0x03;
        TIM1_ARRL = 0xFC;           /*配置OC2REF信号频率1M/1020Hz=980.4Hz
                                      注: 1020为10位ADC最大值1023-3,为配合ADC采样ON9658照度设置,
                                                                                                                                当ON9658采样的ADC值大于1020时,占空比即达到100%*/
        TIM1_CCR2H = 0x02;
        TIM1_CCR2L = 0x64;          //配置OC2REF占空比初值60%(T1_CCR2/T1_ARR)
        TIM1_BKR = 0x80;            //主输出使能
        TIM1_CR1 = 0x01;            //开定时器1
}

/***********************************************************
函数名: Brightness_Set()
功  能: 液晶背光亮度调节操作
参  数: 无
返回值: 无
***********************************************************/
void Brightness_Set(void)
{
        if(brightness_set==0)       //背光亮度选择"关闭"
        {
                TIM1_CCR2H = 0x00;
          TIM1_CCR2L = 0x00;        //配置OC2REF占空比为0
        }
        else if(brightness_set==1)  //背光亮度选择"20%"
        {
                TIM1_CCR2H = 0x00;
          TIM1_CCR2L = 0xCC;        //配置OC2REF占空比为20%
        }
        else if(brightness_set==2)  //背光亮度选择"40%"
        {
                TIM1_CCR2H = 0x01;
          TIM1_CCR2L = 0x98;        //配置OC2REF占空比为40%
        }
        else if(brightness_set==3)  //背光亮度选择"60%"
        {
                TIM1_CCR2H = 0x02;
          TIM1_CCR2L = 0x64;        //配置OC2REF占空比为60%
        }
        else if(brightness_set==4)  //背光亮度选择"80%"
        {
                TIM1_CCR2H = 0x03;
          TIM1_CCR2L = 0x30;        //配置OC2REF占空比为80%
        }
        else if(brightness_set==5)  //背光亮度选择"最亮"
        {
                TIM1_CCR2H = 0x03;
          TIM1_CCR2L = 0xFF;        //配置OC2REF占空比为100%
        }
        else if(brightness_set==6)  //背光亮度选择"自动亮度"
        {
               
        }
}

/***********************************************************
函数名: Brightness_Set_Mode()
功  能: 液晶背光亮度调节模式操作
参  数: 无
返回值: 无
***********************************************************/
void Brightness_Set_Mode(void)
{
        if(!(PC_IDR & 0x20))        //按下S2键
        {
          delay_ms(10);             //软件消抖
          if(!(PC_IDR & 0x20))      //确定按下S2键
          {
                  brightness_set++;       //背光亮度选择+1
            if(brightness_set > 6)  //最多7个亮度选择
                  {
                          brightness_set = 6;   //按到最后个亮度选择后保持最后一个选择
                  }
          }
  }
        if(!(PC_IDR & 0x40))        //按下S3键
        {
                delay_ms(10);             //软件消抖
          if(!(PC_IDR & 0x40))      //确定按下S3键
          {
                        brightness_set--;       //背光亮度选择-1
            if(brightness_set < 0)  //最少亮度选择为0
                  {
                          brightness_set = 0;   //按到最少亮度选择后保持最后少亮度选择
                  }
          }
  }
        if(!(PC_IDR & 0x80))        //按下S4键
        {
                delay_ms(10);             //软件消抖
          if(!(PC_IDR & 0x80))      //确定按下S4键
                {
                        mode = 2;               //系统工作模式进入年份调节模式
                        display = 2;            //系统显示界面进入年份调节模式
                }
        }
        Brightness_Set();           //执行背光亮度值调节
}

/***********************************************************
函数名: Brightness_Set_Display()
功  能: 12864液晶显示屏背光亮度调节显示界面
参  数: 无
返回值: 无
***********************************************************/
void Brightness_Set_Display(void)
{
        if(Set_Flicker==0)
        {
                //第一行显示: "  背光亮度选择  "
          lcd_w_char(0,0x80);       //第一行显示起始地址
                lcd_w_word("  背光亮度选择  ");//"  背光亮度选择  "
                //第二行显示: "关闭  20%  40%"
          lcd_w_char(0,0x90);       //第二行显示起始地址
          lcd_w_word("关闭  20%  40%");//"关闭  20%  40%"
          //第三行显示: "60%  80%  最亮"
          lcd_w_char(0,0x88);       //第三行显示起始地址
          lcd_w_word("60%  80%  最亮");//"60%  80%  最亮"
          //第四行显示: "自动亮度        "
          lcd_w_char(0,0x98);       //第四行显示起始地址
          lcd_w_word("自动亮度        ");//"自动亮度        "
        }
        else if(Set_Flicker==1)
        {
                if(brightness_set==0)     //选择"关闭"背光
                {
                        lcd_w_char(0,0x90);
                        lcd_w_word("      20%  40%");//闪烁"关闭"效果
                }
                else if(brightness_set==1)//选择"20%"背光
                {
                        lcd_w_char(0,0x90);
                        lcd_w_word("关闭        40%");//闪烁"20%"效果
                }
                else if(brightness_set==2)//选择"40%"背光
                {
                        lcd_w_char(0,0x90);
                        lcd_w_word("关闭  20%      ");//闪烁"40%"效果
                }
                else if(brightness_set==3)//选择"60%"背光
                {
                        lcd_w_char(0,0x88);
                        lcd_w_word("      80%  最亮");//闪烁"60%"效果
                }
                else if(brightness_set==4)//选择"80%"背光
                {
                        lcd_w_char(0,0x88);
                        lcd_w_word("60%        最亮");//闪烁"80%"效果
                }
                else if(brightness_set==5)//选择"最亮"背光
                {
                        lcd_w_char(0,0x88);
                        lcd_w_word("60%  80%      ");//闪烁"最亮"效果
                }
                else if(brightness_set==6)//选择"自动亮度"背光
                {
                        lcd_w_char(0,0x98);
                        lcd_w_word("                ");//闪烁"自动亮度"效果
                }
        }
        delay_ms(250);              //软件延时,降低刷屏频率及按键扫描频率
}

使用特权

评论回复
20
一路向北lm| | 2018-7-15 09:12 | 只看该作者
好作品,赞一下

使用特权

评论回复
发新帖 本帖赏金 10.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

2116

帖子

19

粉丝