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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10233|回復: 29
打印 上一主題 下一主題
收起左側

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

  [復制鏈接]
跳轉到指定樓層
樓主
用單片機定時器本人是一名電子愛好者,用業余時間自學的單片機,原來只是想玩玩而已,不過現在才發現自己不知不覺已深陷其中,不能自拔,大家是否有同感?
       在網上買的幾塊錢的3.8寸12864液晶屏,不帶字庫




用3D打印的外殼,元件不多,沒用PCB直接焊接,單片機被我搞成這樣


完成后的成品前面


背面


運行效果



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 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏33 分享淘帖 頂1 踩
回復

使用道具 舉報

來自 2#
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
第一次在論壇上發這么長的貼子,沒編輯好。最后多了幾張圖片。

還不錯,加油!
回復

使用道具 舉報

5#
ID:333678 發表于 2019-12-22 14:57 | 只看該作者
多謝版主獎勵!
回復

使用道具 舉報

6#
ID:32289 發表于 2019-12-22 20:30 | 只看該作者
電路板創意不錯!
回復

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

9#
ID:58110 發表于 2019-12-23 08:22 | 只看該作者
謝謝分享
第一次見這種單片機
回復

使用道具 舉報

10#
ID:333678 發表于 2019-12-26 07:26 來自手機 | 只看該作者
lyMarvin 發表于 2019-12-23 08:22
謝謝分享
第一次見這種單片機

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

使用道具 舉報

11#
ID:760161 發表于 2020-6-11 23:03 來自手機 | 只看該作者
這個程序為什么在編譯的時候會出錯,說delayms    missing function-prototype
回復

使用道具 舉報

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

使用道具 舉報

13#
ID:88256 發表于 2020-6-13 00:29 | 只看該作者
感覺布局有點太規矩了點
回復

使用道具 舉報

14#
ID:787528 發表于 2020-6-27 19:29 | 只看該作者
會有proteus仿真嗎?
回復

使用道具 舉報

15#
ID:529213 發表于 2020-8-3 16:49 來自手機 | 只看該作者
請問屏在哪里買的,能給個鏈接嗎,非常想做一個,謝謝樓主
回復

使用道具 舉報

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

做得不錯,感謝分享
回復

使用道具 舉報

17#
ID:333678 發表于 2020-9-20 18:48 | 只看該作者
hnxtlxx 發表于 2020-8-3 16:49
請問屏在哪里買的,能給個鏈接嗎,非常想做一個,謝謝樓主

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

使用道具 舉報

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

使用道具 舉報

19#
ID:529213 發表于 2021-1-9 00:38 來自手機 | 只看該作者
cb474265474265 發表于 2020-9-20 18:48
隔壁論壇老王電子數碼DIY  shop154838422點taobao點com
在這里搶購的,現在沒有了,但有別的型號,只要 ...

謝謝大佬,非常感謝
回復

使用道具 舉報

20#
ID:98875 發表于 2021-1-17 12:33 | 只看該作者
對比度沒有調節好,圖片顯示有“”鬼影“
回復

使用道具 舉報

21#
ID:333678 發表于 2021-1-18 08:24 來自手機 | 只看該作者
dajingjiu 發表于 2021-1-17 12:33
對比度沒有調節好,圖片顯示有“”鬼影“

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

使用道具 舉報

22#
ID:879141 發表于 2021-1-20 23:48 來自手機 | 只看該作者
外觀不錯!
回復

使用道具 舉報

23#
ID:765218 發表于 2021-1-29 15:04 | 只看該作者
挺nice
回復

使用道具 舉報

24#
ID:765218 發表于 2021-1-29 18:33 | 只看該作者
橙七 發表于 2020-6-11 23:03
這個程序為什么在編譯的時候會出錯,說delayms    missing function-prototype

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

使用道具 舉報

25#
ID:529213 發表于 2021-6-10 14:25 來自手機 | 只看該作者
這個萬年歷的字體是我見過的12864萬年歷中,最漂亮的,要是能夠把時鐘芯片ds3231加入就更完美了
回復

使用道具 舉報

26#
ID:74784 發表于 2021-6-11 17:01 | 只看該作者
我也整過:




回復

使用道具 舉報

27#
ID:529213 發表于 2021-7-12 00:20 來自手機 | 只看該作者
樓主什么時候改成用ds3231做定時器的,肯定會成為大作,樓主,加油,改動一下,造福壇友
回復

使用道具 舉報

28#
ID:243267 發表于 2021-8-15 21:54 來自手機 | 只看該作者
謝謝分享!我正想做一個練練手,苦于沒有范例參考
回復

使用道具 舉報

29#
ID:333678 發表于 2021-12-25 15:06 來自手機 | 只看該作者
dajingjiu 發表于 2021-1-17 12:33
對比度沒有調節好,圖片顯示有“”鬼影“

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

使用道具 舉報

30#
ID:673920 發表于 2022-4-21 18:28 | 只看該作者
把I/O口改了一下,就成了。謝謝!!      
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本电影一区二区 | 精品在线观看一区二区 | www久| 亚洲欧美一区二区三区情侣bbw | 亚洲h色| 国产福利网站 | 亚洲国产激情 | 亚洲精品久久嫩草网站秘色 | 精品欧美一区二区三区免费观看 | 亚洲精品一区二区 | 国产成人精品高清久久 | 成人三级在线播放 | 亚洲免费人成在线视频观看 | 国产精品成人一区二区 | 亚洲精品久久久久久国产精华液 | 国产精品久久久久久久久久久久久久 | 午夜精品一区二区三区在线视频 | 青青草这里只有精品 | 日韩亚洲一区二区 | 一区| 国产一级片久久久 | 91精品一区 | 日韩综合一区 | 国产精品.xx视频.xxtv | 中文字幕 在线观看 | 天天碰夜夜操 | 亚洲视频一区二区三区 | 一级毛片视频在线 | 高清国产一区二区 | 一级片免费网站 | 成人精品一区亚洲午夜久久久 | 人人看人人干 | 欧美一区二区三区视频 | av中文在线播放 | 欧美成人激情视频 | 亚洲精品久久久 | 亚洲精品美女视频 | 日日干夜夜操 | 伊人成人免费视频 | 欧美日韩三级在线观看 | 91资源在线|