国学芯用 发表于 2022-10-28 10:07:10

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

STC8H4K64TLCD-45MHz-LQFP64,硬件LCD段码驱动显示程序,硬件实时时钟演示程序
STC8H系列收据手册https://www.stcai.com/filedownload/624267




/*********************************************************/
#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:        2H                3D                1H                2D                左下        1D                B1                B0                左下为左下角的箭头, B0为电池框, B1为电量1
LCD_buff:        --                --                --                --                4H                5D                3H                4D
LCD_buff:        3C                3E                2C                2E                1C                1E                B2                右上        右上为右上角的箭头, B2为电量2
LCD_buff:        --                --                --                --                5C                5E                4C                4E
LCD_buff:        3B                3G                2B                2G                1B                1G                B3                -                B3为电量3, -为左边符号
LCD_buff:        --                --                --                --                5B                5G                4B                4G
LCD_buff:        3A                3F                2A                2F                1A                1F                B4                左上        左上为左上角的箭头
LCD_buff:        --                --                --                --                5A                5F                4A                4F

******************************************/

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

#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 |=0x01
#define LCD_CLR_BAT0        LCD_buff &= ~0x01
#define LCD_CPL_BAT0        LCD_buff ^=0x01

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

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

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

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

#define LCD_SET_LEFT_UP                LCD_buff |=0x01
#define LCD_CLR_LEFT_UP                LCD_buff &= ~0x01
#define LCD_SET_LEFT_DN                LCD_buff |=0x08
#define LCD_CLR_LEFT_DN                LCD_buff &= ~0x08
#define LCD_SET_RIGHT_UP        LCD_buff |=0x01
#define LCD_CLR_RIGHT_UP        LCD_buff &= ~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;        //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);
                }
        }
}


/********************* INT0中断函数 *************************/
void Ext_INT0 (void) interrupt 0
{
        OpTime = 6;
}

void        ReadKey(void)        //20ms call
{
        u8        i;
        i = KeyState;        KeyState = ~P6 & 0xf0;
        i = (i ^ KeyState) & KeyState;
        if(i != 0)        KeyCode = i;        //按下
        if(KeyState)
        {
                OpTime = 6;        //有键按着
                if(++KeyHoldCnt >= 50)
                {
                        KeyHoldCnt = 45;
                        KeyCode = KeyState & 0xe0;
                }
        }
        else        KeyHoldCnt = 0;
}


/********************** 显示时间信息 *****************************/
void        RTC_ShowLCD(void)
{
        if(DisMode == 0)        //0: 显示时分, 1:显示分秒, 2:显示月日
        {
                if(hour >= 10)        LCD_load(1, hour/10);
                else                        LCD_load(1, DIS_BLACK);                //消隐
                LCD_load(2, hour%10);
                LCD_load(3, DIS_BLACK);
                LCD_load(4, minute / 10);
                LCD_load(5, minute % 10);
        }
        else if(DisMode == 1)        //0: 显示时分, 1:显示分秒, 2:显示月日
        {
                LCD_load(1, minute/10);
                LCD_load(2, minute%10);
                LCD_load(3, DIS_BLACK);
                LCD_load(4, second / 10);
                LCD_load(5, second % 10);
        }
        else if(DisMode == 2)        //0: 显示时分, 1:显示分秒, 2:显示月日
        {
                if(month >= 10)        LCD_load(1, month/10);
                else                        LCD_load(1, DIS_BLACK);
                LCD_load(2, month%10);
                LCD_load(3, DIS_BLACK);
                LCD_load(4, day / 10);
                LCD_load(5, day % 10);
        }

        LoadToLcd();
}

/****************** 对第1~5数字装载显示函数 ***************************/
u8 code t_display[]={                                                //标准字库
//       0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
        0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black       -   H    J       K          L           N        o   P       U   t    G    Q    r   M    y
        0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e};

