|
還是上次那個程序小改而成!還同時參考了作者的書
說實話,要是自己編的話還不如作者自己的程序好
自己只是在作者的基礎上進行小修小補,但個人覺得這是程序積累的好方法,從不知從何入手到有點頭緒
還參考了一些程序架構的思想,還是不錯,個人很有成就感!
這個開發板的難度與其它的開發板的區別主要是集成度很高,對實際開發很有參考的價值
引腳復用的情況很多,這就得在編程上面下心思!
自認為想要達到作者的水平還有很多的路要走!!!
其中的最后一個函數是自已弄的,其實自己到現在用指針還是有點不知怎么用
單片機開發板電路圖:http://www.zg4o1577.cn/f/ks51.pdf
- /*****************************
- *PROJECT:LED與數碼管同時顯示
- *方式:數碼管1S時間加一的同時LED以0.2秒的時間進行閃爍
- *根據操作系統思想使用時間片輪詢法實現LED輪流閃爍
- *DATE:2015-7-22
- *操作平臺:KST51
- *LED與數碼管共用一個IO口P0,對軟件編程的要求更高
- LED與數碼管位選與段選同時由P0與P1口時行控制,選擇使用了138與245芯片時行驅動!
- 這也是難點所在!
- */
- #include <reg52.h>
- #define uChar unsigned char
- #define uInt unsigned int
- //CONFIG
- sbit ADDR3 = P1^3;
- sbit ENLED = P1^4;
- uChar InDex = 0;
- uChar code LedChar[] = {
- 0xc0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xf8,
- 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0X86, 0X8E
- };
- /*uChar LedBuff[7] = {
- 0XFF,0XFF,0XFF, 0XFF ,0xFF,0XFF, 0XFF
- };*/
- struct sLedBuff { //LED顯示緩沖區結構
- unsigned char number[6];
- unsigned char alone;
- };
- void LedScan(void);
- void LedOn(void);
- void LedOff(void);
- void LedRefush(void);
- void InitSys(void);//系統初始化
- //1.定義一個結構體
- typedef struct _TASK_COMPONENTS
- {
- uChar Run; //程序運行標志 0-不運行 1-運行
- uInt Timer; //計時器
- uInt ItvTimer; //任務運行間隔時間
- void (*TaskHook)(void); //要運行的任務函數
-
- }TASK_COMPONENTS;
- typedef enum _TASK_LIST
- {
- TAST_LED_SCAN,
- TAST_LED_ON,
- TAST_LED_OFF,
- TAST_LED_REFUSH,
- TASKS_MAX // import
- }TASK_LIST;
- static TASK_COMPONENTS TaskComps[] =
- {
- {0,2,2,LedScan}, //LEDSCAN
- {0,100,100,LedOn}, // LED on
- {0,100,100,LedOff}, //LED OFF
- {0,1000,1000,LedRefush},
-
- };
- struct sLedBuff ledBuff;
- /********************************************
- *FunctionName :TaskReMarks()
- *Description :任務標志處理
- *EntryParameter :None
- *RetrunValue :None
- *********************************************/
- void TaskReMarks(void) //此函數在中斷中調用
- {
- uChar i = 0;
-
- for(i = 0;i < TASKS_MAX; i++)
- {
- if(TaskComps[i].Timer)
- {
- TaskComps[i].Timer--;
- if(TaskComps[i].Timer == 0)
- {
- TaskComps[i].Timer = TaskComps[i].ItvTimer;
- TaskComps[i].Run = 1; //任務可以運行
- }
- }
- }
- }
- //3.程序處理
- /**************************
- FunctionName :TaskProcess()
- *Description :任務標志處理
- *EntryParameter :None
- *RetrunValue :None
- ***************************/
- void TaskProcess(void)
- {
- uChar i = 0;
-
- for(i = 0;i < TASKS_MAX;i++)
- {
- if(TaskComps[i].Run)
- {
- TaskComps[i].TaskHook();
- TaskComps[i].Run = 0;
- }
- }
- }
- void main()
- {
- InitSys();
- while(1)
- {
- TaskProcess();
- }
- }
- void InitSys(void)//系統初始化
- {
- ENLED = 0;
- ADDR3 = 1;
-
- TMOD = 0X01;
- TH0 = 0xFC;
- TL0 = 0x67;
- TR0 = 1;
- ET0 = 1;
- EA = 1;
-
- // LED1 = 1;
- // LED2 = 1;
- }
- void InterruptTimer0(void) interrupt 1
- {
- TH0 = 0xFC; //定時2MS
- TL0 = 0x67;
-
- TaskReMarks();
- }
- /********************************************
- *FunctionName :void LedOn(void)
- *Description :LED開啟與關閉
- *EntryParameter :None
- *RetrunValue :None
- *********************************************/
- void LedOn(void)
- {
- ledBuff.alone = 0xFE;
-
- }
- /********************************************
- *FunctionName :void LedOff()
- *Description :LED開啟與關閉
- *EntryParameter :None
- *RetrunValue :None
- *********************************************/
- void LedOff(void)
- {
- ledBuff.alone = 0xFF;
-
- }
- /********************************************
- *FunctionName :void LedScan()
- *Description :數碼管掃描程序
- *EntryParameter :None
- *RetrunValue :None
- *********************************************/
- void LedScan(void)
- {
- static uChar i = 0;
-
- P0 = 0xFF;
- P1 = (P1 & 0XF8) | i;
- P0 = *((uChar data *) &ledBuff +i);
- if(i < sizeof(ledBuff) - 1)
- i++;
- else
- i = 0;
-
-
- }
- /********************************************
- *FunctionName :void LedRefush()
- *Description :數碼管更新程序
- *EntryParameter :None
- *RetrunValue :None
- *********************************************/
- void LedRefush(void)
- {
- static uChar i;
- static uChar j;
-
- for(j = InDex + 1; j < (sizeof(ledBuff.number)); j++)
- {
- //沒有必要顯示的數碼管不顯示
- ledBuff.number[j] = 0xFF;
- }
- ledBuff.number[InDex] = (*(&LedChar +i));//其實不知怎么用的但改了一下就好了
-
- if(i < 9) //判斷是否大于9,如果大于九,則將其歸零!
- i++; //如果是i<10則還要再加一次,達不到加九歸0的效梗←
- else
- i =0;
-
- }
復制代碼
|
評分
-
查看全部評分
|