久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10471|回復: 29
收起左側

用無字庫12864改的大屏萬年歷(帶農歷,年屬性,溫度)用單片機定時器

  [復制鏈接]
ID:333678 發表于 2019-12-22 10:40 | 顯示全部樓層 |閱讀模式
用單片機定時器本人是一名電子愛好者,用業余時間自學的單片機,原來只是想玩玩而已,不過現在才發現自己不知不覺已深陷其中,不能自拔,大家是否有同感?
       在網上買的幾塊錢的3.8寸12864液晶屏,不帶字庫
image003.jpg
YXD12864G04引腳定義.jpg
接口定義.jpg
萬年歷接口定義.jpg
用3D打印的外殼,元件不多,沒用PCB直接焊接,單片機被我搞成這樣
IMG_20191029_052700.jpg

完成后的成品前面
萬年歷-前.jpg

背面
IMG_20191222_103233.jpg

運行效果
IMG_20191222_090738.jpg
IMG_20191222_100328.jpg

https://v.youku.com/v_show/id_XNDQ3ODM1MTA0NA==.html?spm=a2h0k.11417342.soresults.dposter
程序自己加了些注釋,水平有限,應該有不少錯誤,希望大家能夠多多指教。
代碼:

主程序:
/******************************************************************************
Copyright 2007
All rights reserved.

文件名        :12864.c
模塊名稱:
功能概要:C51寫的公歷轉農歷,并驅動12864(KS0108)漢字液晶顯示。

取代版本:0.0.1
修改人        :pulan
完成日期:2007.07.08
升級說明:create
CPU: stc89c58   主頻:11.0592M
液晶型號:       生產廠家:        驅動芯片:KS0108
硬件連接:
---------------------------------------------------------------
|DB0-----P0.0 | DB4-----P0.4 | RW-------P2.2 |
|DB1-----P0.1 | DB5-----P0.5 | RS-------P2.1 |
|DB2-----P0.2 | DB6-----P0.6 | E -------P2.5 |
|DB3-----P0.3 | DB7-----P0.7 | Vo接1k電阻到地
---------------------------------------------------------------
******************************************************************************/
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include "shijian.c"
void main(void)
{
  initial();

  while(1)
  {
    read_temp();
        ds1820disp();
        verify_time();                              //確認時間正確性
        key();
        if(setflag==0)
    disp_time();                                //這里調用顯示時間程序
  }
}


顯示驅動
/******************************************************************************
Copyright 2007
All rights reserved.

文件名        :12864.c
模塊名稱:
功能概要:C51寫的公歷轉農歷,并驅動12864(KS0108)漢字液晶顯示。

取代版本:0.0.1
修改人        :pulan
完成日期:2007.07.08
升級說明:create
CPU: stc89c58   主頻:11.0592M
液晶型號:       生產廠家:        驅動芯片:KS0108
硬件連接:
---------------------------------------------------------------
|DB0-----P0.0 | DB4-----P0.4 | RW-------P2.2 |
|DB1-----P0.1 | DB5-----P0.5 | RS-------P2.1 |
|DB2-----P0.2 | DB6-----P0.6 | E -------P2.5 |
|DB3-----P0.3 | DB7-----P0.7 | Vo接1k電阻到地
---------------------------------------------------------------
******************************************************************************/
#define uchar unsigned char
sbit LCD_csa=P2^7;                   //定義左屏開關
sbit LCD_csb=P2^6;                   //定義右屏開關
sbit LCD_rs =P2^5;                   //定義數據或指令,1=數據,0=指令
sbit LCD_rw =P2^4;                   //定義讀或寫?    1=讀,  0=寫   
sbit LCD_e  =P2^3;                   //定義使能操作, 1=能,  0=否
//sbit LCD_rst = P2^0;               //定義復位
sfr  LCD_db=0x80;                    //定義數據端口  
/******************************************************************************************
* 函數名稱    :lcd_busy
* 功能描述    :判別LCD12864忙否?不忙才跳出此程序
* 參數        :  參數名稱:        輸入/輸出?        類型                描述
*
* 返回值      :
* 作者        :
* 創建日期    :2006-12-19
* 全局變量    :
* 全局靜態變量:
* 局部靜態變量:
*----------------------------------------修改歷史------------------------------------------
* 當前版本    :                          修改人:                  修改日期:
* 修改說明    :
******************************************************************************************/
void lcd_busy(void)
{
  LCD_rs=0;
  LCD_rw=1;
  LCD_db=0xff;
  while (1)
  {
    LCD_e=1;
    if (LCD_db<0x80)                        //如果要進行簡單的軟件調試,可在這句前面加"//"跳過
    break;
    LCD_e=0;
  }
  LCD_e=0;
}

