📄 led.c
字号:
0x0A, /* 'r' */
0xB6, /* 's', Actually displayed as 'S' */
0x1E, /* 't' */
0x38, /* 'u' */
0x00, /* 'v', No seven-segment conversion */
0x00, /* 'w', No seven-segment conversion */
0x00, /* 'x', No seven-segment conversion */
0x76, /* 'y', Actually displayed as 'Y' */
0x00 /* 'z', No seven-segment conversion */
};
/*$PAGE*/
/*
*********************************************************************************************************
* HEXADECIMAL to SEVEN-SEGMENT conversion table
* a
* ------
* f | | b
* | g |
* Note: The segments are mapped as follows: ------
* e | | c
* a b c d e f g | d |
* -- -- -- -- -- -- -- -- ------
* B7 B6 B5 B4 B3 B2 B1 B0
*********************************************************************************************************
*/
const INT8U DispHexToSegTbl[] = {
0xC0,
0xF9,
0xA4,
0xB0,
0x99,
0x92,
0x82,
0xF8,
0x80,
0x90,
0x88,
0x83,
0xC6,
0xA1,
0x86,
0x8E,
0xFF
};
void DispClrScr (void)
{
INT8U i;
for (i = 0; i < DISP_N_DIG; i++) { /* Clear the screen by turning OFF all segments */
MCCTL_MCZI=0;
DispSegTbl[i] = 0x00;
MCCTL_MCZI=1;
}
}
void DispInit (void)
{
DispInitPort(); /* Initialize I/O ports used in display driver */
DispDigMsk = 0x01;
DispSegTblIx = 0;
//DispClrScr(); /* Clear the Display */
}
#pragma CODE_SEG NON_BANKED
void interrupt DispMuxHandler (void)
{
/* Insert code to CLEAR INTERRUPT SOURCE here */
MCFLG_MCZF=1; /*Clear modulus counter interrupt flag*/
//PORTB=~PORTB;
//DispOutSeg (~0XAA);
//DispOutSeg(0x00); /* Turn OFF segments while changing digits */
DispOutDig(DispDigMsk); /* Select next digit to display */
DispOutSeg(DispSegTbl[DispSegTblIx]); /* Output digit's seven-segment pattern */
if (DispSegTblIx == (DISP_N_DIG - 1)) { /* Adjust index to next seven-segment pattern */
DispSegTblIx = 0; /* Index into first segments pattern */
DispDigMsk = 0x01; /* 0x80 will select the first seven-segment digit */
} else {
DispSegTblIx++;
DispDigMsk <<= 1; /* Select next digit */
}
}
#pragma CODE_SEG DEFAULT
void DispInitPort (void)
{
//DDRB=0XFF;
//DDRK=0X3F;
//PORTB=0X0F;
DispOutSeg(0xFF); /* Turn OFF segments */
DispOutDig(0xFF); /* Turn OFF digits */
}
void DispOutDig (INT8U msk)
{
PORTK = ~msk;//DISP_PORT_DIG = msk;
}
void DispOutSeg (INT8U seg)
{
PORTB = seg;//DISP_PORT_SEG = seg;
}
void DispStatClr (INT8U dig, INT8U bit)
{
MCCTL_MCZI=0;
DispSegTbl[dig] &= ~(1 << bit);
MCCTL_MCZI=1;
}
/*
*********************************************************************************************************
* SET STATUS SEGMENT
*
* Description: This function is called to turn ON a single segment on the display.
* Arguments : dig is the position of the digit where the segment appears (0..DISP_N_DIG-1)
* bit is the segment bit to turn ON (0..7)
* Returns : none
*********************************************************************************************************
*/
void DispStatSet (INT8U dig, INT8U bit)
{
MCCTL_MCZI=0;
DispSegTbl[dig] |= 1 << bit;
MCCTL_MCZI=1;
}
void DispStr (INT8U dig, char *s)
{
INT8U stat;
while (*s && dig < DISP_N_SS) {
MCCTL_MCZI=0;
stat = DispSegTbl[dig] & 0x01; /* Save state of B0 (i.e. status) */
DispSegTbl[dig++] = DispASCIItoSegTbl[*s++ - 0x20] | stat;
MCCTL_MCZI=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -