矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 2017|回复: 2

STC8H4K64TLCD-45MHz-LQFP64,硬件LCD段码驱动显示-硬件实时时钟演示

[复制链接]
发表于 2022-11-1 11:34:13 | 显示全部楼层 |阅读模式
STC8H4K64TLCD-45MHz-LQFP64,硬件LCD段码驱动显示程序,硬件实时时钟演示程序
STC8H4K64TLCD-LCD-RTC-Demo-20220810.zip (131.77 KB, 下载次数: 31)

/*********************************************************/
#define MAIN_Fosc                11059200L        //定义主时钟

#include        "STC8H4K64TL.h"


/*************        功能说明        **************

请先别修改程序, 直接下载"04-RTC基本操作-5位液晶显示时间"里的"rtc.hex"测试, 主频选择11.0592MHZ. 测试正常后再修改移植.

K1切换显示时分和分秒。
K2调整小时+.  按下超过1秒, 则提供1秒10个键码.
K3调整分钟+. 按下超过1秒, 则提供1秒10个键码.
K4调整分钟-. 按下超过1秒, 则提供1秒10个键码.

特别提醒: 本例子仅仅是一个示范程序, 不同的段码液晶, 其笔段排列不同, 要根据具体的液晶屏来确定显存映射.
MCU电流: 根据LCD面积大约10~25uA.


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

LCD显示内容:  -日.日.日.日.日

                B7                B6                B5                B4                B3                B2                B1                B0
LCD_buff[0]:        2H                3D                1H                2D                左下        1D                B1                B0                左下为左下角的箭头, B0为电池框, B1为电量1
LCD_buff[1]:        --                --                --                --                4H                5D                3H                4D
LCD_buff[2]:        3C                3E                2C                2E                1C                1E                B2                右上        右上为右上角的箭头, B2为电量2
LCD_buff[3]:        --                --                --                --                5C                5E                4C                4E
LCD_buff[4]:        3B                3G                2B                2G                1B                1G                B3                -                B3为电量3, -为左边符号
LCD_buff[5]:        --                --                --                --                5B                5G                4B                4G
LCD_buff[6]:        3A                3F                2A                2F                1A                1F                B4                左上        左上为左上角的箭头
LCD_buff[7]:        --                --                --                --                5A                5F                4A                4F


 楼主| 发表于 2022-11-1 11:34:36 | 显示全部楼层
******************************************/

/*************        本地常量声明        **************/

#define K_SWITCH        0x10
#define K_HOUR                0x20
#define K_MIN_UP        0x40
#define K_MIN_DN        0x80


#define DIS_BLACK        0x10
#define DIS_                0x11

#define LCD_SET_BAT0        LCD_buff[0] |=  0x01
#define LCD_CLR_BAT0        LCD_buff[0] &= ~0x01
#define LCD_CPL_BAT0        LCD_buff[0] ^=  0x01

#define LCD_SET_BAT1        LCD_buff[0] |=  0x02
#define LCD_CLR_BAT1        LCD_buff[0] &= ~0x02
#define LCD_CPL_BAT1        LCD_buff[0] ^=  0x02

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

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

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

#define LCD_SET_LEFT_UP                LCD_buff[6] |=  0x01
#define LCD_CLR_LEFT_UP                LCD_buff[6] &= ~0x01
#define LCD_SET_LEFT_DN                LCD_buff[0] |=  0x08
#define LCD_CLR_LEFT_DN                LCD_buff[0] &= ~0x08
#define LCD_SET_RIGHT_UP        LCD_buff[2] |=  0x01
#define LCD_CLR_RIGHT_UP        LCD_buff[2] &= ~0x01


/*************        本地IO定义        **************/


/*************        本地变量声明        **************/

u8        year, month, day, week, hour, minute, second;        //RTC实时时间
bit        B_500mS;        // 0.5秒时隙标志
bit        B_20ms;                // 20ms时隙标志
u8        OpTime;                // 此变量非0时, 不睡眠, 连续运行程序(本例串口唤醒后连续运行5秒, 以便正确接收串口数据)

u8        idata        LCD_buff[8];        //LCD显存

u8        DisMode;                //显示模式, 0: 显示时分, 1:显示分秒, 2:显示月日

u8        KeyState;        //键状态
u8        KeyCode;        //键码
u8        KeyHoldCnt;        //重键计数


/*************        本地函数声明        **************/
u8                SetRTC(void);                //设置RTC时间函数
void        RTC_config(void);        //RTC初始化函数
void        RTC_read(void);                //读RTC时间函数
void        RTC_ShowLCD(void);        //显示时间信息
u8                Timer0_Config(u32 reload);        //reload值是主时钟周期数
void        LCD_config(void);
void        LoadToLcd(void);
void        LCD_load(u8 n, u8 dat);                //n为第几个数字,为1~5,dat为要显示的数字
void        ReadKey(void);        //50ms call