/******************************************************************************************
* 函數名稱    :set_xy
* 功能描述    :設置顯示位置! X,Y分別代表橫縱坐標!
* 參數        :  參數名稱:        輸入/輸出?        類型                描述
******************************************************************************************/
void set_xy(unsigned char x,unsigned char y)
{
  if (x>=64)   {LCD_csa=0;LCD_csb=1;}
  else         {LCD_csa=1;LCD_csb=0;}       //判別是左半屏,還是右半屏
  lcd_busy();
  LCD_rs=LCD_rw=0;
  LCD_db=0x40|x;                            //列地址賦值,x取值0----64
  LCD_e=1;LCD_e=0;
  lcd_busy();
  LCD_rs=LCD_rw=0;
  LCD_db=0xb8|y;                            //頁面地址賦值,y取值0----8
  LCD_e=1;LCD_e=0;
  LCD_db=0xff;
}

/******************************************************************************************
* 函數名稱    :lw
* 功能描述    :在指定的位置顯示數據
* 參數        :  參數名稱:        輸入/輸出?        類型                描述
******************************************************************************************/
void lw(uchar x,uchar y,uchar dd)
{
  set_xy(x,y);
  lcd_busy();
  LCD_rs=1;
  LCD_rw=0;
  LCD_db=dd;                                //數據送顯
  LCD_e=1;
  LCD_e=0;
  LCD_db=0xff;
}

/******************************************************************************************
* 函數名稱    :lcd_init
* 功能描述    :顯示初始化
* 參數        :  參數名稱:        輸入/輸出?        類型                描述
******************************************************************************************/
#pragma disable
void lcd_init(void)
{
  unsigned char x,y;
  /*開顯示*/
//   LCD_rst=0;
//         Delay12864(100);
//         LCD_rst=1;
//         Delay12864(100);
  LCD_e=LCD_rs=LCD_rw=0;
  LCD_csa=LCD_csb=0;
  LCD_csa=1;                                //選擇左半屏顯示
  LCD_db=0x3f;                              //打開左半屏顯示
  LCD_e=1;LCD_e=0;LCD_csa=0;
  LCD_csb=1;                                //選擇右半屏顯示
  LCD_db=0x3f;                              //打開右半屏顯示
  LCD_e=1;LCD_e=0;LCD_csb=0;
  /*0行開始顯示*/
  LCD_csa=1;lcd_busy();
  LCD_rs=LCD_rw=0;LCD_db=0xc0;              //設置左半屏起始行,是第一行
  LCD_e=1;LCD_e=0;LCD_csa=0;
  LCD_csb=1;lcd_busy();
  LCD_rs=LCD_rw=0;LCD_db=0xc0;              //設置右半屏起始行,是第一行
  LCD_e=1;LCD_e=0;LCD_csb=0;
  for (y=0;y<8;y++)
  {
    for (x=0;x<128;x++) lw(x,y,0);          //全屏清零顯示
  }
}


按鍵程序:
#include<reg52.h>
#include<delayms.h>
#include"xs.c"

sbit  set =P3^7;                //設置
sbit  key1=P3^6;                //加           
sbit  key2=P3^5;                           //減
sbit  key3=P3^4;                        //蜂鳴開關
sbit  key4=P3^3;                        //背光開關

uchar setflag=0;                       //按鍵計數
sbit  bl=P2^0;                                //背光控制端
sbit  bz=P2^1;                                //蜂鳴控制端

