C51 COMPILER V9.59.0.0 APP_RTC 06/10/2021 10:21:37 PAGE 1 C51 COMPILER V9.59.0.0, COMPILATION OF MODULE APP_RTC OBJECT MODULE PLACED IN .\list\APP_RTC.obj COMPILER INVOKED BY: C:\Keil_v5\C51\BIN\C51.EXE ..\App\src\APP_RTC.c LARGE OMF2 OPTIMIZE(8,SPEED) BROWSE INCDIR(..\Drive -r\inc;..\User;..\App\inc) DEBUG PRINT(.\list\APP_RTC.lst) TABS(2) OBJECT(.\list\APP_RTC.obj) line level source 1 /*---------------------------------------------------------------------*/ 2 /* --- STC MCU Limited ------------------------------------------------*/ 3 /* --- STC 1T Series MCU Demo Programme -------------------------------*/ 4 /* --- Mobile: (86)13922805190 ----------------------------------------*/ 5 /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/ 6 /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/ 7 /* --- Web: www.STCMCU.com --------------------------------------------*/ 8 /* --- Web: www.STCMCUDATA.com ---------------------------------------*/ 9 /* --- QQ: 800003751 -------------------------------------------------*/ 10 /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */ 11 /*---------------------------------------------------------------------*/ 12 13 #include "APP.h" 14 #include "STC8A_GPIO.h" 15 #include "STC8A_I2C.h" 16 #include "STC8A_NVIC.h" 17 #include "STC8A_Switch.h" 18 19 /************* 功能说明 ************** 20 21 读写RTC, IC为PCF8563. 22 23 用STC的MCU的IO方式驱动8位数码管。 24 25 使用Timer0的16位自动重装来产生1ms节拍,程序运行于这个节拍下, 用户修改MCU主时钟频率时,自动定时于1ms. 26 27 8位数码管显示时间(小时-分钟-秒). 28 29 行列扫描按键键码为17~32. 30 31 按键只支持单键按下, 不支持多键同时按下, 那样将会有不可预知的结果. 32 33 键按下超过1秒后,将以10键/秒的速度提供重键输出. 用户只需要检测KeyCode是否非0来判断键是否按下. 34 35 调整时间键: 36 键码17: 小时+. 37 键码18: 小时-. 38 键码19: 分钟+. 39 键码20: 分钟-. 40 41 下载时, 选择时钟 24MHz (可以在配置文件"config.h"中修改). 42 43 ******************************************/ 44 45 //======================================================================== 46 // 本地常量声明 47 //======================================================================== 48 49 50 //======================================================================== 51 // 本地变量声明 52 //======================================================================== 53 54 C51 COMPILER V9.59.0.0 APP_RTC 06/10/2021 10:21:37 PAGE 2 55 //======================================================================== 56 // 本地函数声明 57 //======================================================================== 58 59 void IO_KeyScan(void); //50ms call 60 void DisplayRTC(void); 61 void ReadRTC(void); 62 void WriteRTC(void); 63 64 //======================================================================== 65 // 外部函数和变量声明 66 //======================================================================== 67 68 69 //======================================================================== 70 // 函数: RTC_init 71 // 描述: 用户初始化程序. 72 // 参数: None. 73 // 返回: None. 74 // 版本: V1.0, 2020-09-25 75 //======================================================================== 76 void RTC_init(void) 77 { 78 1 u8 i; 79 1 80 1 I2C_InitTypeDef I2C_InitStructure; 81 1 I2C_InitStructure.I2C_Mode = I2C_Mode_Master; //主从选择 I2C_Mode_Master, I2C_Mode_Slave 82 1 I2C_InitStructure.I2C_Enable = ENABLE; //I2C功能使能, ENABLE, DISABLE 83 1 I2C_InitStructure.I2C_MS_WDTA = DISABLE; //主机使能自动发送, ENABLE, DISABLE 84 1 I2C_InitStructure.I2C_Speed = 16; //总线速度=Fosc/2/(Speed*2+4), 0~63 85 1 I2C_Init(&I2C_InitStructure); 86 1 NVIC_I2C_Init(I2C_Mode_Master,DISABLE,Priority_0); //主从模式, I2C_Mode_Master, I2C_Mode_Slave; 中断使能 -, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3 87 1 88 1 P0_MODE_IO_PU(GPIO_Pin_All); //P0 设置为准双向口 89 1 P1_MODE_IO_PU(GPIO_Pin_4 | GPIO_Pin_5); //P1.4,P1.5 设置为准双向口 90 1 P6_MODE_IO_PU(GPIO_Pin_All); //P6 设置为准双向口 91 1 P7_MODE_IO_PU(GPIO_Pin_All); //P7 设置为准双向口 92 1 I2C_SW(I2C_P14_P15); //I2C_P14_P15,I2C_P24_P25,I2C_P33_P32 93 1 display_index = 0; 94 1 95 1 for(i=0; i<8; i++) LED8[i] = 0x10; //上电消隐 96 1 97 1 ReadRTC(); 98 1 F0 = 0; 99 1 if(second >= 60) F0 = 1; //错误 100 1 if(minute >= 60) F0 = 1; //错误 101 1 if(hour >= 24) F0 = 1; //错误 102 1 if(F0) //有错误, 默认12:00:00 103 1 { 104 2 second = 0; 105 2 minute = 0; 106 2 hour = 12; 107 2 WriteRTC(); 108 2 } 109 1 110 1 DisplayRTC(); 111 1 LED8[2] = DIS_; 112 1 LED8[5] = DIS_; 113 1 114 1 KeyHoldCnt = 0; //键按下计时 115 1 KeyCode = 0; //给用户使用的键码 C51 COMPILER V9.59.0.0 APP_RTC 06/10/2021 10:21:37 PAGE 3 116 1 117 1 IO_KeyState = 0; 118 1 IO_KeyState1 = 0; 119 1 IO_KeyHoldCnt = 0; 120 1 cnt50ms = 0; 121 1 } 122 123 //======================================================================== 124 // 函数: Sample_RTC 125 // 描述: 用户应用程序. 126 // 参数: None. 127 // 返回: None. 128 // 版本: V1.0, 2020-09-25 129 //======================================================================== 130 void Sample_RTC(void) 131 { 132 1 DisplayScan(); 133 1 134 1 if(++msecond >= 1000) //1秒到 135 1 { 136 2 msecond = 0; 137 2 ReadRTC(); 138 2 DisplayRTC(); 139 2 } 140 1 141 1 if(++cnt50ms >= 50) //50ms扫描一次行列键盘 142 1 { 143 2 cnt50ms = 0; 144 2 IO_KeyScan(); 145 2 } 146 1 147 1 if(KeyCode != 0) //有键按下 148 1 { 149 2 if(KeyCode == 17) //hour +1 150 2 { 151 3 if(++hour >= 24) hour = 0; 152 3 WriteRTC(); 153 3 DisplayRTC(); 154 3 } 155 2 if(KeyCode == 18) //hour -1 156 2 { 157 3 if(--hour >= 24) hour = 23; 158 3 WriteRTC(); 159 3 DisplayRTC(); 160 3 } 161 2 if(KeyCode == 19) //minute +1 162 2 { 163 3 second = 0; 164 3 if(++minute >= 60) minute = 0; 165 3 WriteRTC(); 166 3 DisplayRTC(); 167 3 } 168 2 if(KeyCode == 20) //minute -1 169 2 { 170 3 second = 0; 171 3 if(--minute >= 60) minute = 59; 172 3 WriteRTC(); 173 3 DisplayRTC(); 174 3 } 175 2 176 2 KeyCode = 0; 177 2 } C51 COMPILER V9.59.0.0 APP_RTC 06/10/2021 10:21:37 PAGE 4 178 1 } 179 180 //======================================================================== 181 // 函数: DisplayRTC 182 // 描述: 显示时钟函数. 183 // 参数: None. 184 // 返回: None. 185 // 版本: V1.0, 2020-09-25 186 //======================================================================== 187 void DisplayRTC(void) 188 { 189 1 if(hour >= 10) LED8[0] = hour / 10; 190 1 else LED8[0] = DIS_BLACK; 191 1 LED8[1] = hour % 10; 192 1 LED8[2] = DIS_; 193 1 LED8[3] = minute / 10; 194 1 LED8[4] = minute % 10; 195 1 LED8[6] = second / 10; 196 1 LED8[7] = second % 10; 197 1 } 198 199 //======================================================================== 200 // 函数: ReadRTC 201 // 描述: 读RTC函数. 202 // 参数: None. 203 // 返回: None. 204 // 版本: V1.0, 2020-09-25 205 //======================================================================== 206 void ReadRTC(void) 207 { 208 1 u8 tmp[3]; 209 1 210 1 I2C_ReadNbyte(2, tmp, 3); 211 1 second = ((tmp[0] >> 4) & 0x07) * 10 + (tmp[0] & 0x0f); 212 1 minute = ((tmp[1] >> 4) & 0x07) * 10 + (tmp[1] & 0x0f); 213 1 hour = ((tmp[2] >> 4) & 0x03) * 10 + (tmp[2] & 0x0f); 214 1 } 215 216 //======================================================================== 217 // 函数: WriteRTC 218 // 描述: 写RTC函数. 219 // 参数: None. 220 // 返回: None. 221 // 版本: V1.0, 2020-09-25 222 //======================================================================== 223 void WriteRTC(void) 224 { 225 1 u8 tmp[3]; 226 1 227 1 tmp[0] = ((second / 10) << 4) + (second % 10); 228 1 tmp[1] = ((minute / 10) << 4) + (minute % 10); 229 1 tmp[2] = ((hour / 10) << 4) + (hour % 10); 230 1 I2C_WriteNbyte(2, tmp, 3); 231 1 } 232 233 234 /***************************************************** 235 行列键扫描程序 236 使用XY查找4x4键的方法,只能单键,速度快 237 238 Y P04 P05 P06 P07 239 | | | | C51 COMPILER V9.59.0.0 APP_RTC 06/10/2021 10:21:37 PAGE 5 240 X | | | | 241 P00 ---- K00 ---- K01 ---- K02 ---- K03 ---- 242 | | | | 243 P01 ---- K04 ---- K05 ---- K06 ---- K07 ---- 244 | | | | 245 P02 ---- K08 ---- K09 ---- K10 ---- K11 ---- 246 | | | | 247 P03 ---- K12 ---- K13 ---- K14 ---- K15 ---- 248 | | | | 249 ******************************************************/ 250 251 252 //======================================================================== 253 // 函数: IO_KeyDelay 254 // 描述: 按键扫描延迟程序. 255 // 参数: None. 256 // 返回: None. 257 // 版本: V1.0, 2020-09-25 258 //======================================================================== 259 void IO_KeyDelay(void) 260 { 261 1 u8 i; 262 1 i = 60; 263 1 while(--i) ; 264 1 } 265 266 //======================================================================== 267 // 函数: IO_KeyScan 268 // 描述: 按键扫描程序. 269 // 参数: None. 270 // 返回: None. 271 // 版本: V1.0, 2020-09-25 272 //======================================================================== 273 void IO_KeyScan(void) //50ms call 274 { 275 1 u8 j; 276 1 277 1 j = IO_KeyState1; //保存上一次状态 278 1 279 1 P0 = 0xf0; //X低,读Y 280 1 IO_KeyDelay(); 281 1 IO_KeyState1 = P0 & 0xf0; 282 1 283 1 P0 = 0x0f; //Y低,读X 284 1 IO_KeyDelay(); 285 1 IO_KeyState1 |= (P0 & 0x0f); 286 1 IO_KeyState1 ^= 0xff; //取反 287 1 288 1 if(j == IO_KeyState1) //连续两次读相等 289 1 { 290 2 j = IO_KeyState; 291 2 IO_KeyState = IO_KeyState1; 292 2 if(IO_KeyState != 0) //有键按下 293 2 { 294 3 F0 = 0; 295 3 if(j == 0) F0 = 1; //第一次按下 296 3 else if(j == IO_KeyState) 297 3 { 298 4 if(++IO_KeyHoldCnt >= 20) //1秒后重键 299 4 { 300 5 IO_KeyHoldCnt = 18; 301 5 F0 = 1; C51 COMPILER V9.59.0.0 APP_RTC 06/10/2021 10:21:37 PAGE 6 302 5 } 303 4 } 304 3 if(F0) 305 3 { 306 4 j = T_KeyTable[IO_KeyState >> 4]; 307 4 if((j != 0) && (T_KeyTable[IO_KeyState& 0x0f] != 0)) 308 4 KeyCode = (j - 1) * 4 + T_KeyTable[IO_KeyState & 0x0f] + 16; //计算键码,17~32 309 4 } 310 3 } 311 2 else IO_KeyHoldCnt = 0; 312 2 } 313 1 P0 = 0xff; 314 1 } MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 822 ---- CONSTANT SIZE = ---- ---- XDATA SIZE = ---- 12 PDATA SIZE = ---- ---- DATA SIZE = ---- ---- IDATA SIZE = ---- ---- BIT SIZE = ---- ---- EDATA SIZE = ---- ---- HDATA SIZE = ---- ---- XDATA CONST SIZE = ---- ---- FAR CONST SIZE = ---- ---- END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)