//========================================================================
// 函数: void main(void)
// 描述: 主函数
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2018-4-2
// 备注:
//========================================================================
void main(void)
{
        P0M1 = 0;        P0M0 = 0;
        P1M1 = 0;        P1M0 = 0;
        P2M1 = 0;        P2M0 = 0;
        P3M1 = 0;        P3M0 = 0;
        P4M1 = 0;        P4M0 = 0;
        P5M1 = 0;        P5M0 = 0;
        P6M1 = 0;        P6M0 = 0;
        P7M1 = 0;        P7M0 = 0;

        Timer0_Config(MAIN_Fosc / 50);        //reload值是主时钟周期数,  (中断频率, 50次/秒)

        EA = 1;

        OpTime  = 0;
        DisMode = 0;
        RTC_config();
        LCD_config();

        while (1)
        {
                if(B_20ms)
                {
                        B_20ms = 0;
                        ReadKey();
                }

                if(B_500mS)        // 1/2秒中断
                {
                        B_500mS = 0;
                        if(second  == RTC_SEC)                // RTC的秒计数值, 相等则秒没变化, 0.5秒而已, 闪点
                        {
                                if(DisMode <= 1)        //显示时分或分秒才闪秒
                                {
                                        LCD_load(3, DIS_);        //秒闪中间一杠
                                        LoadToLcd();
                                }
                        }
                        else        //秒有变化
                        {
                                RTC_read();
                                if(OpTime != 0)        OpTime--;        //连续操作时间
                                RTC_ShowLCD();        //显示时间信息
                        }

                }

                if(KeyCode != 0)
                {
                        if(KeyCode == K_SWITCH)                //短按K1键 切换显示
                        {
                                if(++DisMode >= 3)        DisMode = 0;        //0: 显示时分, 1:显示分秒, 2:显示月日
                                RTC_ShowLCD();        //显示时间信息
                        }
                        else if(DisMode == 0)        //显示时分时可以调时间
                        {
                                if(KeyCode == K_HOUR)        //hour键
                                {
                                        if(++hour >= 24)        hour = 0;
                                        SetRTC();
                                        RTC_ShowLCD();        //显示时间信息
                                }
                                else if(KeyCode == K_MIN_UP)        //MINUTE+键
                                {
                                        if(++minute >= 60)        minute = 0;
                                        second = 0;
                                        SetRTC();
                                        RTC_ShowLCD();        //显示时间信息
                                }
                                else if(KeyCode == K_MIN_DN)        //MINUTE-键
                                {
                                        if(--minute >= 60)        minute = 59;
                                        second = 0;
                                        SetRTC();
                                        RTC_ShowLCD();        //显示时间信息
                                }
                        }
                        else if(DisMode == 2)        //显示月日时可以调日期
                        {
                                if(KeyCode == K_HOUR)        //hour键
                                {
                                        if(++month >= 13)        month = 1;
                                        SetRTC();
                                        RTC_ShowLCD();        //显示时间信息
                                }
                                else if(KeyCode == K_MIN_UP)        //MINUTE+键
                                {
                                        if(++day >= 32)        day = 1;
                                        SetRTC();
                                        RTC_ShowLCD();        //显示时间信息
                                }
                                else if(KeyCode == K_MIN_DN)        //MINUTE-键
                                {
                                        if(--day == 0)        day = 31;
                                        SetRTC();
                                        RTC_ShowLCD();        //显示时间信息
                                }
                        }
                        KeyCode = 0;
                }

                if(OpTime != 0)                // OpTime!=0进入空闲模式
                {
                        PCON |= 0x01;        //进入空闲模式
                        NOP(5);
                }
                else        //if(OpTime == 0)                // OpTime==0才进入掉电模式
                {
                        IE0 = 0;        //外中断0标志位
                        IT0 = 1;        //下降沿中断
                        EX0 = 1;        //允许中断
                        P32 = 1;        //唤醒脚(也是键扫描脚)
                        P64 = 0;        //按键输入
                        P65 = 0;        //按键输入
                        P66 = 0;        //按键输入
                        P67 = 0;        //按键输入
                        NOP(5);

                        PCON |= 0x02;        //进入睡眠模式
                        NOP(5);
                        EX0 = 0;        //禁止中断
                        P32 = 0;
                        P64 = 1;
                        P65 = 1;
                        P66 = 1;
                        P67 = 1;
                        NOP(5);
                }
        }
}
回复 支持 2 反对 0

使用道具 举报

     
发表于 2022-11-9 16:17:03 来自手机 | 显示全部楼层
可以涨知识的帖子都要马克一下。这款不止可以驱动LCD,还带触摸吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-27 15:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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