void key()                                                //按鍵程序
{                                                                        
  if(set==0)                                        //如果設置鍵按下
  {
        delayms(5);                                        //延時消抖
        if(set==0)                                        //再次確認設置鍵按下
        {
          setflag++;                                //按鍵計數加1
          while(!set);                                //等待按鍵松開
          switch(setflag)
          {
                case 1:// TR0=0;                                          //定時器0關閉
                dashuzi(4,2,10,0);                //顯示時與分中間的冒號
                    dashuzi(10,2,10,0);     //顯示分與秒中間的冒號
                dispmiao(sec,1);                //秒反顯
                            break;
            case 2: dispmiao(sec,0);                //秒正顯
                        dispfen(min,1);                        //分反顯
                    break;
            case 3: dispfen(min,0);                        //分正顯
                        dispshi(hour,1);//                //時反顯
                            break;
                case 4: dispshi(hour,0);                //時正顯
                        dispri(day,1);                         //日反顯
                                break;
                case 5: dispri(day,0);                        //日正顯
                        dispyue(month,1);                //月反顯
                                break;
                case 6: dispyue(month,0);                //月正顯
                        dispnian(year,1);       //年反顯
                                break;
                case 7:        setflag=0;                                //按鍵計數變為0
                        dispnian(year,0);                //年正顯
                   // TR0=1;                                        //定時器0啟動
                                break;
                default:;
          }
    }
  }
  if(setflag!=0)                                        //如果按鍵計數不為0
  {
        if(key1==0)                                                //如果加鍵按下
        {
          delayms(5);                                            //延時消抖
          if(key1==0)                                          //再次確認加鍵按下
          {
                while(!key1);                                //等待加鍵松開
                switch(setflag)
                {
                  case 1:// sec++;                                //秒加1
                         // if(sec==60)
                                  sec=0;        //如果秒加到60,秒歸0
                          dispmiao(sec,1);                //調用秒反顯
                                  break;
                  case 2: min++;                                //分加1
                          if(min==60) min=0;        //如果分加到60,分歸0
                          dispfen(min,1);            //調用分反顯
                                  break;
                  case 3: hour++;                                //小時加1
                          if(hour==24) hour=0;        //如果小時加到24,小時歸0
                          dispshi(hour,1);                //調用小時反顯
                                  break;
                  case 4: day++;                                //日加1
                          if(day==32) day=1;         //如果日加到32,日變為1
                          dispri(day,1);                //調用日反顯
                                  break;
                  case 5: month++;                                //月加1
                          if(month==13)        month=1;//如果月加到13
                          dispyue(month,1);                //調用月反顯
                                  break;
                  case 6: year++;                                //年加1
                          if(year==100)        year=0;        //如果年加到100,年歸0
                          dispnian(year,1);                //調用年反顯
                                  break;
                  default:;
                }
      }
    }
        if(key2==0)                                                        //如果減鍵按下
        {
          delayms(5);                                                        //延時消抖
          if(key2==0)                                                //再次確認減鍵按下
          {
                while(!key2) ;                                        //等待減鍵松開
            switch(setflag)
            {
              case 1:// sec--;                                //秒減1
                         // if(sec<0)        
                                  sec=0;//59;            //如果秒小于0,秒變為59
                          dispmiao(sec,1);                //調用秒反顯
                                  break;
                  case 2: min--;                                //分減1
                          if(min<0)        min=59;            //如果分小于0,分變為59
                          dispfen(min,1);                //調用分反顯
                                    break;
                  case 3: hour--;                                //小時減1
                          if(hour<0) hour=23;        //如果小時小于0,小時變為23
                          dispshi(hour,1);                //調用小時反顯
                                    break;
                  case 4: day--;                                //日減1
                          if(day==0) day=31;        //如果日減到0,日變為31
                          dispri(day,1);                //調用日反顯
                                  break;
                  case 5: month--;                                //月減1
                          if(month==0) month=12;//如果月減到0,月變為12
                          dispyue(month,1);                //調用月反顯
                                  break;
                  case 6: year--;                                //年減1
                          if(year<0) year=99;        //如果年小于0,年變為99
                          dispnian(year,1);                //
                                  break;
                  default:;
            }
          }
    }
  }  
  if(setflag==0&&key3==0)                                //走時狀態且蜂鳴開關按下時
  {
    delayms(5);                                                        //延時消抖
        if(setflag==0&&key3==0)                                //再次確認走時狀態且蜂鳴開關按下時
        {
          while(!key3);                                                //等待蜂鳴開關松開
          bz=~bz;                                                        //蜂鳴輸出取反
        }
  }                                                                                
  if(setflag==0&&key4==0)                                //走時狀態且背光開關按下時
  {
    delayms(5);                                                        //延時消抖
        if(setflag==0&&key4==0)                                //再次確認走時狀態且背光開關按下時
        {
          while(!key4);                                                //等待背光開關松開
          bl=~bl;                                                        //背光輸出取反
        }
  }
}
下面是完整程序和仿真:

★★3-帶農歷萬年歷.zip (118.95 KB, 下載次數: 249)

隨后再加上鬧鐘和整點報時。

評分