u8        code T_LCD_mask= {0x00,0x0C,0x30,0xC0,0x03,0x0C};
u8        code T_LCD_mask7 = {0x00,0x04,0x10,0x40,0x01,0x04};
u8        code T_SEG_ABC   = {0x00,0x08,0x20,0x80,0x02,0x08};
u8        code T_SEG_DEFG= {0x00,0x04,0x10,0x40,0x01,0x04};

/********************** 装载显示5个8字 *****************************/
void        LCD_load(u8 n, u8 dat)                //n为第几个数字,为1~5,dat为要显示的数字
{
        u8        i,k;

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

        dat =t_display;
        k   = ~T_LCD_mask;

        if(n <= 3)        //1~3
        {
                LCD_buff &= ~T_LCD_mask7;
                LCD_buff &= k;
                LCD_buff &= k;
                LCD_buff &= k;
                i = T_SEG_ABC;
                k = T_SEG_DEFG;
                if(dat & 0x01)                LCD_buff |= i;        //T_SEG_ABC;                //A
                if(dat & 0x02)                LCD_buff |= i;        //T_SEG_ABC;                //B
                if(dat & 0x04)                LCD_buff |= i;        //T_SEG_ABC;                //C
                if(dat & 0x08)                LCD_buff |= k;        //T_SEG_DEFG;        //D
                if(dat & 0x10)                LCD_buff |= k;        //T_SEG_DEFG;        //E
                if(dat & 0x20)                LCD_buff |= k;        //T_SEG_DEFG;        //F
                if(dat & 0x40)                LCD_buff |= k;        //T_SEG_DEFG;        //G
        }
        else        // n=4 or 5
        {
                LCD_buff &= ~T_LCD_mask7;
                LCD_buff &= k;
                LCD_buff &= k;
                LCD_buff &= k;
                i = T_SEG_ABC;
                k = T_SEG_DEFG;
                if(dat & 0x01)                LCD_buff |= i;        //T_SEG_ABC;                //A
                if(dat & 0x02)                LCD_buff |= i;        //T_SEG_ABC;                //B
                if(dat & 0x04)                LCD_buff |= i;        //T_SEG_ABC;                //C
                if(dat & 0x08)                LCD_buff |= k;        //T_SEG_DEFG;        //D
                if(dat & 0x10)                LCD_buff |= k;        //T_SEG_DEFG;        //E
                if(dat & 0x20)                LCD_buff |= k;        //T_SEG_DEFG;        //F
                if(dat & 0x40)                LCD_buff |= k;        //T_SEG_DEFG;        //G
        }
}


/********************** 将显示内容导入显存 *****************************/
void        LoadToLcd(void)
{
        C0SEGV1 = LCD_buff;    // C0SEG 15~8数据寄存器
        C0SEGV2 = LCD_buff;    // C0SEG 23~16数据寄存器
        C1SEGV1 = LCD_buff;    // C1SEG 15~8数据寄存器
        C1SEGV2 = LCD_buff;    // C1SEG 23~16数据寄存器
        C2SEGV1 = LCD_buff;    // C2SEG 15~8数据寄存器
        C2SEGV2 = LCD_buff;    // C2SEG 23~16数据寄存器
        C3SEGV1 = LCD_buff;    // C3SEG 15~8数据寄存器
        C3SEGV2 = LCD_buff;    // C3SEG 23~16数据寄存器
}

