STC8H4K64TLCD-45MHz-LQFP64,硬件LCD段码驱动显示程序,硬件实时时钟演示程序
单片机源程序如下:
- /*********************************************************/
- #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
- ******************************************/
- /************* 本地常量声明 **************/
- #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);
- }
- }
- }
- /********************* 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[7] = {0x00,0x0C,0x30,0xC0,0x03,0x0C};
- u8 code T_LCD_mask7[7] = {0x00,0x04,0x10,0x40,0x01,0x04};
- u8 code T_SEG_ABC[7] = {0x00,0x08,0x20,0x80,0x02,0x08};
- u8 code T_SEG_DEFG[7] = {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[dat];
- k = ~T_LCD_mask[n];
- if(n <= 3) //1~3
- {
- LCD_buff[0] &= ~T_LCD_mask7[n];
- LCD_buff[2] &= k;
- LCD_buff[4] &= k;
- LCD_buff[6] &= k;
- i = T_SEG_ABC[n];
- k = T_SEG_DEFG[n];
- if(dat & 0x01) LCD_buff[6] |= i; //T_SEG_ABC[n]; //A
- if(dat & 0x02) LCD_buff[4] |= i; //T_SEG_ABC[n]; //B
- if(dat & 0x04) LCD_buff[2] |= i; //T_SEG_ABC[n]; //C
- if(dat & 0x08) LCD_buff[0] |= k; //T_SEG_DEFG[n]; //D
- if(dat & 0x10) LCD_buff[2] |= k; //T_SEG_DEFG[n]; //E
- if(dat & 0x20) LCD_buff[6] |= k; //T_SEG_DEFG[n]; //F
- if(dat & 0x40) LCD_buff[4] |= k; //T_SEG_DEFG[n]; //G
- }
- else // n=4 or 5
- {
- LCD_buff[1] &= ~T_LCD_mask7[n];
- LCD_buff[3] &= k;
- LCD_buff[5] &= k;
- LCD_buff[7] &= k;
- i = T_SEG_ABC[n];
- k = T_SEG_DEFG[n];
- if(dat & 0x01) LCD_buff[7] |= i; //T_SEG_ABC[n]; //A
- if(dat & 0x02) LCD_buff[5] |= i; //T_SEG_ABC[n]; //B
- if(dat & 0x04) LCD_buff[3] |= i; //T_SEG_ABC[n]; //C
- if(dat & 0x08) LCD_buff[1] |= k; //T_SEG_DEFG[n]; //D
- if(dat & 0x10) LCD_buff[3] |= k; //T_SEG_DEFG[n]; //E
- if(dat & 0x20) LCD_buff[7] |= k; //T_SEG_DEFG[n]; //F
- if(dat & 0x40) LCD_buff[5] |= k; //T_SEG_DEFG[n]; //G
- }
- }
- /********************** 将显示内容导入显存 *****************************/
- void LoadToLcd(void)
- {
- C0SEGV1 = LCD_buff[0]; // C0SEG 15~8数据寄存器
- C0SEGV2 = LCD_buff[1]; // C0SEG 23~16数据寄存器
- C1SEGV1 = LCD_buff[2]; // C1SEG 15~8数据寄存器
- C1SEGV2 = LCD_buff[3]; // C1SEG 23~16数据寄存器
- C2SEGV1 = LCD_buff[4]; // C2SEG 15~8数据寄存器
- C2SEGV2 = LCD_buff[5]; // C2SEG 23~16数据寄存器
- C3SEGV1 = LCD_buff[6]; // C3SEG 15~8数据寄存器
- C3SEGV2 = LCD_buff[7]; // 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[19:16], 一共20bit.
- COMLENM = 0; // COM时间长度设置 中字节COMLEN[15:8] LCD刷新率 = LCD时钟频率 / ((DBLEN[2:0]+COMLEN[19:0]+1) *2 * COM数)
- COMLENL = 65; // COM时间长度设置 低字节COMLEN[7:0] LCD刷新率 = 32768/((2+65+1)*2*4) = 60Hz
- BLINKRATE = 60; // 闪烁率配置寄存器, LCD闪烁率 = LCD刷新率 / BLINKRATE[7:0] 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[i] = 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;
- }
- }
复制代码 Keil代码下载:
STC8H4K64TLCD-LCD-RTC-Demo-20220810.zip
(131.77 KB, 下载次数: 24)
|