今天解决了几个困惑继续上路,先把所有基础的东西用源代码跑一遍。
顺便认识一下各个元器件,和很多陌生的名词。
下面是我写的一个数码管显示数字。尝试了一下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);
- }
- }
- }
复制代码 |