/********************** LCD配置函数 *****************************/
void        LCD_config(void)
{
        u8        i;

        P_SW2 |= 0x80;                // SFR enable

        LCDCFG= 0x80 + 7;        // 0x00:选择CPU时钟为LCD时钟, 0x80: 选择外部32K晶振做时钟. VLCD电压选择0~7对应0.65+VLCD*0.05.
        DBLEN   = 2;                // 设置LCD显示时的死区时间长度, 取值0~7.
        COMLENH        = 0;                // COM时间长度设置 高字节COMLEN,一共20bit.
        COMLENM        = 0;                // COM时间长度设置 中字节COMLEN        LCD刷新率 = LCD时钟频率 / ((DBLEN+COMLEN+1) *2 * COM数)
        COMLENL        = 65;                // COM时间长度设置 低字节COMLEN        LCD刷新率 = 32768/((2+65+1)*2*4) = 60Hz
        BLINKRATE = 60;                // 闪烁率配置寄存器, LCD闪烁率 = LCD刷新率 / BLINKRATE Hz

        COMON= 0x0f;                // COM使能寄存器
        SEGON1 = 0x00;                // SEG线使能寄存器1, SEG7~SEG0
        SEGON2 = 0xff;                // SEG线使能寄存器2, SEG15~SEG8
        SEGON3 = 0x0f;                // SEG线使能寄存器3, SEG23~SEG16
        SEGON4 = 0x00;                // SEG线使能寄存器4, SEG31~SEG24
        SEGON5 = 0x00;                // SEG线使能寄存器5, SEG39~SEG32
        P5n_pure_input(0x03);        //P5.0 P5.1 设置为高阻输入        COM0 COM1
        P3n_pure_input(0x60);        //P3.5 P3.6 设置为高阻输入        COM2 COM3

        LCDCFG2 = 0x0f;                        // SEG0~3切换到P7.7~7.4
//        P7n_pure_input(0xf0);        //P7.7~P7.4 设置为高阻输入        SEG0~SEG3 (对应P7.7~7.4)
//        P4n_pure_input(0x80);        //P4.7      设置为高阻输入        SEG4
//        P1n_pure_input(0x03);        //P1.1~P1.0 设置为高阻输入        SEG5 SEG6       (对应P1.1 P1.0)
        P0n_pure_input(0x60);        //P0.7~P0.5 设置为高阻输入        SEG7 SEG8 SEG9(对应P0.7 P0.6 P0.5)
        P5n_pure_input(0x0C);        //P5.3 P5.2 设置为高阻输入        SEG10 SEG11   (对应P5.3 P5.2)
        P0n_pure_input(0x1f);        //P0.4~P0.0 设置为高阻输入        SEG12~SEG16(对应P0.4 ~ 0.0)
        P4n_pure_input(0x60);        //P4.6 P4.5 设置为高阻输入        SEG17 SEG18
        P2n_pure_input(0x80);        //P2.7~P2.0 设置为高阻输入        SEG19~SEG26(对应P2.7~2.0)
//        P4n_pure_input(0x1e);        //P4.4~P4.1 设置为高阻输入        SEG27~SEG30(对应P4.4~4.1)
//        P3n_pure_input(0x80);        //P3.7      设置为高阻输入        SEG31
//        P7n_pure_input(0x0f);        //P7.3~P7.0 设置为高阻输入        SEG32~SEG35(对应P7.3~7.0)
//        P6n_pure_input(0x0f);        //P6.0~P6.3 设置为高阻输入        SEG36~SEG39(对应P6.3~6.0)

        for(i=0; i<8; i++)        LCD_buff = 0x00;        //清除显示内容
        LoadToLcd();        //将显示内容导入显存

        LCDCR = (0<<1) + 1;        // LCD控制寄存器, 0:普通模式, 1:长暗模式, 2:长亮模式, 3:闪烁模式.+0:禁止LCD模块,+1:允许LCD模块.
}

/********************** 设置RTC时间 *****************************/
u8        SetRTC(void)
{
        P_SW2 |= 0x80;                //SFR enable
        if(year > 99)                                                return 1;
        if((month == 0) || (month > 12))        return 2;
        if((day == 0) || (day > 31))                return 3;
        if(hour > 23)                                        return 4;
        if(minute > 59)                                        return 5;
        if(second > 59)                                        return 6;
        INIYEAR= year;
        INIMONTH = month;
        INIDAY   = day;
        INIHOUR= hour;
        INIMIN   = minute;
        INISEC   = second;
        INISSEC= 0;
        RTCCFG   = 0x01 | 0x00;        //设置RTC时间, |0x00:选择外部32K时钟, |0x02:选择内部32K时钟.
        while(RTCCFG & 0x01);        //等待初始化完成. 设置RTC时间需要32768Hz的1个周期时间,大约30.5us. 由于同步, 所以实际等待时间是0~30.5us.
                                                        //如果不等待设置完成就睡眠, 则RTC会由于设置没完成, 停止计数, 唤醒后才继续完成设置并继续计数.
        return 0;
}

