📄 displaydir.c
字号:
// 为了便于阅读和打印,最大行长为100个字符.
// 1 2 3 4 5 6 7 8 9 A
//34567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
/*------------------------------------------------------------------------------------------------*-
****A**** ****A**** SEG_A ...... Px.0 ---- 1
| | ... | | SEG_B ...... Px.1 ---- 2
F B F B SEG_C ...... Px.2 ---- 4
| | ... | | SEG_D ...... Px.3 ---- 8
****G**** ****G**** SEG_E ...... Px.4 ---- 1
| | ... | | SEG_F ...... Px.5 ---- 2
E C E C SEG_G ...... Px.6 ---- 4
| | ... | | SEG_Dot ...... Px.7 ---- 8
****D****.>Dot ****D****.>Dot
| | Px.Y(Y = 0 ~ 7)
| |________ Dis_COMx ..... Px.Y
| . .
| . .
| . .
|________________________________ Dis_COM0 ..... Px.0
// LED.0 ... LED.x
-*------------------------------------------------------------------------------------------------*/
#include "main.h"
#include "port.h"
#include "SysTick.h"
#include "DisplayDir.h"
// 数码显示初始化
uint8_t DisplayBuffer[MAX_DISP_BITS] = {
1, 2, 3, 4
};
bool bUpdateDisplayEn;
// 数码管是否是共阳极?
//#define Is_Anode
// 还是数码管共阴极?
//#define Is_Cathode
// SEG线硬件连接方法定义(某位为 '1' 表示与数码管相对应的引脚相连)
#define SEG_A 0x01
#define SEG_B 0x02
#define SEG_C 0x04
#define SEG_D 0x08
#define SEG_E 0x10
#define SEG_F 0x20
#define SEG_G 0x40
#define SEG_Dot 0x80
uint8_t code DispCode[] =
{
//#ifdef Is_Anode
(SEG_A+SEG_B|SEG_C|SEG_D|SEG_E|SEG_F), // 0
(SEG_B|SEG_C), // 1
(SEG_A|SEG_B|SEG_D|SEG_E|SEG_G), // 2
(SEG_A|SEG_B|SEG_C|SEG_D|SEG_G), // 3
(SEG_B|SEG_C|SEG_F|SEG_G), // 4
(SEG_A|SEG_C|SEG_D|SEG_G|SEG_F), // 5
(SEG_A|SEG_C|SEG_D|SEG_E|SEG_G|SEG_F), // 6
(SEG_A|SEG_B|SEG_C), // 7
(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G), // 8
(SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G), // 9
'\0',
(SEG_A|SEG_F|SEG_G|SEG_C|SEG_D), // S
(SEG_A|SEG_F|SEG_G|SEG_E|SEG_D), // E
(SEG_F|SEG_E|SEG_D) // L
};
// 是否是高电平位选?
#define Is_HIGH_bool_SELECT
// 还是低电平位选?
//#define Is_LOW_bool_SELECT
// COM线接口定义(某位为 '1' 表示对位COM线位选)
#define COM0_CS 0x00
#define COM1_CS 0x01
#define COM2_CS 0x02
#define COM3_CS 0x03
#define COM4_CS 0x04
#define COM5_CS 0x05
#define COM6_CS 0x06
#define COM7_CS 0x07
uint8_t code CS_Control[] =
{
COM0_CS,
COM1_CS,
COM2_CS,
COM3_CS
};
/*LED数码管工作模式控制字*/
/*工作模式包含三种, 1> 点位同时闪烁
2> 点位分别闪烁
3> 点位不闪烁
*/
uint8_t LED_TMOD = 0x00;
/*点闪烁总使能标志为1点闪动*/
bool g_DFlashEn = 0;
/*位闪烁总使能标志为1位闪动*/
bool g_BFlashEn = 0;
/*用于切换点的闪烁状态,闪烁或不闪烁*/
static bool DFlash;
/*用于切换位的闪烁状态,闪烁或不闪烁*/
static bool BFlash;
/*数码管闪烁标志*/
uint8_t bdata LedChangeFlag;
// 闪烁点:Blink,为1的位闪动
sbit Dlink1 = LedChangeFlag^0; /*时十位点 为1的位闪动*/
sbit Dlink2 = LedChangeFlag^1;
sbit Dlink3 = LedChangeFlag^2;
sbit Dlink4 = LedChangeFlag^3; /*分个位点 为1的位闪动*/
// 闪烁位:Blink,为1的位闪动
sbit Blink1 = LedChangeFlag^4; /*时十位*/
sbit Blink2 = LedChangeFlag^5; /*时个位*/
sbit Blink3 = LedChangeFlag^6; /*分十位*/
sbit Blink4 = LedChangeFlag^7; /*分个位*/
/*-------------------------------------------------------------------------------------------------------*-
关于数码管显示的各寄存器的应用说明:
// 任意位和任意点可以同时闪烁(点位总使能开同时开)
#define LED_DISP_ALL_FLASH() do{LED_TMOD = 0x00; g_DFlashEn = 1; g_BFlashEn = 1;}while(0)
-*-------------------------------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------------------------------*-
* 函数名称: LedDisplay()
* 参 数: XX
* 返 回: XX
* 函数功能: 数码显示
*
* 说 明:
*
* 当前版本: V1.0 * 取代版本:
* 作 者: wsl * 修 改:
* 版本信息: 2006-09-14 * 修改信息:
-*-------------------------------------------------------------------------------------------------------*/
void LedDisplay(void)
{
static uint8_t BitCnt;
// 关数码管消隐
COM_LINE |= (1<<COM0_CS)|(1<<COM1_CS)|(1<<COM2_CS)|(1<<COM3_CS);
// 任意位和任意点可以同时闪烁(点位总使能开同时开)
if ( DFlash )
{
switch (BitCnt)
{
case 0: if (Dlink1) {SEG_LINE = ~(DispCode[DisplayBuffer[BitCnt]] + SEG_Dot);}
else {SEG_LINE = ~DispCode[DisplayBuffer[BitCnt]];} break;
case 1: if (Dlink2) {SEG_LINE = ~(DispCode[DisplayBuffer[BitCnt]] + SEG_Dot);}
else {SEG_LINE = ~DispCode[DisplayBuffer[BitCnt]];} break;
case 2: if (Dlink3) {SEG_LINE = ~(DispCode[DisplayBuffer[BitCnt]] + SEG_Dot);}
else {SEG_LINE = ~DispCode[DisplayBuffer[BitCnt]];} break;
case 3: if (Dlink4) {SEG_LINE = ~(DispCode[DisplayBuffer[BitCnt]] + SEG_Dot);}
else {SEG_LINE = ~DispCode[DisplayBuffer[BitCnt]];} break;
default: break;
}
}
else if ( !BFlash ) /*否则是位闪烁*/
{
switch (BitCnt)
{
case 0: if (Blink1) {SEG_LINE = 0xff;}
else {SEG_LINE = ~DispCode[DisplayBuffer[BitCnt]];} break;
case 1: if (Blink2) {SEG_LINE = 0xff;}
else {SEG_LINE = ~DispCode[DisplayBuffer[BitCnt]];} break;
case 2: if (Blink3) {SEG_LINE = 0xff;}
else {SEG_LINE = ~DispCode[DisplayBuffer[BitCnt]];} break;
case 3: if (Blink4) {SEG_LINE = 0xff;}
else {SEG_LINE = ~DispCode[DisplayBuffer[BitCnt]];} break;
default: break;
}
}
else
{
SEG_LINE = ~DispCode[DisplayBuffer[BitCnt]];
}
COM_LINE ^= 1 << CS_Control[BitCnt++];
if (BitCnt >= MAX_DISP_BITS)
{
BitCnt = 0;
}
}
/*-------------------------------------------------------------------------------------------------------*-
* 函数名称: FlashFreq()
* 参 数: XX
* 返 回: XX
* 函数功能: 控制闪烁频率(在定时中断中运行)
*
* 说 明:
*
* 当前版本: V1.0 * 取代版本:
* 作 者: wsl * 修 改:
* 版本信息: 2006-09-14 * 修改信息:
-*-------------------------------------------------------------------------------------------------------*/
void LedFlashFreq(void)
{
static uint8_t ucLedFlashFreq = 0;
ucLedFlashFreq++; // 设每5mS中断一次
if (ucLedFlashFreq >= 500/TIMEROUT) // 500ms除以标
{
ucLedFlashFreq = 0;
if ( g_DFlashEn ) // 是否需要点闪烁
{
DFlash = ~DFlash;
}
else
{
DFlash = 0;
}
if ( g_BFlashEn ) // 是否需要点闪烁
{
BFlash = ~BFlash;
}
else
{
BFlash = 0;
}
}
}
void UpdateDisplayBuffer(uint8_t hour, uint8_t minute)
{
DisplayBuffer[0] = hour / 10;
DisplayBuffer[1] = hour % 10;
DisplayBuffer[2] = minute / 10;
DisplayBuffer[3] = minute % 10;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -