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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2541|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STC8H4K64TLCD-45MHz-LQFP64,硬件LCD段碼驅(qū)動顯示程序,硬件實(shí)時時鐘演示程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:961114 發(fā)表于 2022-10-28 09:52 | 只看該作者 |只看大圖 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
STC8H4K64TLCD-45MHz-LQFP64,硬件LCD段碼驅(qū)動顯示程序,硬件實(shí)時時鐘演示程序


單片機(jī)源程序如下:
  1. /*********************************************************/
  2. #define MAIN_Fosc                11059200L        //定義主時鐘

  3. #include        "STC8H4K64TL.h"


  4. /*************        功能說明        **************

  5. 請先別修改程序, 直接下載"04-RTC基本操作-5位液晶顯示時間"里的"rtc.hex"測試, 主頻選擇11.0592MHZ. 測試正常后再修改移植.

  6. K1切換顯示時分和分秒。
  7. K2調(diào)整小時+.  按下超過1秒, 則提供1秒10個鍵碼.
  8. K3調(diào)整分鐘+. 按下超過1秒, 則提供1秒10個鍵碼.
  9. K4調(diào)整分鐘-. 按下超過1秒, 則提供1秒10個鍵碼.

  10. 特別提醒: 本例子僅僅是一個示范程序, 不同的段碼液晶, 其筆段排列不同, 要根據(jù)具體的液晶屏來確定顯存映射.
  11. MCU電流: 根據(jù)LCD面積大約10~25uA.


  12. 硬件連接:
  13. COM0---P5.0                SEG8---P0.6                SEG12--P0.4                SEG16--P0.0
  14. COM1---P5.1                SEG9---P0.5                SEG13--P0.3                SEG17--P4.6
  15. COM2---P3.5                SEG10--P5.3                SEG14--P0.2                SEG18--P4.5
  16. COM3---P3.6                SEG11--P5.2                SEG15--P0.1                SEG19--P2.7

  17. LCD顯示內(nèi)容:  -日.日.日.日.日

  18.                 B7                B6                B5                B4                B3                B2                B1                B0
  19. LCD_buff[0]:        2H                3D                1H                2D                左下        1D                B1                B0                左下為左下角的箭頭, B0為電池框, B1為電量1
  20. LCD_buff[1]:        --                --                --                --                4H                5D                3H                4D
  21. LCD_buff[2]:        3C                3E                2C                2E                1C                1E                B2                右上        右上為右上角的箭頭, B2為電量2
  22. LCD_buff[3]:        --                --                --                --                5C                5E                4C                4E
  23. LCD_buff[4]:        3B                3G                2B                2G                1B                1G                B3                -                B3為電量3, -為左邊符號
  24. LCD_buff[5]:        --                --                --                --                5B                5G                4B                4G
  25. LCD_buff[6]:        3A                3F                2A                2F                1A                1F                B4                左上        左上為左上角的箭頭
  26. LCD_buff[7]:        --                --                --                --                5A                5F                4A                4F

  27. ******************************************/

  28. /*************        本地常量聲明        **************/

  29. #define K_SWITCH        0x10
  30. #define K_HOUR                0x20
  31. #define K_MIN_UP        0x40
  32. #define K_MIN_DN        0x80


  33. #define DIS_BLACK        0x10
  34. #define DIS_                0x11

  35. #define LCD_SET_BAT0        LCD_buff[0] |=  0x01
  36. #define LCD_CLR_BAT0        LCD_buff[0] &= ~0x01
  37. #define LCD_CPL_BAT0        LCD_buff[0] ^=  0x01

  38. #define LCD_SET_BAT1        LCD_buff[0] |=  0x02
  39. #define LCD_CLR_BAT1        LCD_buff[0] &= ~0x02
  40. #define LCD_CPL_BAT1        LCD_buff[0] ^=  0x02

  41. #define LCD_SET_BAT2        LCD_buff[2] |=  0x02
  42. #define LCD_CLR_BAT2        LCD_buff[2] &= ~0x02
  43. #define LCD_CPL_BAT2        LCD_buff[2] ^=  0x02

  44. #define LCD_SET_BAT3        LCD_buff[4] |=  0x02
  45. #define LCD_CLR_BAT3        LCD_buff[4] &= ~0x02
  46. #define LCD_CPL_BAT3        LCD_buff[4] ^=  0x02

  47. #define LCD_SET_BAT4        LCD_buff[6] |=  0x02
  48. #define LCD_CLR_BAT4        LCD_buff[6] &= ~0x02
  49. #define LCD_CPL_BAT4        LCD_buff[6] ^=  0x02

  50. #define LCD_SET_LEFT_UP                LCD_buff[6] |=  0x01
  51. #define LCD_CLR_LEFT_UP                LCD_buff[6] &= ~0x01
  52. #define LCD_SET_LEFT_DN                LCD_buff[0] |=  0x08
  53. #define LCD_CLR_LEFT_DN                LCD_buff[0] &= ~0x08
  54. #define LCD_SET_RIGHT_UP        LCD_buff[2] |=  0x01
  55. #define LCD_CLR_RIGHT_UP        LCD_buff[2] &= ~0x01


  56. /*************        本地IO定義        **************/


  57. /*************        本地變量聲明        **************/

  58. u8        year, month, day, week, hour, minute, second;        //RTC實(shí)時時間
  59. bit        B_500mS;        // 0.5秒時隙標(biāo)志
  60. bit        B_20ms;                // 20ms時隙標(biāo)志
  61. u8        OpTime;                // 此變量非0時, 不睡眠, 連續(xù)運(yùn)行程序(本例串口喚醒后連續(xù)運(yùn)行5秒, 以便正確接收串口數(shù)據(jù))

  62. u8        idata        LCD_buff[8];        //LCD顯存

  63. u8        DisMode;                //顯示模式, 0: 顯示時分, 1:顯示分秒, 2:顯示月日

  64. u8        KeyState;        //鍵狀態(tài)
  65. u8        KeyCode;        //鍵碼
  66. u8        KeyHoldCnt;        //重鍵計(jì)數(shù)


  67. /*************        本地函數(shù)聲明        **************/
  68. u8                SetRTC(void);                //設(shè)置RTC時間函數(shù)
  69. void        RTC_config(void);        //RTC初始化函數(shù)
  70. void        RTC_read(void);                //讀RTC時間函數(shù)
  71. void        RTC_ShowLCD(void);        //顯示時間信息
  72. u8                Timer0_Config(u32 reload);        //reload值是主時鐘周期數(shù)
  73. void        LCD_config(void);
  74. void        LoadToLcd(void);
  75. void        LCD_load(u8 n, u8 dat);                //n為第幾個數(shù)字,為1~5,dat為要顯示的數(shù)字
  76. void        ReadKey(void);        //50ms call


  77. //========================================================================
  78. // 函數(shù): void main(void)
  79. // 描述: 主函數(shù)
  80. // 參數(shù): none.
  81. // 返回: none.
  82. // 版本: VER1.0
  83. // 日期: 2018-4-2
  84. // 備注:
  85. //========================================================================
  86. void main(void)
  87. {
  88.         P0M1 = 0;        P0M0 = 0;
  89.         P1M1 = 0;        P1M0 = 0;
  90.         P2M1 = 0;        P2M0 = 0;
  91.         P3M1 = 0;        P3M0 = 0;
  92.         P4M1 = 0;        P4M0 = 0;
  93.         P5M1 = 0;        P5M0 = 0;
  94.         P6M1 = 0;        P6M0 = 0;
  95.         P7M1 = 0;        P7M0 = 0;

  96.         Timer0_Config(MAIN_Fosc / 50);        //reload值是主時鐘周期數(shù),  (中斷頻率, 50次/秒)

  97.         EA = 1;

  98.         OpTime  = 0;
  99.         DisMode = 0;
  100.         RTC_config();
  101.         LCD_config();

  102.         while (1)
  103.         {
  104.                 if(B_20ms)
  105.                 {
  106.                         B_20ms = 0;
  107.                         ReadKey();
  108.                 }

  109.                 if(B_500mS)        // 1/2秒中斷
  110.                 {
  111.                         B_500mS = 0;
  112.                         if(second  == RTC_SEC)                // RTC的秒計(jì)數(shù)值, 相等則秒沒變化, 0.5秒而已, 閃點(diǎn)
  113.                         {
  114.                                 if(DisMode <= 1)        //顯示時分或分秒才閃秒
  115.                                 {
  116.                                         LCD_load(3, DIS_);        //秒閃中間一杠
  117.                                         LoadToLcd();
  118.                                 }
  119.                         }
  120.                         else        //秒有變化
  121.                         {
  122.                                 RTC_read();
  123.                                 if(OpTime != 0)        OpTime--;        //連續(xù)操作時間
  124.                                 RTC_ShowLCD();        //顯示時間信息
  125.                         }

  126.                 }

  127.                 if(KeyCode != 0)
  128.                 {
  129.                         if(KeyCode == K_SWITCH)                //短按K1鍵 切換顯示
  130.                         {
  131.                                 if(++DisMode >= 3)        DisMode = 0;        //0: 顯示時分, 1:顯示分秒, 2:顯示月日
  132.                                 RTC_ShowLCD();        //顯示時間信息
  133.                         }
  134.                         else if(DisMode == 0)        //顯示時分時可以調(diào)時間
  135.                         {
  136.                                 if(KeyCode == K_HOUR)        //hour鍵
  137.                                 {
  138.                                         if(++hour >= 24)        hour = 0;
  139.                                         SetRTC();
  140.                                         RTC_ShowLCD();        //顯示時間信息
  141.                                 }
  142.                                 else if(KeyCode == K_MIN_UP)        //MINUTE+鍵
  143.                                 {
  144.                                         if(++minute >= 60)        minute = 0;
  145.                                         second = 0;
  146.                                         SetRTC();
  147.                                         RTC_ShowLCD();        //顯示時間信息
  148.                                 }
  149.                                 else if(KeyCode == K_MIN_DN)        //MINUTE-鍵
  150.                                 {
  151.                                         if(--minute >= 60)        minute = 59;
  152.                                         second = 0;
  153.                                         SetRTC();
  154.                                         RTC_ShowLCD();        //顯示時間信息
  155.                                 }
  156.                         }
  157.                         else if(DisMode == 2)        //顯示月日時可以調(diào)日期
  158.                         {
  159.                                 if(KeyCode == K_HOUR)        //hour鍵
  160.                                 {
  161.                                         if(++month >= 13)        month = 1;
  162.                                         SetRTC();
  163.                                         RTC_ShowLCD();        //顯示時間信息
  164.                                 }
  165.                                 else if(KeyCode == K_MIN_UP)        //MINUTE+鍵
  166.                                 {
  167.                                         if(++day >= 32)        day = 1;
  168.                                         SetRTC();
  169.                                         RTC_ShowLCD();        //顯示時間信息
  170.                                 }
  171.                                 else if(KeyCode == K_MIN_DN)        //MINUTE-鍵
  172.                                 {
  173.                                         if(--day == 0)        day = 31;
  174.                                         SetRTC();
  175.                                         RTC_ShowLCD();        //顯示時間信息
  176.                                 }
  177.                         }
  178.                         KeyCode = 0;
  179.                 }

  180.                 if(OpTime != 0)                // OpTime!=0進(jìn)入空閑模式
  181.                 {
  182.                         PCON |= 0x01;        //進(jìn)入空閑模式
  183.                         NOP(5);
  184.                 }
  185.                 else        //if(OpTime == 0)                // OpTime==0才進(jìn)入掉電模式
  186.                 {
  187.                         IE0 = 0;        //外中斷0標(biāo)志位
  188.                         IT0 = 1;        //下降沿中斷
  189.                         EX0 = 1;        //允許中斷
  190.                         P32 = 1;        //喚醒腳(也是鍵掃描腳)
  191.                         P64 = 0;        //按鍵輸入
  192.                         P65 = 0;        //按鍵輸入
  193.                         P66 = 0;        //按鍵輸入
  194.                         P67 = 0;        //按鍵輸入
  195.                         NOP(5);

  196.                         PCON |= 0x02;        //進(jìn)入睡眠模式
  197.                         NOP(5);
  198.                         EX0 = 0;        //禁止中斷
  199.                         P32 = 0;
  200.                         P64 = 1;
  201.                         P65 = 1;
  202.                         P66 = 1;
  203.                         P67 = 1;
  204.                         NOP(5);
  205.                 }
  206.         }
  207. }


  208. /********************* INT0中斷函數(shù) *************************/
  209. void Ext_INT0 (void) interrupt 0
  210. {
  211.         OpTime = 6;
  212. }

  213. void        ReadKey(void)        //20ms call
  214. {
  215.         u8        i;
  216.         i = KeyState;        KeyState = ~P6 & 0xf0;
  217.         i = (i ^ KeyState) & KeyState;
  218.         if(i != 0)        KeyCode = i;        //按下
  219.         if(KeyState)
  220.         {
  221.                 OpTime = 6;        //有鍵按著
  222.                 if(++KeyHoldCnt >= 50)
  223.                 {
  224.                         KeyHoldCnt = 45;
  225.                         KeyCode = KeyState & 0xe0;
  226.                 }
  227.         }
  228.         else        KeyHoldCnt = 0;
  229. }


  230. /********************** 顯示時間信息 *****************************/
  231. void        RTC_ShowLCD(void)
  232. {
  233.         if(DisMode == 0)        //0: 顯示時分, 1:顯示分秒, 2:顯示月日
  234.         {
  235.                 if(hour >= 10)        LCD_load(1, hour/10);
  236.                 else                        LCD_load(1, DIS_BLACK);                //消隱
  237.                 LCD_load(2, hour%10);
  238.                 LCD_load(3, DIS_BLACK);
  239.                 LCD_load(4, minute / 10);
  240.                 LCD_load(5, minute % 10);
  241.         }
  242.         else if(DisMode == 1)        //0: 顯示時分, 1:顯示分秒, 2:顯示月日
  243.         {
  244.                 LCD_load(1, minute/10);
  245.                 LCD_load(2, minute%10);
  246.                 LCD_load(3, DIS_BLACK);
  247.                 LCD_load(4, second / 10);
  248.                 LCD_load(5, second % 10);
  249.         }
  250.         else if(DisMode == 2)        //0: 顯示時分, 1:顯示分秒, 2:顯示月日
  251.         {
  252.                 if(month >= 10)        LCD_load(1, month/10);
  253.                 else                        LCD_load(1, DIS_BLACK);
  254.                 LCD_load(2, month%10);
  255.                 LCD_load(3, DIS_BLACK);
  256.                 LCD_load(4, day / 10);
  257.                 LCD_load(5, day % 10);
  258.         }

  259.         LoadToLcd();
  260. }

  261. /****************** 對第1~5數(shù)字裝載顯示函數(shù) ***************************/
  262. u8 code t_display[]={                                                //標(biāo)準(zhǔn)字庫
  263. //         0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
  264.         0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
  265. //black         -     H    J         K          L           N        o   P         U     t    G    Q    r   M    y
  266.         0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e};

  267. u8        code T_LCD_mask[7]  = {0x00,0x0C,0x30,0xC0,0x03,0x0C};
  268. u8        code T_LCD_mask7[7] = {0x00,0x04,0x10,0x40,0x01,0x04};
  269. u8        code T_SEG_ABC[7]   = {0x00,0x08,0x20,0x80,0x02,0x08};
  270. u8        code T_SEG_DEFG[7]  = {0x00,0x04,0x10,0x40,0x01,0x04};

  271. /********************** 裝載顯示5個8字 *****************************/
  272. void        LCD_load(u8 n, u8 dat)                //n為第幾個數(shù)字,為1~5,dat為要顯示的數(shù)字
  273. {
  274.         u8        i,k;

  275.         if((n == 0) || (n >= 6))        return;        //合法值 1~5

  276.         dat =  t_display[dat];
  277.         k   = ~T_LCD_mask[n];

  278.         if(n <= 3)        //1~3
  279.         {
  280.                 LCD_buff[0] &= ~T_LCD_mask7[n];
  281.                 LCD_buff[2] &= k;
  282.                 LCD_buff[4] &= k;
  283.                 LCD_buff[6] &= k;
  284.                 i = T_SEG_ABC[n];
  285.                 k = T_SEG_DEFG[n];
  286.                 if(dat & 0x01)                LCD_buff[6] |= i;        //T_SEG_ABC[n];                //A
  287.                 if(dat & 0x02)                LCD_buff[4] |= i;        //T_SEG_ABC[n];                //B
  288.                 if(dat & 0x04)                LCD_buff[2] |= i;        //T_SEG_ABC[n];                //C
  289.                 if(dat & 0x08)                LCD_buff[0] |= k;        //T_SEG_DEFG[n];        //D
  290.                 if(dat & 0x10)                LCD_buff[2] |= k;        //T_SEG_DEFG[n];        //E
  291.                 if(dat & 0x20)                LCD_buff[6] |= k;        //T_SEG_DEFG[n];        //F
  292.                 if(dat & 0x40)                LCD_buff[4] |= k;        //T_SEG_DEFG[n];        //G
  293.         }
  294.         else        // n=4 or 5
  295.         {
  296.                 LCD_buff[1] &= ~T_LCD_mask7[n];
  297.                 LCD_buff[3] &= k;
  298.                 LCD_buff[5] &= k;
  299.                 LCD_buff[7] &= k;
  300.                 i = T_SEG_ABC[n];
  301.                 k = T_SEG_DEFG[n];
  302.                 if(dat & 0x01)                LCD_buff[7] |= i;        //T_SEG_ABC[n];                //A
  303.                 if(dat & 0x02)                LCD_buff[5] |= i;        //T_SEG_ABC[n];                //B
  304.                 if(dat & 0x04)                LCD_buff[3] |= i;        //T_SEG_ABC[n];                //C
  305.                 if(dat & 0x08)                LCD_buff[1] |= k;        //T_SEG_DEFG[n];        //D
  306.                 if(dat & 0x10)                LCD_buff[3] |= k;        //T_SEG_DEFG[n];        //E
  307.                 if(dat & 0x20)                LCD_buff[7] |= k;        //T_SEG_DEFG[n];        //F
  308.                 if(dat & 0x40)                LCD_buff[5] |= k;        //T_SEG_DEFG[n];        //G
  309.         }
  310. }


  311. /********************** 將顯示內(nèi)容導(dǎo)入顯存 *****************************/
  312. void        LoadToLcd(void)
  313. {
  314.         C0SEGV1 = LCD_buff[0];    // C0SEG 15~8數(shù)據(jù)寄存器
  315.         C0SEGV2 = LCD_buff[1];    // C0SEG 23~16數(shù)據(jù)寄存器
  316.         C1SEGV1 = LCD_buff[2];    // C1SEG 15~8數(shù)據(jù)寄存器
  317.         C1SEGV2 = LCD_buff[3];    // C1SEG 23~16數(shù)據(jù)寄存器
  318.         C2SEGV1 = LCD_buff[4];    // C2SEG 15~8數(shù)據(jù)寄存器
  319.         C2SEGV2 = LCD_buff[5];    // C2SEG 23~16數(shù)據(jù)寄存器
  320.         C3SEGV1 = LCD_buff[6];    // C3SEG 15~8數(shù)據(jù)寄存器
  321.         C3SEGV2 = LCD_buff[7];    // C3SEG 23~16數(shù)據(jù)寄存器
  322. }

  323. /********************** LCD配置函數(shù) *****************************/
  324. void        LCD_config(void)
  325. {
  326.         u8        i;

  327.         P_SW2 |= 0x80;                // SFR enable

  328.         LCDCFG  = 0x80 + 7;        // 0x00:選擇CPU時鐘為LCD時鐘, 0x80: 選擇外部32K晶振做時鐘. VLCD電壓選擇0~7對應(yīng)0.65+VLCD*0.05.
  329.         DBLEN   = 2;                // 設(shè)置LCD顯示時的死區(qū)時間長度, 取值0~7.
  330.         COMLENH        = 0;                // COM時間長度設(shè)置 高字節(jié)COMLEN[19:16],  一共20bit.
  331.         COMLENM        = 0;                // COM時間長度設(shè)置 中字節(jié)COMLEN[15:8]        LCD刷新率 = LCD時鐘頻率 / ((DBLEN[2:0]+COMLEN[19:0]+1) *2 * COM數(shù))
  332.         COMLENL        = 65;                // COM時間長度設(shè)置 低字節(jié)COMLEN[7:0]        LCD刷新率 = 32768/((2+65+1)*2*4) = 60Hz
  333.         BLINKRATE = 60;                // 閃爍率配置寄存器, LCD閃爍率 = LCD刷新率 / BLINKRATE[7:0] Hz

  334.         COMON  = 0x0f;                // COM使能寄存器
  335.         SEGON1 = 0x00;                // SEG線使能寄存器1, SEG7~SEG0
  336.         SEGON2 = 0xff;                // SEG線使能寄存器2, SEG15~SEG8
  337.         SEGON3 = 0x0f;                // SEG線使能寄存器3, SEG23~SEG16
  338.         SEGON4 = 0x00;                // SEG線使能寄存器4, SEG31~SEG24
  339.         SEGON5 = 0x00;                // SEG線使能寄存器5, SEG39~SEG32
  340.         P5n_pure_input(0x03);        //P5.0 P5.1 設(shè)置為高阻輸入        COM0 COM1
  341.         P3n_pure_input(0x60);        //P3.5 P3.6 設(shè)置為高阻輸入        COM2 COM3

  342.         LCDCFG2 = 0x0f;                        // SEG0~3切換到P7.7~7.4
  343. //        P7n_pure_input(0xf0);        //P7.7~P7.4 設(shè)置為高阻輸入        SEG0~SEG3 (對應(yīng)P7.7~7.4)
  344. //        P4n_pure_input(0x80);        //P4.7      設(shè)置為高阻輸入        SEG4
  345. //        P1n_pure_input(0x03);        //P1.1~P1.0 設(shè)置為高阻輸入        SEG5 SEG6       (對應(yīng)P1.1 P1.0)
  346.         P0n_pure_input(0x60);        //P0.7~P0.5 設(shè)置為高阻輸入        SEG7 SEG8 SEG9  (對應(yīng)P0.7 P0.6 P0.5)
  347.         P5n_pure_input(0x0C);        //P5.3 P5.2 設(shè)置為高阻輸入        SEG10 SEG11     (對應(yīng)P5.3 P5.2)
  348.         P0n_pure_input(0x1f);        //P0.4~P0.0 設(shè)置為高阻輸入        SEG12~SEG16  (對應(yīng)P0.4 ~ 0.0)
  349.         P4n_pure_input(0x60);        //P4.6 P4.5 設(shè)置為高阻輸入        SEG17 SEG18
  350.         P2n_pure_input(0x80);        //P2.7~P2.0 設(shè)置為高阻輸入        SEG19~SEG26  (對應(yīng)P2.7~2.0)
  351. //        P4n_pure_input(0x1e);        //P4.4~P4.1 設(shè)置為高阻輸入        SEG27~SEG30  (對應(yīng)P4.4~4.1)
  352. //        P3n_pure_input(0x80);        //P3.7      設(shè)置為高阻輸入        SEG31
  353. //        P7n_pure_input(0x0f);        //P7.3~P7.0 設(shè)置為高阻輸入        SEG32~SEG35  (對應(yīng)P7.3~7.0)
  354. //        P6n_pure_input(0x0f);        //P6.0~P6.3 設(shè)置為高阻輸入        SEG36~SEG39  (對應(yīng)P6.3~6.0)

  355.         for(i=0; i<8; i++)        LCD_buff[i] = 0x00;        //清除顯示內(nèi)容
  356.         LoadToLcd();        //將顯示內(nèi)容導(dǎo)入顯存

  357.         LCDCR = (0<<1) + 1;        // LCD控制寄存器, 0:普通模式, 1:長暗模式, 2:長亮模式, 3:閃爍模式.  +0:禁止LCD模塊,  +1:允許LCD模塊.
  358. }

  359. /********************** 設(shè)置RTC時間 *****************************/
  360. u8        SetRTC(void)
  361. {
  362.         P_SW2 |= 0x80;                //SFR enable
  363.         if(year > 99)                                                return 1;
  364.         if((month == 0) || (month > 12))        return 2;
  365.         if((day == 0) || (day > 31))                return 3;
  366.         if(hour > 23)                                        return 4;
  367.         if(minute > 59)                                        return 5;
  368.         if(second > 59)                                        return 6;
  369.         INIYEAR  = year;
  370.         INIMONTH = month;
  371.         INIDAY   = day;
  372.         INIHOUR  = hour;
  373.         INIMIN   = minute;
  374.         INISEC   = second;
  375.         INISSEC  = 0;
  376.         RTCCFG   = 0x01 | 0x00;        //設(shè)置RTC時間, |0x00:選擇外部32K時鐘, |0x02:選擇內(nèi)部32K時鐘.
  377.         while(RTCCFG & 0x01);        //等待初始化完成. 設(shè)置RTC時間需要32768Hz的1個周期時間,大約30.5us. 由于同步, 所以實(shí)際等待時間是0~30.5us.
  378.                                                         //如果不等待設(shè)置完成就睡眠, 則RTC會由于設(shè)置沒完成, 停止計(jì)數(shù), 喚醒后才繼續(xù)完成設(shè)置并繼續(xù)計(jì)數(shù).
  379.         return 0;
  380. }

  381. /********************** RTC配置函數(shù) *****************************/
  382. void        RTC_config(void)        //RTC初始化函數(shù)
  383. {
  384.         P_SW2  |= 0x80;                //SFR enable
  385.         P1n_pure_input(0xc0);                //P1.6 P1.7設(shè)置為高阻輸入
  386.         P1IE = ~0xc0;                                //P1.6 P1.7關(guān)閉數(shù)字輸入功能
  387.         X32KCR = 0x80 + 0x40;                //啟動外部32K晶振, 低增益+0x00, 高增益+0x40.

  388.         year    = 21;
  389.         month   = 7;
  390.         day     = 29;
  391.         hour    = 12;
  392.         minute  = 0;
  393.         second  = 0;

  394.         RTCCR   = 0x01;        //使能RTC, 并開始RTC計(jì)數(shù)
  395.         SetRTC();                //設(shè)置RTC時間
  396.         RTCIF   = 0;        //中斷標(biāo)志, 0x80:鬧鐘中斷, 0x40:日中斷, 0x20:小時中斷, 0x10:分鐘中斷, 0x08:秒中斷, 0x04:1/2秒中斷, 0x02:1/8秒中斷, 0x01:1/32秒中斷
  397.         RTCIEN  = 0x04;        //中斷使能, 0x80:鬧鐘中斷, 0x40:日中斷, 0x20:小時中斷, 0x10:分鐘中斷, 0x08:秒中斷, 0x04:1/2秒中斷, 0x02:1/8秒中斷, 0x01:1/32秒中斷
  398.         ALAHOUR = 8;        //鬧鐘小時
  399.         ALAMIN  = 30;        //鬧鐘分鐘
  400.         ALASEC  = 0;        //鬧鐘秒
  401.         ALASSEC = 0;        //鬧鐘1/128秒
  402. }

  403. /********************** 讀取RTC時間信息 *****************************/
  404. void        RTC_read(void)
  405. {
  406.         P_SW2  |= 0x80;                //SFR enable
  407.         year    = RTC_YEAR;                // RTC的年計(jì)數(shù)值
  408.         month   = RTC_MONTH;        // RTC的月計(jì)數(shù)值
  409.         day     = RTC_DAY;                // RTC的日計(jì)數(shù)值
  410.         hour    = RTC_HOUR;                // RTC的時計(jì)數(shù)值
  411.         minute  = RTC_MIN;                // RTC的分計(jì)數(shù)值
  412.         second  = RTC_SEC;                // RTC的秒計(jì)數(shù)值
  413. //        ssecond = RTC_SSEC;                // RTC的1/128秒計(jì)數(shù)值
  414. }

  415. //========================================================================
  416. // 函數(shù):u8        Timer0_Config(u32 reload)
  417. // 描述: timer0初始化函數(shù).
  418. // 參數(shù): reload: 重裝值.
  419. // 返回: 0: 初始化正確, 1: 重裝值過大, 初始化錯誤.
  420. // 版本: V1.0, 2018-3-5
  421. //========================================================================
  422. u8        Timer0_Config(u32 reload)        //t=0: reload值是主時鐘周期數(shù),  t=1: reload值是時間(單位us)
  423. {
  424.         TR0 = 0;        //停止計(jì)數(shù)

  425.         if(reload >= (65536UL * 12))        return 1;        //值過大, 返回錯誤
  426.         if(reload < 65536UL)        AUXR |= 0x80;                //1T mode
  427.         else
  428.         {
  429.                 AUXR &= ~0x80;        //12T mode
  430.                 reload = reload / 12;
  431.         }
  432.         reload = 65536UL - reload;
  433.         TH0 = (u8)(reload >> 8);
  434.         TL0 = (u8)(reload);

  435.         ET0 = 1;        //允許中斷
  436.         TMOD = (TMOD & ~0x03) | 0;        //工作模式, 0: 16位自動重裝, 1: 16位定時/計(jì)數(shù), 2: 8位自動重裝, 3: 16位自動重裝, 不可屏蔽中斷
  437.         TR0 = 1;                        //開始運(yùn)行
  438.         return 0;
  439. }

  440. //========================================================================
  441. // 函數(shù): void timer0_int (void) interrupt TIMER0_VECTOR
  442. // 描述:  timer0中斷函數(shù).
  443. // 參數(shù): none.
  444. // 返回: none.
  445. // 版本: V1.0, 2016-5-12
  446. //========================================================================
  447. void timer0_ISR (void) interrupt TIMER0_VECTOR
  448. {
  449.    B_20ms = 1;        //20ms時隙標(biāo)志
  450. }


  451. //========================================================================
  452. // 函數(shù): AUXR_ISR(void) interrupt 13
  453. // 描述: 擴(kuò)展中斷函數(shù)(中斷號>=32的中斷)
  454. // 參數(shù): none.
  455. // 返回: none.
  456. // 版本: VER1.0
  457. // 日期: 2018-4-2
  458. // 備注:
  459. //========================================================================
  460. u8        isr_index;
  461. void        AUXR_ISR(void) interrupt 13
  462. {
  463.         u8        i;
  464.         switch(isr_index)
  465.         {
  466.                 case 32:                //0103H 波形發(fā)生器5 中斷入口
  467.                                                 //用戶中斷處理代碼
  468.                 break;

  469.                 case 33:                //010BH        波形發(fā)生器異常2 中斷入口
  470.                                                 //用戶中斷處理代碼
  471.                 break;

  472.                 case 34:                //0113H        波形發(fā)生器異常4 中斷入口
  473.                                                 //用戶中斷處理代碼
  474.                 break;

  475.                 case 35:                //011BH        觸摸按鍵 中斷入口
  476.                                                 //用戶中斷處理代碼
  477.                 break;

  478.                 case 36:                //0123H        RTC 中斷入口
  479.                         i = RTCIF;
  480.                         RTCIF = 0;                //中斷標(biāo)志, 0x80:鬧鐘中斷, 0x40:日中斷, 0x20:小時中斷, 0x10:分鐘中斷, 0x08:秒中斷, 0x04:1/2秒中斷, 0x02:1/8秒中斷, 0x01:1/32秒中斷
  481.                         if(i & 0x04)        //1/2秒中斷
  482.                         {
  483.                                 B_500mS = 1;
  484.                                 P33 = ~P33;        //輸出2秒周期方波, 方便測試精度
  485.                         }
  486.                 break;

  487.                 case 37:                //012BH        P0口中斷入口
  488.                                                 //用戶中斷處理代碼
  489.                 break;

  490.                 case 38:                //0133H        P1口中斷入口
  491.                                                 //用戶中斷處理代碼
  492.                 break;

  493.                 case 39:                //013BH        P2口中斷入口
  494.                                                 //用戶中斷處理代碼
  495.                 break;

  496.                 case 40:                //0143H        P3口中斷入口
  497.                                                 //用戶中斷處理代碼
  498.                 break;

  499.                 case 41:                //014BH        P4口中斷入口
  500.                                                 //用戶中斷處理代碼
  501.                 break;

  502.                 case 42:                //0153H        P5口中斷入口
  503.                                                 //用戶中斷處理代碼
  504.                 break;

  505.                 case 43:                //015BH        P6口中斷入口
  506.                                                 //用戶中斷處理代碼
  507.                 break;

  508.                 case 44:                //0163H        P7口中斷入口
  509.                                                 //用戶中斷處理代碼
  510.                 break;

  511.                 case 45:                //016BH        P8口中斷入口
  512.                                                 //用戶中斷處理代碼
  513.                 break;

  514.                 case 46:                //0173H        P9口中斷入口
  515.                                                 //用戶中斷處理代碼
  516.                 break;

  517.                 default:
  518.                 break;
  519.         }
  520. }