/********************** RTC配置函数 *****************************/
void        RTC_config(void)        //RTC初始化函数
{
        P_SW2|= 0x80;                //SFR enable
        P1n_pure_input(0xc0);                //P1.6 P1.7设置为高阻输入
        P1IE = ~0xc0;                                //P1.6 P1.7关闭数字输入功能
        X32KCR = 0x80 + 0x40;                //启动外部32K晶振, 低增益+0x00, 高增益+0x40.

        year    = 21;
        month   = 7;
        day   = 29;
        hour    = 12;
        minute= 0;
        second= 0;

        RTCCR   = 0x01;        //使能RTC, 并开始RTC计数
        SetRTC();                //设置RTC时间
        RTCIF   = 0;        //中断标志, 0x80:闹钟中断, 0x40:日中断, 0x20:小时中断, 0x10:分钟中断, 0x08:秒中断, 0x04:1/2秒中断, 0x02:1/8秒中断, 0x01:1/32秒中断
        RTCIEN= 0x04;        //中断使能, 0x80:闹钟中断, 0x40:日中断, 0x20:小时中断, 0x10:分钟中断, 0x08:秒中断, 0x04:1/2秒中断, 0x02:1/8秒中断, 0x01:1/32秒中断
        ALAHOUR = 8;        //闹钟小时
        ALAMIN= 30;        //闹钟分钟
        ALASEC= 0;        //闹钟秒
        ALASSEC = 0;        //闹钟1/128秒
}

/********************** 读取RTC时间信息 *****************************/
void        RTC_read(void)
{
        P_SW2|= 0x80;                //SFR enable
        year    = RTC_YEAR;                // RTC的年计数值
        month   = RTC_MONTH;        // RTC的月计数值
        day   = RTC_DAY;                // RTC的日计数值
        hour    = RTC_HOUR;                // RTC的时计数值
        minute= RTC_MIN;                // RTC的分计数值
        second= RTC_SEC;                // RTC的秒计数值
//        ssecond = RTC_SSEC;                // RTC的1/128秒计数值
}

//========================================================================
// 函数:u8        Timer0_Config(u32 reload)
// 描述: timer0初始化函数.
// 参数: reload: 重装值.
// 返回: 0: 初始化正确, 1: 重装值过大, 初始化错误.
// 版本: V1.0, 2018-3-5
//========================================================================
u8        Timer0_Config(u32 reload)        //t=0: reload值是主时钟周期数,t=1: reload值是时间(单位us)
{
        TR0 = 0;        //停止计数

        if(reload >= (65536UL * 12))        return 1;        //值过大, 返回错误
        if(reload < 65536UL)        AUXR |= 0x80;                //1T mode
        else
        {
                AUXR &= ~0x80;        //12T mode
                reload = reload / 12;
        }
        reload = 65536UL - reload;
        TH0 = (u8)(reload >> 8);
        TL0 = (u8)(reload);

        ET0 = 1;        //允许中断
        TMOD = (TMOD & ~0x03) | 0;        //工作模式, 0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装, 3: 16位自动重装, 不可屏蔽中断
        TR0 = 1;                        //开始运行
        return 0;
}

//========================================================================
// 函数: void timer0_int (void) interrupt TIMER0_VECTOR
// 描述:timer0中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2016-5-12
//========================================================================
void timer0_ISR (void) interrupt TIMER0_VECTOR
{
   B_20ms = 1;        //20ms时隙标志
}


