const unsigned char /* dp g f e d c b a */
LEDSecCode[]={ 0x3f, /* 0: 0 0 1 1 1 1 1 1 */
0x06, /* 1: 0 0 0 0 0 1 1 0 */
0x5b, /* 2: 0 1 0 1 1 0 1 1 */
0x4f, /* 3: 0 1 0 0 1 1 1 1 */
0x66, /* 4: 0 1 1 0 0 1 1 0 */
0x6d, /* 5: 0 1 1 0 1 1 0 1 */
0x7d, /* 6: 0 1 1 1 1 1 0 1 */
0x27, /* 7: 0 0 1 0 0 1 1 1 */
0x7f, /* 8: 0 1 1 1 1 1 1 1 */
0x6f, /* 9: 0 1 1 0 1 1 1 1 */
0x77, /* a: 0 1 1 1 0 1 1 1 */
0x7c, /* b: 0 1 1 1 1 1 0 0 */
0x39, /* c: 0 0 1 1 1 0 0 1 */
0x5e, /* d: 0 1 0 1 1 1 1 0 */
0x79, /* e: 0 1 1 1 1 0 0 1 */
0x71, /* f: 0 1 1 1 0 0 0 1 */
0x00, /* : 0 0 0 0 0 0 0 0 */
0x40 /* -: 0 1 0 0 0 0 0 0 */
};
unsigned char LEDScanPos = 0;
unsigned char LEDBuffer[2]; // 显示缓冲区,存入待显示字符的代码
#define DigAddr 0x8061 // 位选信号接口地址
#define SecAddr 0x8060 // 段码信号接口地址
// 数码管扫描服务程序,在定时器中断内调用
void LEDScan(void)
{
XBYTE[SecAddr] = 0x00; // 输出0段码,消除影子字符
XBYTE[DigAddr] = LEDScanPos+1; // 切换位选信号
// 从显示缓冲区中读出字符的代码,然后译成段码,并送到段码接口上
XBYTE[SecAddr] = LEDSecCode[LEDBuffer[LEDScanPos]];
// 更新位选指针变量,以备下次调用
LEDScanPos = (LEDScanPos+1)&0x01;
}
|