復(fù)制代碼
Keil代碼下載: STC8H4K64TLCD-LCD-RTC-Demo-20220810.zip (131.77 KB, 下載次數(shù): 38)

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 免费成人高清在线视频 | 国产精品久久国产精品 | 成人aaa视频 | 97精品国产97久久久久久免费 | 久久国产精品一区二区 | 91国在线观看| 亚洲电影一区二区三区 | 日日夜夜精品免费视频 | 亚洲精品久久久久国产 | 黄色一级网 | 午夜国产在线 | 天天干天天爽 | 色婷婷综合久久久中字幕精品久久 | 中文字幕日韩欧美一区二区三区 | 免费国产一区二区 | 三级av网址 | www.狠狠干| 午夜精品一区二区三区在线观看 | 亚洲第一福利网 | 手机看黄av免费网址 | a级毛片毛片免费观看久潮喷 | 亚洲精品九九 | 91精品国产一区二区三区 | 久久精品久久久久久 | 黄色毛片在线观看 | av资源网站 | 一级在线视频 | 日韩高清一区 | 蜜臀久久99精品久久久久久宅男 | 一区二区三区视频免费观看 | 人人做人人澡人人爽欧美 | 国产精品视频一区二区三 | 自拍第一页 | 国产精品色 | 国产乱码一区 | 日韩在线一区二区三区 | 免费三级网 | 欧美精品福利视频 | 国产精品久久久久久久免费大片 | 91精品国产综合久久久动漫日韩 | 国产精品毛片一区二区在线看 |