//========================================================================
// 函数: AUXR_ISR(void) interrupt 13
// 描述: 扩展中断函数(中断号>=32的中断)
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2018-4-2
// 备注:
//========================================================================
u8        isr_index;
void        AUXR_ISR(void) interrupt 13
{
        u8        i;
        switch(isr_index)
        {
                case 32:                //0103H 波形发生器5 中断入口
                                                //用户中断处理代码
                break;

                case 33:                //010BH        波形发生器异常2 中断入口
                                                //用户中断处理代码
                break;

                case 34:                //0113H        波形发生器异常4 中断入口
                                                //用户中断处理代码
                break;

                case 35:                //011BH        触摸按键 中断入口
                                                //用户中断处理代码
                break;

                case 36:                //0123H        RTC 中断入口
                        i = RTCIF;
                        RTCIF = 0;                //中断标志, 0x80:闹钟中断, 0x40:日中断, 0x20:小时中断, 0x10:分钟中断, 0x08:秒中断, 0x04:1/2秒中断, 0x02:1/8秒中断, 0x01:1/32秒中断
                        if(i & 0x04)        //1/2秒中断
                        {
                                B_500mS = 1;
                                P33 = ~P33;        //输出2秒周期方波, 方便测试精度
                        }
                break;

                case 37:                //012BH        P0口中断入口
                                                //用户中断处理代码
                break;

                case 38:                //0133H        P1口中断入口
                                                //用户中断处理代码
                break;

                case 39:                //013BH        P2口中断入口
                                                //用户中断处理代码
                break;

                case 40:                //0143H        P3口中断入口
                                                //用户中断处理代码
                break;

                case 41:                //014BH        P4口中断入口
                                                //用户中断处理代码
                break;

                case 42:                //0153H        P5口中断入口
                                                //用户中断处理代码
                break;

                case 43:                //015BH        P6口中断入口
                                                //用户中断处理代码
                break;

                case 44:                //0163H        P7口中断入口
                                                //用户中断处理代码
                break;

                case 45:                //016BH        P8口中断入口
                                                //用户中断处理代码
                break;

                case 46:                //0173H        P9口中断入口
                                                //用户中断处理代码
                break;

                default:
                break;
        }
}

8051爱好者 发表于 2022-10-28 10:30:29

本帖最后由 国学芯用 于 2022-10-28 11:17 编辑

昨天看STC官方通知STC8H4K64TLCD-+A系列IO中断瑕疵已修改正确,支持所有的I/O中断,且支持4种中断模式:下降沿中断、上升沿中断、低电平中断、高电平中断。每组I/O口都有独立的中断入口地址,且每个I/O可独立设置中断模式。再次申请样品试一下

小李非刀 发表于 2022-10-28 15:35:20

太好了,以前版本的我用了不少,新版的马上使用。工业级带段码LCD驱动的MCU不容易找。

QIBAO 发表于 2022-10-28 16:00:16

我其实很喜欢段码LCD,因为省电!以前大部分单片机都不带段码LCD驱动,普通MCU就要加LCD驱动芯片,可是电流大啊!2年前买了200片STC的带LCD驱动的样片,我做了不少电压表、电流表、功率表、GPS时钟、BPC时钟等等,超级省电,我很喜欢的。给STC 顶一个!

国学芯用 发表于 2022-11-3 16:33:24

QIBAO 发表于 2022-10-28 16:00
我其实很喜欢段码LCD,因为省电!以前大部分单片机都不带段码LCD驱动,普通MCU就要加LCD驱动芯片,可是电流 ...
(引用自4楼)

工业级MCU带段码ICD驱动的MCU不好找的,STC8H4K64TLCD-45MHz-LQFP64目前真的是性价比之王了

huy666 发表于 2022-11-3 22:41:23

QIBAO 发表于 2022-10-28 16:00
我其实很喜欢段码LCD,因为省电!以前大部分单片机都不带段码LCD驱动,普通MCU就要加LCD驱动芯片,可是电流 ...
(引用自4楼)

电压表,电流表出售吗?有商品链接吗?
页: [1]
查看完整版本: STC8H4K64TLCD-45MHz-LQFP64,硬件LCD段码驱动显示-硬件实时时钟演示