今天解決了幾個困惑繼續上路,先把所有基礎的東西用源代碼跑一遍。
順便認識一下各個元器件,和很多陌生的名詞。
下面是我寫的一個數碼管顯示數字。嘗試了一下C語言的抽象, C++程序員的陋習^_^
- Interface.h
- #ifndef __INTERFACE_H__
- #define __INTERFACE_H__
- typedef unsigned char u8;
- typedef unsigned int u16;
- typedef unsigned long u32;
- /**
- * 接口說明 : 顯示一個數字
- * 參數 :
- * x : 顯示位置的X坐標
- * y : 顯示位置的Y坐標
- * val : 具體需要顯示的內容
- * 返回 :
- * 無返回值
- */
- typedef void(*pfnDisplayNumber)(u8 x, u8 y, u8 val);
- /**
- * 接口說明 : 清除屏幕
- */
- typedef void(*pfnClearScreen)(void);
- /**
- * 結構體說明 : 負責顯示
- * 例如數碼管、或者液晶屏等等
- */
- typedef struct _DisplayInterface {
- pfnDisplayNumber displayerNumber; // 用于顯示一個數字的接口
- pfnClearScreen clear; // 用于清除的一個接口
- }DisplayInterface;
- #endif
- ---------------------------------------------------------
- NixieTubeDisplay.h
- #ifndef __NIXIETUBEDISPLAY_H__
- #define __NIXIETUBEDISPLAY_H__
- #include "reg52.h"
- #include <intrins.h>
- #include "Interface.h"
- // 初始化一個數碼管,例如外部創建的一個局部 DisplayInterface
- // 將地址傳進來由InitNixieTube初始化.
- // 因為使用malloc不正常所以只設計了一個Init
- DisplayInterface * InitNixieTube(DisplayInterface * );
- #endif
- ---------------------------------------------------------
- NixieTubeDisplay.c
- #include "NixieTubeDisplay.h"
- sbit LSA = P2 ^ 2;
- sbit LSB = P2 ^ 3;
- sbit LSC = P2 ^ 4;
- // 0 - 9
- static const u8 numberHex[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
- // 將一個數字顯示到數碼管
- void displayNumberToNixieTube(u8 x, u8 y, u8 val)
- {
- if((val >= 0 && val < 10) && (x >= 0 && x < 8))
- {
- // 設置顯示內容
- P0 = numberHex[val];
-
- // 設置顯示索引
- LSA = (x >> 0 ) % 2;
- LSB = (x >> 1 ) % 2;
- LSC = (x >> 2 ) % 2;
- }
- }
- // 清除顯示
- void clearNixieTube()
- {
- P0 = 0;
- }
- DisplayInterface * InitNixieTube(DisplayInterface * pDisplay)
- {
- if(pDisplay) {
- pDisplay->displayerNumber = displayNumberToNixieTube;
- pDisplay->clear = clearNixieTube;
- return pDisplay;
- }
- return 0;
- }
- ---------------------------------------------------------
- main.c
- #include "NixieTubeDisplay.h"
- typedef u8(*pfnCallback)(DisplayInterface * displayObject);
- void delay(u16 i)
- {
- while(i--);
- }
- void display(u8 index, u8 number,
- DisplayInterface * displayObject, pfnCallback callback)
- {
- if(displayObject)
- {
- displayObject->displayerNumber(index, 0, number);
- if(callback) { callback(displayObject); }
- }
- }
- void message(DisplayInterface * displayObject)
- {
- delay(100);
- // 當接收到這個消息的時候,說明已經顯示完了
- if(displayObject)
- {
- displayObject->clear();
- }
- }
- void main()
- {
- u8 n = 0;
- u8 i = 0;
- DisplayInterface v;
- InitNixieTube(&v);
- while(1)
- {
- for(i = 0; i < 10; i++)
- {
- display(i, i + 2, &v, message);
- }
- }
- }
復制代碼 |