📄 8led.c
字号:
/*********************************************************************************************
* File: 8led.c
* Author: embest
* Desc: 8-segment digit LED control functions
* History:
*********************************************************************************************/
/*--- include files ---*/
#include "44b.h"
#include "44blib.h"
#include "keyboard.h"
/*--- macro defines ---*/
/* Bitmaps for 8-segment */
#define SEGMENT_A 0x80
#define SEGMENT_B 0x40
#define SEGMENT_C 0x20
#define SEGMENT_D 0x08
#define SEGMENT_E 0x04
#define SEGMENT_F 0x02
#define SEGMENT_G 0x01
#define SEGMENT_P 0x10
#define DIGIT_F (SEGMENT_A | SEGMENT_G | SEGMENT_E | SEGMENT_F)
#define DIGIT_E (SEGMENT_A | SEGMENT_G | SEGMENT_E | SEGMENT_F | SEGMENT_D)
#define DIGIT_D (SEGMENT_B | SEGMENT_C | SEGMENT_D | SEGMENT_F | SEGMENT_E)
#define DIGIT_C (SEGMENT_A | SEGMENT_D | SEGMENT_E | SEGMENT_G)
#define DIGIT_B (SEGMENT_C | SEGMENT_D | SEGMENT_F | SEGMENT_E | SEGMENT_G)
#define DIGIT_A (SEGMENT_A | SEGMENT_B | SEGMENT_C | SEGMENT_F | SEGMENT_E | SEGMENT_G)
#define DIGIT_9 (SEGMENT_A | SEGMENT_B | SEGMENT_C | SEGMENT_F | SEGMENT_G)
#define DIGIT_8 (SEGMENT_A | SEGMENT_B | SEGMENT_C | SEGMENT_D | SEGMENT_F | SEGMENT_E | SEGMENT_G)
#define DIGIT_7 (SEGMENT_A | SEGMENT_B | SEGMENT_C)
#define DIGIT_6 (SEGMENT_A | SEGMENT_C | SEGMENT_D | SEGMENT_F | SEGMENT_E | SEGMENT_G)
#define DIGIT_5 (SEGMENT_A | SEGMENT_C | SEGMENT_D | SEGMENT_F | SEGMENT_G)
#define DIGIT_4 (SEGMENT_B | SEGMENT_C | SEGMENT_F | SEGMENT_G)
#define DIGIT_3 (SEGMENT_A | SEGMENT_B | SEGMENT_C | SEGMENT_D | SEGMENT_F)
#define DIGIT_2 (SEGMENT_A | SEGMENT_B | SEGMENT_D | SEGMENT_E | SEGMENT_F)
#define DIGIT_1 (SEGMENT_B | SEGMENT_C)
#define DIGIT_0 (SEGMENT_A | SEGMENT_B | SEGMENT_C | SEGMENT_D | SEGMENT_E | SEGMENT_G)
/* 8led control register address */
#define LED8ADDR (*(volatile unsigned char *)(0x2140000))
#define keyboard_base (*(volatile unsigned char *)(0x06000000))
/*--- global variables ---*/
/* Digit Symbol table*/
int Symbol[] = { DIGIT_0, DIGIT_1, DIGIT_2, DIGIT_3, DIGIT_4, DIGIT_5, DIGIT_6, DIGIT_7,
DIGIT_8, DIGIT_9, DIGIT_A, DIGIT_B, DIGIT_C, DIGIT_D, DIGIT_E, DIGIT_F};
/* LED segment table */
int Seg[] = { SEGMENT_A, SEGMENT_B, SEGMENT_C, SEGMENT_D, SEGMENT_E, SEGMENT_F, SEGMENT_G, SEGMENT_P};
/*--- functions declare ---*/
void Digit_Led_Test(void);
void Digit_Led_Symbol(int value);
void Digit_Led_Segment(int seg_num);
void init_keyboard();
void KeyboardInt(void);
/*--- extern functions ---*/
extern void Delay(int time);
/*--- function declare ---*/
/*--- function code---*/
/*********************************************************************************************
* name: Digit_Led_Test
* func: 8-segment digit LED test function
* para: none
* ret: none
* modify:
* comment:
*********************************************************************************************/
void Digit_Led_Test(void)
{
int i;
/* display all digit from 0 to F */
for(i=0; i<16; i++)
{
Digit_Led_Symbol(i);
Delay(4000);
}
}
/*********************************************************************************************
* name: Digit_Led_Symbol
* func: display digit symbol on 8-segment digit LED's segment
* para: value -- digit's hexadecimal value
* ret: none
* modify:
* comment:
*********************************************************************************************/
void Digit_Led_Symbol(int value)
{
/* symbol display */
if( (value >= 0) && (value < 16) )
LED8ADDR = ~Symbol[value];
}
/*********************************************************************************************
* name: Digit_Led_Segment
* func: 8-segment digit LED's segment display control function
* para: seg_num -- segment number
* ret: none
* modify:
* comment:
*********************************************************************************************/
void Digit_Led_Segment(int seg_num)
{
/* segment control */
if( (seg_num >= 0) && (seg_num < 8) )
LED8ADDR = ~Seg[seg_num];
}
void init_keyboard()
{
/* enable interrupt */
rINTMOD = 0x0;
rINTCON = 0x1;
/* set EINT1 interrupt handler */
// rINTMSK =~(BIT_GLOBAL|BIT_EINT1);
rINTMSK=~( BIT_TIMER0 | BIT_GLOBAL | BIT_EINT1); //the qhy change
// pISR_EINT1 = (int)KeyboardInt;
// pISR_EINT4567 = (int)Eint4567Isr;
/* PORT G */
rPCONG = 0xffff; // EINT7~0
rPUPG = 0x0; // pull up enable
rEXTINT = rEXTINT|0x20; // EINT1 falling edge mode
rI_ISPC = BIT_EINT1; // clear pending bit
rEXTINTPND = 0xf; // clear EXTINTPND reg
}
/*********************************************************************************************
* name: KeyboardInt
* func: keyboard interrupt handler function
* para: none
* ret: none
* modify:
* comment:
********************************************************************************************/
void IrqStartKey(void)
{
int value;
rEXTINTPND = 0xf; // clear EXTINTPND reg
value = key_read();
if(value > -1)
Digit_Led_Symbol(value);
rI_ISPC = BIT_EINT1; // clear pending bit
rINTCON = 0x1;
}
/*********************************************************************************************
* name: key_read
* func: read key value
* para: none
* ret: key value, -1 -- error
* modify:
* comment:
********************************************************************************************/
inline int key_read()
{
int value;
char temp;
/* read line 1 */
temp = *(&keyboard_base+0xfd);
/* not 0xF mean key down */
if(( temp & KEY_VALUE_MASK) != KEY_VALUE_MASK)
{
if( (temp&0x1) == 0 )
value = 3;
else if( (temp&0x2) == 0 )
value = 2;
else if( (temp&0x4) == 0 )
value = 1;
else if( (temp&0x8) == 0 )
value = 0;
return value;
}
/* read line 2 */
temp = *(&keyboard_base+0xfb);
/* not 0xF mean key down */
if(( temp & KEY_VALUE_MASK) != KEY_VALUE_MASK)
{
if( (temp&0x1) == 0 )
value = 7;
else if( (temp&0x2) == 0 )
value = 6;
else if( (temp&0x4) == 0 )
value = 5;
else if( (temp&0x8) == 0 )
value = 4;
return value;
}
/* read line 3 */
temp = *(&keyboard_base+0xf7);
/* not 0xF mean key down */
if(( temp & KEY_VALUE_MASK) != KEY_VALUE_MASK)
{
if( (temp&0x1) == 0 )
value = 0xb;
else if( (temp&0x2) == 0 )
value = 0xa;
else if( (temp&0x4) == 0 )
value = 9;
else if( (temp&0x8) == 0 )
value = 8;
return value;
}
/* read line 4 */
temp = *(&keyboard_base+0xef);
/* not 0xF mean key down */
if(( temp & KEY_VALUE_MASK) != KEY_VALUE_MASK)
{
if( (temp&0x1) == 0 )
value = 0xf;
else if( (temp&0x2) == 0 )
value = 0xe;
else if( (temp&0x4) == 0 )
value = 0xd;
else if( (temp&0x8) == 0 )
value = 0xc;
return value;
}
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -