當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 嵌入式云IOT技術(shù)圈
[導(dǎo)讀]本節(jié)小項(xiàng)目,意在“人機(jī)界面”與“過(guò)程控制”如何關(guān)聯(lián)的練習(xí)。


微信公眾號(hào):嵌入式開(kāi)發(fā)圈
關(guān)注可了解更多的教程。問(wèn)題或建議,請(qǐng)公眾號(hào)留言;
如果你覺(jué)得本文對(duì)你有幫助,歡迎贊賞

本節(jié)小項(xiàng)目,意在“人機(jī)界面”與“過(guò)程控制”如何關(guān)聯(lián)的練習(xí)。
? ?? ? 程序功能如下:
? ?? ?(1)數(shù)碼管顯示的格式是“S.D.CC”。其中S是代表3檔速度,能顯示的數(shù)字范圍是“1、2、3”,分別代表“慢、中、快”3檔速度。D代表方向,往右跑顯示符號(hào)“r”(right的首字母),往左跑顯示符號(hào)“L”(Left的首字母)。CC代表計(jì)數(shù)器,跑馬燈每跑完一次,計(jì)數(shù)器自動(dòng)加1,范圍是0到99。
? ?? ?(2)【速度】按鍵K1。每按一次【速度】按鍵K1,速度檔位顯示的數(shù)字在“1、2、3”之間切換。
? ?? ?(3)【方向】按鍵K2。跑馬燈上電后默認(rèn)處于“往右跑”的方向,默認(rèn)顯示字符“r”。每按一次【方向】按鍵K2,跑馬燈就在“往右跑”與“往左跑”兩個(gè)方向之間切換,顯示的字符在“r、L”之間切換。
? ?? ?(4)【啟動(dòng)暫?!堪存IK3。上電后,按下【啟動(dòng)暫?!堪存IK3啟動(dòng)之后,跑馬燈處于“啟動(dòng)”狀態(tài),4個(gè)LED燈挨個(gè)依次循環(huán)的變亮,給人“跑”起來(lái)的感覺(jué),此時(shí)再按一次【啟動(dòng)暫停】按鍵K3,則跑馬燈處于“暫停”狀態(tài),接著又按一次【啟動(dòng)暫?!堪存IK3,跑馬燈又變回“啟動(dòng)”狀態(tài)。因此,【啟動(dòng)暫?!堪存IK3是專門用來(lái)切換“啟動(dòng)”和“暫停”這兩種狀態(tài)。
? ?? ? 代碼如下:

 1#include "REG52.H"  2  3#define KEY_FILTER_TIME??25  4  5#define SCAN_TIME??1  6#define VOICE_TIME???50  7  8#define RUN_TIME_SLOW????500 //“慢”檔速度的時(shí)間參數(shù)  9#define RUN_TIME_MIDDLE??300 //“中”檔速度的時(shí)間參數(shù)  10#define RUN_TIME_FAST????100 //“快”檔速度的時(shí)間參數(shù)  11  12void T0_time();  13void SystemInitial(void) ;  14void Delay(unsigned long u32DelayTime) ;  15void PeripheralInitial(void) ;  16  17void KeyScan(void);  18void KeyTask(void);  19void RunTask(void); //跑馬燈的任務(wù)函數(shù)  20  21void VoiceScan(void);  22void DisplayScan(void);  23void DisplayTask(void);  24void Wd1(void); //窗口1。  25void BeepOpen(void);  26void BeepClose(void);  27  28sbit?KEY_INPUT1?=?P2?^ 2;  29sbit?KEY_INPUT2?=?P2?^ 1;  30sbit?KEY_INPUT3?=?P2?^ 0;  31  32sbit?P1_0?=?P1?^ 0;  33sbit?P1_1?=?P1?^ 1;  34sbit?P1_2?=?P1?^ 2;  35sbit?P1_3?=?P1?^ 3;  36  37sbit?P3_4?=?P3?^ 4;  38  39//4個(gè)跑馬燈的輸出口  40sbit?P1_4?=?P1?^ 4;  41sbit?P1_5?=?P1?^ 5;  42sbit?P1_6?=?P1?^ 6;  43sbit?P3_3?=?P3?^ 3;  44  45  46//數(shù)碼管轉(zhuǎn)換表  47code unsigned char Cu8DigTable[]?=  48{  49 0x3f, //0???????序號(hào)0  50 0x06, //1???????序號(hào)1  51 0x5b, //2???????序號(hào)2  52 0x4f, //3???????序號(hào)3  53 0x66, //4???????序號(hào)4  54 0x6d, //5???????序號(hào)5  55 0x7d, //6???????序號(hào)6  56 0x07, //7???????序號(hào)7  57 0x7f, //8???????序號(hào)8  58 0x6f, //9???????序號(hào)9  59 0x00, //不顯示??序號(hào)10  60 0x40, //橫杠-???序號(hào)11  61 0x38, //字符L???序號(hào)12  62 0x70, //字符r???序號(hào)13  63};  64  65volatile unsigned char vGu8ScanTimerFlag?= 0;  66volatile unsigned int vGu16ScanTimerCnt?= 0;  67  68volatile unsigned char vGu8BeepTimerFlag?= 0;  69volatile unsigned int vGu16BeepTimerCnt?= 0;  70  71unsigned char Gu8Wd?= 0; //窗口選擇變量。人機(jī)交互程序框架的支點(diǎn)。  72unsigned char Gu8WdUpdate?= 0; //整屏更新變量。  73  74unsigned char Gu8PartUpdate_1?= 0; //局部1的更新變量,  75unsigned char Gu8PartUpdate_2?= 0; //局部2的更新變量  76unsigned char Gu8PartUpdate_3?= 0; //局部3的更新變量,  77  78volatile unsigned char vGu8Display_Righ_4?= 0;  79volatile unsigned char vGu8Display_Righ_3?= 0;  80volatile unsigned char vGu8Display_Righ_2?= 0;  81volatile unsigned char vGu8Display_Righ_1?= 0;  82  83volatile unsigned char vGu8Display_Righ_Dot_4?= 1; //需要顯示的小數(shù)點(diǎn)  84volatile unsigned char vGu8Display_Righ_Dot_3?= 1; //需要顯示的小數(shù)點(diǎn)  85volatile unsigned char vGu8Display_Righ_Dot_2?= 0;  86volatile unsigned char vGu8Display_Righ_Dot_1?= 0;  87  88volatile unsigned char vGu8KeySec?= 0;  89  90unsigned char Gu8RunCounter?= 0; //計(jì)數(shù)器,范圍是0到99  91  92unsigned char Gu8RunStep?= 0; //運(yùn)行的步驟  93unsigned char Gu8RunStart?= 0; //控制跑馬燈啟動(dòng)的總開(kāi)關(guān)  94  95unsigned char Gu8RunStatus?= 0; //標(biāo)識(shí)跑馬燈當(dāng)前的狀態(tài)。0代表停止,1代表啟動(dòng),2代表暫停。  96unsigned char Gu8RunDirection?= 0; //標(biāo)識(shí)跑馬燈當(dāng)前的方向。0代表往右跑,1代表往左跑。  97unsigned char Gu8RunSpeed?= 1; //當(dāng)前的速度檔位。1代表“慢”,2代表“中”,3代表“快”。  98unsigned int Gu16RunSpeedTimeDate?= 0; //承接各速度檔位的時(shí)間參數(shù)的變量  99 100volatile unsigned char vGu8RunTimerFlag?= 0; //用于控制跑馬燈跑動(dòng)速度的定時(shí)器 101volatile unsigned int vGu16RunTimerCnt?= 0; 102 103void main() 104{ 105 SystemInitial(); 106 Delay(10000); 107 PeripheralInitial(); 108 109 while(1) 110 { 111 KeyTask(); //按鍵的任務(wù)函數(shù) 112 DisplayTask(); //數(shù)碼管顯示的上層任務(wù)函數(shù) 113 RunTask(); //跑馬燈的任務(wù)函數(shù) 114 } 115} 116 117void RunTask(void) //跑馬燈的任務(wù)函數(shù),放在主函數(shù)內(nèi) 118{ 119 if(0 ==?Gu8RunStart) //如果是停止的狀態(tài) 120 { 121 return; //如果是停止的狀態(tài),退出當(dāng)前函數(shù),不掃描余下代碼。 122 } 123 124 switch(Gu8RunStep) //屢見(jiàn)屢愛(ài)的switch又來(lái)了 125 { 126 case 0: 127 vGu8RunTimerFlag?= 0; 128 vGu16RunTimerCnt?= 0; //定時(shí)器清零 129 Gu8RunStep?= 1; //切換到下一步,啟動(dòng) 130 131 break; 132 133 case 1: 134 if(1 ==?Gu8RunStatus?&& 0 ==?vGu16RunTimerCnt) //當(dāng)前處于“啟動(dòng)”狀態(tài),并且定時(shí)器等于0 135 { 136 P1_4?= 0; //第1個(gè)燈亮 137 P1_5?= 1; //第2個(gè)燈滅 138 P1_6?= 1; //第3個(gè)燈滅 139 P3_3?= 1; //第4個(gè)燈滅 140 141 vGu8RunTimerFlag?= 0; 142 vGu16RunTimerCnt?=?Gu16RunSpeedTimeDate; //速度時(shí)間參數(shù)變量的大小,決定了速度 143 vGu8RunTimerFlag?= 1; //啟動(dòng)定時(shí)器 144 145//靈活切換“步驟變量” 146 if(0 ==?Gu8RunDirection) //往右跑 147 { 148 Gu8RunStep?= 2; 149 } 150 else //往左跑 151 { 152 if(Gu8RunCounter?< 99) 153 { 154 Gu8RunCounter++; //往左邊跑完一次,運(yùn)行的計(jì)數(shù)器自加1 155 } 156 157 Gu8PartUpdate_3?= 1; //局部3的更新變量,更新顯示計(jì)數(shù)器 158 159 Gu8RunStep?= 4; 160 } 161 162 } 163 164 break; 165 166 case 2: 167 if(1 ==?Gu8RunStatus?&& 0 ==?vGu16RunTimerCnt) //當(dāng)前處于“啟動(dòng)”狀態(tài),并且定時(shí)器等于0 168 { 169 P1_4?= 1; //第1個(gè)燈滅 170 P1_5?= 0; //第2個(gè)燈亮 171 P1_6?= 1; //第3個(gè)燈滅 172 P3_3?= 1; //第4個(gè)燈滅 173 174 vGu8RunTimerFlag?= 0; 175 vGu16RunTimerCnt?=?Gu16RunSpeedTimeDate; //速度時(shí)間參數(shù)變量的大小,決定了速度 176 vGu8RunTimerFlag?= 1; //啟動(dòng)定時(shí)器 177 178//靈活切換“步驟變量” 179 if(0 ==?Gu8RunDirection) //往右跑 180 { 181 Gu8RunStep?= 3; 182 } 183 else //往左跑 184 { 185 Gu8RunStep?= 1; 186 } 187 } 188 189 break; 190 191 case 3: 192 if(1 ==?Gu8RunStatus?&& 0 ==?vGu16RunTimerCnt) //當(dāng)前處于“啟動(dòng)”狀態(tài),并且定時(shí)器等于0 193 { 194 P1_4?= 1; //第1個(gè)燈滅 195 P1_5?= 1; //第2個(gè)燈滅 196 P1_6?= 0; //第3個(gè)燈亮 197 P3_3?= 1; //第4個(gè)燈滅 198 199 vGu8RunTimerFlag?= 0; 200 vGu16RunTimerCnt?=?Gu16RunSpeedTimeDate; //速度時(shí)間參數(shù)變量的大小,決定了速度 201 vGu8RunTimerFlag?= 1; //啟動(dòng)定時(shí)器 202 203//靈活切換“步驟變量” 204 if(0 ==?Gu8RunDirection) //往右跑 205 { 206 Gu8RunStep?= 4; 207 } 208 else //往左跑 209 { 210 Gu8RunStep?= 2; 211 } 212 } 213 214 break; 215 216 case 4: 217 if(1 ==?Gu8RunStatus?&& 0 ==?vGu16RunTimerCnt) //當(dāng)前處于“啟動(dòng)”狀態(tài),并且定時(shí)器等于0 218 { 219 P1_4?= 1; //第1個(gè)燈滅 220 P1_5?= 1; //第2個(gè)燈滅 221 P1_6?= 1; //第3個(gè)燈滅 222 P3_3?= 0; //第4個(gè)燈亮 223 224 vGu8RunTimerFlag?= 0; 225 vGu16RunTimerCnt?=?Gu16RunSpeedTimeDate; //速度時(shí)間參數(shù)變量的大小,決定了速度 226 vGu8RunTimerFlag?= 1; //啟動(dòng)定時(shí)器 227 228//靈活切換“步驟變量” 229 if(0 ==?Gu8RunDirection) //往右跑 230 { 231 if(Gu8RunCounter?< 99) 232 { 233 Gu8RunCounter++; //往右邊跑完一次,運(yùn)行的計(jì)數(shù)器自加1 234 } 235 236 Gu8PartUpdate_3?= 1; //局部3的更新變量,更新顯示計(jì)數(shù)器 237 238 Gu8RunStep?= 1; 239 } 240 else //往左跑 241 { 242 Gu8RunStep?= 3; 243 } 244 } 245 246 break; 247 248 } 249 250} 251 252void KeyTask(void) //按鍵的任務(wù)函數(shù) 253{ 254 if(0 ==?vGu8KeySec) 255 { 256 return; 257 } 258 259 switch(vGu8KeySec) 260 { 261 case 1: //【速度】按鍵K1 262 switch(Gu8Wd) //在某個(gè)窗口下 263 { 264 case 1: //窗口1。 265 266 //每按一次K1按鍵,Gu8RunSpeed就在1、2、3三者之間切換, 267//并且根據(jù)Gu8RunSpeed的數(shù)值,對(duì)Gu16RunSpeedTimeDate賦值 268//不同的速度時(shí)間參數(shù),從而控制速度檔位。 269 270 if(1 ==?Gu8RunSpeed) 271 { 272 Gu8RunSpeed?= 2; //“中”檔 273 Gu16RunSpeedTimeDate?=?RUN_TIME_MIDDLE; //賦值“中”檔的時(shí)間參數(shù) 274 } 275 else if(2 ==?Gu8RunSpeed) 276 { 277 Gu8RunSpeed?= 3; //“快”檔 278 Gu16RunSpeedTimeDate?=?RUN_TIME_FAST; //賦值“快”檔的時(shí)間參數(shù) 279 } 280 else 281 { 282 Gu8RunSpeed?= 1; //“慢”檔 283 Gu16RunSpeedTimeDate?=?RUN_TIME_SLOW; //賦值“慢”檔的時(shí)間參數(shù) 284 } 285 286 Gu8PartUpdate_1?= 1; //局部1的更新變量,更新顯示“速度” 287 288 vGu8BeepTimerFlag?= 0; 289 vGu16BeepTimerCnt?=?VOICE_TIME; //蜂鳴器發(fā)出“滴”一聲 290 vGu8BeepTimerFlag?= 1; 291 break; 292 } 293 294 vGu8KeySec?= 0; 295 break; 296 297 case 2: //【方向】按鍵K2 298 299 switch(Gu8Wd) //在某個(gè)窗口下 300 { 301 case 1: //窗口1。 302 303 //每按一次K2按鍵,Gu8RunDirection就在0和1之間切換,從而控制方向 304 if(0 ==?Gu8RunDirection) 305 { 306 Gu8RunDirection?= 1; 307 } 308 else 309 { 310 Gu8RunDirection?= 0; 311 } 312 313 Gu8PartUpdate_2?= 1; //局部2更新顯示,更新顯示“方向” 314 315 vGu8BeepTimerFlag?= 0; 316 vGu16BeepTimerCnt?=?VOICE_TIME; //蜂鳴器發(fā)出“滴”一聲 317 vGu8BeepTimerFlag?= 1; 318 break; 319 } 320 321 vGu8KeySec?= 0; 322 break; 323 324 case 3: //【啟動(dòng)暫?!堪存IK3 325 switch(Gu8Wd) //在某個(gè)窗口下 326 { 327 case 1: //窗口1。 328 if(0 ==?Gu8RunStatus) //當(dāng)跑馬燈處于“停止”狀態(tài)時(shí) 329 { 330 Gu8RunStep?= 0; //運(yùn)行步驟從0開(kāi)始 331 Gu8RunStart?= 1; //總開(kāi)關(guān)“打開(kāi)”。 332 Gu8RunStatus?= 1; //狀態(tài)切換到“啟動(dòng)”狀態(tài) 333 } 334 else if(1 ==?Gu8RunStatus) //當(dāng)跑馬燈處于“啟動(dòng)”狀態(tài)時(shí) 335 { 336 Gu8RunStatus?= 2; //狀態(tài)切換到“暫?!睜顟B(tài) 337 } 338 else //當(dāng)跑馬燈處于“暫?!睜顟B(tài)時(shí) 339 { 340 Gu8RunStatus?= 1; //狀態(tài)切換到“啟動(dòng)”狀態(tài) 341 } 342 343 vGu8BeepTimerFlag?= 0; 344 vGu16BeepTimerCnt?=?VOICE_TIME; //蜂鳴器發(fā)出“滴”一聲 345 vGu8BeepTimerFlag?= 1; 346 break; 347 } 348 349 vGu8KeySec?= 0; 350 break; 351 } 352} 353 354void DisplayTask(void) //數(shù)碼管顯示的上層任務(wù)函數(shù) 355{ 356 switch(Gu8Wd) //以窗口選擇Gu8Wd為支點(diǎn),去執(zhí)行對(duì)應(yīng)的窗口顯示函數(shù)。又一次用到switch語(yǔ)句 357 { 358 case 1: 359 Wd1(); //窗口1。 360 break; 361 } 362} 363 364void Wd1(void) //窗口1。 365{ 366//需要借用的中間變量,用來(lái)拆分?jǐn)?shù)據(jù)位。 367 static unsigned char Su8Temp_4,?Su8Temp_3,?Su8Temp_2,?Su8Temp_1; //需要借用的中間變量 368 369 if(1 ==?Gu8WdUpdate) //如果需要整屏更新 370 { 371 Gu8WdUpdate?= 0; //及時(shí)清零,只更新一次顯示即可,避免一直進(jìn)來(lái)更新顯示 372 373//屬于靜態(tài)數(shù)據(jù),起“裝飾”作用,切換窗口后只掃描一次的代碼。 374 vGu8Display_Righ_Dot_4?= 1; //顯示小數(shù)點(diǎn) 375 vGu8Display_Righ_Dot_3?= 1; //顯示小數(shù)點(diǎn) 376 vGu8Display_Righ_Dot_2?= 0; 377 vGu8Display_Righ_Dot_1?= 0; 378 379 Gu8PartUpdate_1?= 1; //局部1更新顯示 380 Gu8PartUpdate_2?= 1; //局部2更新顯示 381 Gu8PartUpdate_3?= 1; //局部3更新顯示 382 } 383 384 if(1 ==?Gu8PartUpdate_1) //局部1更新顯示,速度 385 { 386 Gu8PartUpdate_1?= 0; //及時(shí)清零,只更新一次顯示即可,避免一直進(jìn)來(lái)更新顯示 387 388 Su8Temp_4?=?Gu8RunSpeed; 389 390 vGu8Display_Righ_4?=?Su8Temp_4; //過(guò)渡需要顯示的數(shù)據(jù)到底層驅(qū)動(dòng)變量 391 } 392 393 if(1 ==?Gu8PartUpdate_2) //局部2更新顯示,方向 394 { 395 Gu8PartUpdate_2?= 0; //及時(shí)清零,只更新一次顯示即可,避免一直進(jìn)來(lái)更新顯示 396 397 if(0 ==?Gu8RunDirection) //往右跑 398 { 399 Su8Temp_3?= 13; //數(shù)碼管的字模轉(zhuǎn)換表序號(hào)13代表顯示字符“r” 400 } 401 else 402 { 403 Su8Temp_3?= 12; //數(shù)碼管的字模轉(zhuǎn)換表序號(hào)12代表顯示字符“L” 404 } 405 406 vGu8Display_Righ_3?=?Su8Temp_3; //過(guò)渡需要顯示的數(shù)據(jù)到底層驅(qū)動(dòng)變量 407 } 408 409 if(1 ==?Gu8PartUpdate_3) //局部3更新顯示,計(jì)數(shù)器 410 { 411 Gu8PartUpdate_3?= 0; //及時(shí)清零,只更新一次顯示即可,避免一直進(jìn)來(lái)更新顯示 412 413 Su8Temp_2?=?Gu8RunCounter?% 100 / 10; //提取十位 414 Su8Temp_1?=?Gu8RunCounter?% 10 / 1; //提取個(gè)位 415 416 vGu8Display_Righ_2?=?Su8Temp_2; //過(guò)渡需要顯示的數(shù)據(jù)到底層驅(qū)動(dòng)變量 417 vGu8Display_Righ_1?=?Su8Temp_1; //過(guò)渡需要顯示的數(shù)據(jù)到底層驅(qū)動(dòng)變量 418 } 419 420} 421 422 423void KeyScan(void) //按鍵底層的驅(qū)動(dòng)掃描函數(shù),放在定時(shí)中斷函數(shù)里 424{ 425 static unsigned char Su8KeyLock1; 426 static unsigned int Su16KeyCnt1; 427 static unsigned char Su8KeyLock2; 428 static unsigned int Su16KeyCnt2; 429 static unsigned char Su8KeyLock3; 430 static unsigned int Su16KeyCnt3; 431 432 433 if(0 !=?KEY_INPUT1) 434 { 435 Su8KeyLock1?= 0; 436 Su16KeyCnt1?= 0; 437 } 438 else if(0 ==?Su8KeyLock1) 439 { 440 Su16KeyCnt1++; 441 442 if(Su16KeyCnt1?>=?KEY_FILTER_TIME) 443 { 444 Su8KeyLock1?= 1; 445 vGu8KeySec?= 1; 446 } 447 } 448 449 if(0 !=?KEY_INPUT2) 450 { 451 Su8KeyLock2?= 0; 452 Su16KeyCnt2?= 0; 453 } 454 else if(0 ==?Su8KeyLock2) 455 { 456 Su16KeyCnt2++; 457 458 if(Su16KeyCnt2?>=?KEY_FILTER_TIME) 459 { 460 Su8KeyLock2?= 1; 461 vGu8KeySec?= 2; 462 } 463 } 464 465 if(0 !=?KEY_INPUT3) 466 { 467 Su8KeyLock3?= 0; 468 Su16KeyCnt3?= 0; 469 } 470 else if(0 ==?Su8KeyLock3) 471 { 472 Su16KeyCnt3++; 473 474 if(Su16KeyCnt3?>=?KEY_FILTER_TIME) 475 { 476 Su8KeyLock3?= 1; 477 vGu8KeySec?= 3; 478 } 479 } 480 481} 482 483void DisplayScan(void) //數(shù)碼管底層的驅(qū)動(dòng)掃描函數(shù),放在定時(shí)中斷函數(shù)里 484{ 485 static unsigned char Su8GetCode; 486 static unsigned char Su8ScanStep?= 1; 487 488 if(0 ==?vGu16ScanTimerCnt) 489 { 490 491 492 P0?= 0x00; 493 P1_0?= 1; 494 P1_1?= 1; 495 P1_2?= 1; 496 P1_3?= 1; 497 498 switch(Su8ScanStep) 499 { 500 case 1: 501 Su8GetCode?=?Cu8DigTable[vGu8Display_Righ_1]; 502 503 if(1 ==?vGu8Display_Righ_Dot_1) 504 { 505 Su8GetCode?=?Su8GetCode?| 0x80; 506 } 507 508 P0?=?Su8GetCode; 509 P1_0?= 0; 510 P1_1?= 1; 511 P1_2?= 1; 512 P1_3?= 1; 513 break; 514 515 case 2: 516 Su8GetCode?=?Cu8DigTable[vGu8Display_Righ_2]; 517 518 if(1 ==?vGu8Display_Righ_Dot_2) 519 { 520 Su8GetCode?=?Su8GetCode?| 0x80; 521 } 522 523 P0?=?Su8GetCode; 524 P1_0?= 1; 525 P1_1?= 0; 526 P1_2?= 1; 527 P1_3?= 1; 528 break; 529 530 case 3: 531 Su8GetCode?=?Cu8DigTable[vGu8Display_Righ_3]; 532 533 if(1 ==?vGu8Display_Righ_Dot_3) 534 { 535 Su8GetCode?=?Su8GetCode?| 0x80; 536 } 537 538 P0?=?Su8GetCode; 539 P1_0?= 1; 540 P1_1?= 1; 541 P1_2?= 0; 542 P1_3?= 1; 543 break; 544 545 case 4: 546 Su8GetCode?=?Cu8DigTable[vGu8Display_Righ_4]; 547 548 if(1 ==?vGu8Display_Righ_Dot_4) 549 { 550 Su8GetCode?=?Su8GetCode?| 0x80; 551 } 552 553 P0?=?Su8GetCode; 554 P1_0?= 1; 555 P1_1?= 1; 556 P1_2?= 1; 557 P1_3?= 0; 558 break; 559 560 } 561 562 Su8ScanStep++; 563 564 if(Su8ScanStep?> 4) 565 { 566 Su8ScanStep?= 1; 567 } 568 569 vGu8ScanTimerFlag?= 0; 570 vGu16ScanTimerCnt?=?SCAN_TIME; 571 vGu8ScanTimerFlag?= 1; 572 } 573} 574 575void VoiceScan(void) //蜂鳴器的驅(qū)動(dòng)函數(shù) 576{ 577 578 static unsigned char Su8Lock?= 0; 579 580 if(1 ==?vGu8BeepTimerFlag?&&?vGu16BeepTimerCnt?> 0) 581 { 582 if(0 ==?Su8Lock) 583 { 584 Su8Lock?= 1; 585 BeepOpen(); 586 } 587 else 588 { 589 590 vGu16BeepTimerCnt--; 591 592 if(0 ==?vGu16BeepTimerCnt) 593 { 594 Su8Lock?= 0; 595 BeepClose(); 596 } 597 598 } 599 } 600} 601 602void BeepOpen(void) 603{ 604 P3_4?= 0; 605} 606 607void BeepClose(void) 608{ 609 P3_4?= 1; 610} 611 612void T0_time() interrupt?1 613{ 614 VoiceScan(); //蜂鳴器的驅(qū)動(dòng)函數(shù) 615 KeyScan(); //按鍵底層的驅(qū)動(dòng)掃描函數(shù) 616 DisplayScan(); //數(shù)碼管底層的驅(qū)動(dòng)掃描函數(shù) 617 618 if(1 ==?vGu8ScanTimerFlag?&&?vGu16ScanTimerCnt?> 0) 619 { 620 vGu16ScanTimerCnt--; 621 } 622 623 if(1 ==?vGu8RunTimerFlag?&&?vGu16RunTimerCnt?> 0) //用于控制跑馬燈跑動(dòng)速度的定時(shí)器 624 { 625 vGu16RunTimerCnt--; 626 } 627 628 TH0?= 0xfd; //此參數(shù)可根據(jù)具體的時(shí)間來(lái)修改,盡量確保每定時(shí)中斷一次接近1ms 629 TL0?= 0x40; //此參數(shù)可根據(jù)具體的時(shí)間來(lái)修改,盡量確保每定時(shí)中斷一次接近1ms 630} 631 632void SystemInitial(void) 633{ 634 P0?= 0x00; 635 P1_0?= 1; 636 P1_1?= 1; 637 P1_2?= 1; 638 P1_3?= 1; 639 640 TMOD?= 0x01; 641 TH0?= 0xfd; //此參數(shù)可根據(jù)具體的時(shí)間來(lái)修改,盡量確保每定時(shí)中斷一次接近1ms 642 TL0?= 0x40; //此參數(shù)可根據(jù)具體的時(shí)間來(lái)修改,盡量確保每定時(shí)中斷一次接近1ms 643 EA?= 1; 644 ET0?= 1; 645 TR0?= 1; 646 647//上電初始化一些關(guān)鍵的數(shù)據(jù) 648 649 Gu8Wd?= 1; //窗口1。開(kāi)機(jī)默認(rèn)處于正常工作的窗口 650 Gu8WdUpdate?= 1; //整屏更新變量 651//跑馬燈處于初始化的狀態(tài) 652 P1_4?= 0; //第1個(gè)燈亮 653 P1_5?= 1; //第2個(gè)燈滅 654 P1_6?= 1; //第3個(gè)燈滅 655 P3_3?= 1; //第4個(gè)燈滅 656 657//根據(jù)當(dāng)前的速度檔位Gu8RunSpeed,來(lái)初始化速度時(shí)間參數(shù)Gu16RunSpeedTimeDate 658 if(1 ==?Gu8RunSpeed) 659 { 660 Gu16RunSpeedTimeDate?=?RUN_TIME_SLOW; //賦值“慢”檔的時(shí)間參數(shù) 661 } 662 else if(2 ==?Gu8RunSpeed) 663 { 664 Gu16RunSpeedTimeDate?=?RUN_TIME_MIDDLE; //賦值“中”檔的時(shí)間參數(shù) 665 } 666 else 667 { 668 Gu16RunSpeedTimeDate?=?RUN_TIME_FAST; //賦值“快”檔的時(shí)間參數(shù) 669 } 670 671} 672 673void Delay(unsigned long u32DelayTime) 674{ 675 for(;?u32DelayTime?> 0;?u32DelayTime--); 676} 677 678void PeripheralInitial(void) 679{ 680 681}


長(zhǎng)期商務(wù)合作服務(wù):



免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