參與人數 3黑幣 +80 收起 理由
lyxxzrb + 15
1339337425 + 15 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:333678 發表于 2020-1-2 13:35 | 顯示全部樓層
用前面發的程序在修改日期時,發現農歷月份顯示不正常,仔細察看顯示程序xianshi.c有個地方寫錯了,現把更正后的程序發上來,并修改了字庫,使農歷1月顯示為正月。

★★3-帶農歷萬年歷.zip

119.78 KB, 下載次數: 183, 下載積分: 黑幣 -5

回復

使用道具 舉報

ID:333678 發表于 2019-12-22 10:44 | 顯示全部樓層
第一次在論壇上發這么長的貼子,沒編輯好。最后多了幾張圖片。
回復

使用道具 舉報

ID:475247 發表于 2019-12-22 14:50 | 顯示全部樓層
cb474265474265 發表于 2019-12-22 10:44
第一次在論壇上發這么長的貼子,沒編輯好。最后多了幾張圖片。

還不錯,加油!
回復

使用道具 舉報

ID:333678 發表于 2019-12-22 14:57 | 顯示全部樓層
多謝版主獎勵!
回復

使用道具 舉報

ID:32289 發表于 2019-12-22 20:30 | 顯示全部樓層
電路板創意不錯!
回復

使用道具 舉報

ID:207882 發表于 2019-12-22 22:24 | 顯示全部樓層
建議按鍵不要做死等,按鍵的檢測用中斷處理,純娛樂還行,但從產品的角度是不行,你按鍵按死不松開,程序就死在哪里了,這些顯示也會不正常了,假如按鍵壞了剛好處于閉合作態,你這個東西不就廢了,連玩都不能玩。
回復

使用道具 舉報

ID:333678 發表于 2019-12-23 05:17 | 顯示全部樓層
2448289424 發表于 2019-12-22 22:24
建議按鍵不要做死等,按鍵的檢測用中斷處理,純娛樂還行,但從產品的角度是不行,你按鍵按死不松開,程序就 ...

謝謝你的提醒,確實是這樣,以后我會盡力改進的。
回復

使用道具 舉報

ID:58110 發表于 2019-12-23 08:22 | 顯示全部樓層
謝謝分享
第一次見這種單片機
回復

使用道具 舉報

ID:333678 發表于 2019-12-26 07:26 來自觸屏版 | 顯示全部樓層
lyMarvin 發表于 2019-12-23 08:22
謝謝分享
第一次見這種單片機

沒用PCB,一個是沒幾個元件,二是為了減小整體厚度,另外我還在里面加了充電電池。用電池有個缺陷是沒電了屏不顯示,時鐘也不走了,還要重新調時,用時鐘芯片可解決這問題,但電路又多了元件,走時也不太準,有點糾結。我想是不是可以加上自動充電電路和程序?
回復

使用道具 舉報

ID:760161 發表于 2020-6-11 23:03 來自觸屏版 | 顯示全部樓層
這個程序為什么在編譯的時候會出錯,說delayms    missing function-prototype
回復

使用道具 舉報

ID:760161 發表于 2020-6-11 23:04 來自觸屏版 | 顯示全部樓層
這個程序為什么在編譯的時候會出錯,說delayms    missing function-prototype      而且如果自己添加了delayms.h文件之后,仿真點一下設置就停止不動了再點哪個按鍵都沒反應是怎么回事
回復

使用道具 舉報

ID:88256 發表于 2020-6-13 00:29 | 顯示全部樓層
感覺布局有點太規矩了點
回復

使用道具 舉報

ID:787528 發表于 2020-6-27 19:29 | 顯示全部樓層
會有proteus仿真嗎?
回復

使用道具 舉報

ID:529213 發表于 2020-8-3 16:49 來自觸屏版 | 顯示全部樓層
請問屏在哪里買的,能給個鏈接嗎,非常想做一個,謝謝樓主
回復

使用道具 舉報

ID:246635 發表于 2020-9-4 18:03 | 顯示全部樓層
cb474265474265 發表于 2020-1-2 13:35
用前面發的程序在修改日期時,發現農歷月份顯示不正常,仔細察看顯示程序xianshi.c有個地方寫錯了,現把更 ...

做得不錯,感謝分享
回復

使用道具 舉報

ID:333678 發表于 2020-9-20 18:48 | 顯示全部樓層
hnxtlxx 發表于 2020-8-3 16:49
請問屏在哪里買的,能給個鏈接嗎,非常想做一個,謝謝樓主

隔壁論壇老王電子數碼DIY  shop154838422點taobao點com
在這里搶購的,現在沒有了,但有別的型號,只要工作電壓和驅動芯片一樣,都可以,差不多的。
回復

使用道具 舉報

ID:125719 發表于 2020-9-23 09:38 | 顯示全部樓層
這個很厲害了,使用元器件很簡單,而且是全部撿漏利用,打印的外殼也不錯,
回復

使用道具 舉報

ID:529213 發表于 2021-1-9 00:38 來自觸屏版 | 顯示全部樓層
cb474265474265 發表于 2020-9-20 18:48
隔壁論壇老王電子數碼DIY  shop154838422點taobao點com
在這里搶購的,現在沒有了,但有別的型號,只要 ...

謝謝大佬,非常感謝
回復

使用道具 舉報

ID:98875 發表于 2021-1-17 12:33 | 顯示全部樓層
對比度沒有調節好,圖片顯示有“”鬼影“
回復

使用道具 舉報

ID:333678 發表于 2021-1-18 08:24 來自觸屏版 | 顯示全部樓層
dajingjiu 發表于 2021-1-17 12:33
對比度沒有調節好,圖片顯示有“”鬼影“

背光打開時,顯示有的地方不均勻,關了背光后效果好些,不知道是不是液晶屏自身原因。另外感覺這個屏的反應有點慢。
回復

使用道具 舉報

ID:879141 發表于 2021-1-20 23:48 來自觸屏版 | 顯示全部樓層
外觀不錯!
回復

使用道具 舉報

ID:765218 發表于 2021-1-29 15:04 | 顯示全部樓層
挺nice
回復

使用道具 舉報

ID:765218 發表于 2021-1-29 18:33 | 顯示全部樓層
橙七 發表于 2020-6-11 23:03
這個程序為什么在編譯的時候會出錯,說delayms    missing function-prototype

剛開始我也和你一樣 后面在keil工程下那些.c  .h 文件要包含在12864.c下面 就行了
回復

使用道具 舉報

ID:529213 發表于 2021-6-10 14:25 來自觸屏版 | 顯示全部樓層
這個萬年歷的字體是我見過的12864萬年歷中,最漂亮的,要是能夠把時鐘芯片ds3231加入就更完美了
回復

使用道具 舉報

ID:74784 發表于 2021-6-11 17:01 | 顯示全部樓層
我也整過:


12864主板電源.jpg 12864效果33xx.jpg 12864電路圖.jpg

回復

使用道具 舉報

ID:529213 發表于 2021-7-12 00:20 來自觸屏版 | 顯示全部樓層
樓主什么時候改成用ds3231做定時器的,肯定會成為大作,樓主,加油,改動一下,造福壇友
回復

使用道具 舉報

ID:243267 發表于 2021-8-15 21:54 來自觸屏版 | 顯示全部樓層
謝謝分享!我正想做一個練練手,苦于沒有范例參考
回復

使用道具 舉報

ID:333678 發表于 2021-12-25 15:06 來自觸屏版 | 顯示全部樓層
dajingjiu 發表于 2021-1-17 12:33
對比度沒有調節好,圖片顯示有“”鬼影“

用電腦USB供電電流小,電壓下降,改用單獨電源供電就好了。
回復

使用道具 舉報

ID:673920 發表于 2022-4-21 18:28 | 顯示全部樓層
把I/O口改了一下,就成了。謝謝!!      
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲毛片在线观看 | 男人电影天堂 | 久久亚洲精品久久国产一区二区 | 国产高清视频一区 | 一级黄a视频| 午夜精品一区二区三区在线视 | 91麻豆精品国产91久久久更新资源速度超快 | 国产精品久久久久久久白浊 | 日韩爱爱网 | 国产性色视频 | 青青草视频免费观看 | 99精品99 | 91国产视频在线观看 | 久久久久久国产 | 女人一区| 国产激情视频 | 国产精品99999 | 97人人超碰| 免费观看的黄色网址 | 国产区精品| 成人三区四区 | 欧美精品在线播放 | 黑人巨大精品欧美一区二区免费 | 精品国产欧美 | 成在线人视频免费视频 | 亚洲精品视频在线 | 狠狠涩 | 国产精品成人在线 | 欧美区日韩区 | 国产精品美女久久久久aⅴ国产馆 | 免费在线观看一级毛片 | 久久成人18免费网站 | 欧美xxxx在线 | 日本一区二区视频 | 午夜影院普通用户体验区 | 久久综合久色欧美综合狠狠 | 久久国产精品久久久久久久久久 | 免费亚洲视频 | 国产精品欧美大片 | 91免费视频观看 | 成人亚洲视频 |