📄 driver.c
字号:
/*************************************************************************
Include files
*************************************************************************/
#include "driver.h"
/*************************************************************************
Variable define
*************************************************************************/
/* Global control */
UI cpld_ctrl;
UI io_reg0 ;
/* Timer0 system tick */
UI tick_ms;
UC tick_sec, tick_min, tick_hour;
UC tick_on;
/* 7_SEG LED */
UC seven_seg_buf[4], seven_seg_idx;
UI tbl_7seg_com[4] = {0x0e00, 0x0d00, 0x0b00, 0x0700};
/* KEY_PAD */
UI scan_led=0x5500;
UC scan_key, scan_idx, scan_key_in_idx, scan_key_out_idx;
UI scan_key_buf[16], last_scan_key;
UC key_assigned;
void Initial_TIMER0(void);
/*************************************************************************
System TICK (TIMER0)
*************************************************************************/
IRQ_ATTR1 void IRQ_ATTR2 IRQ_TIMER0(void)
{
UN_CVT cvt;
tick_ms++;
//IOPDATA ^= 0x20000; //Test
if((tick_ms & 3) == 0) { //scan time = 4 * 3ms; for 7_SEG LED
seven_seg_idx++;
seven_seg_idx &= 3;
IO_REG0 = io_reg0 | tbl_7seg_com[seven_seg_idx] | seven_seg_buf[seven_seg_idx];
if (seven_seg_idx==1) IO_REG0&=0xFFfF;
}
if((tick_ms & 0xf) == 0) {
if((scan_key_in_idx+1) == scan_key_out_idx) { //Key_Pad Overfllow
//TODO
}
else {
IO_REG2 = scan_led | 0xfe;
cvt.b[0] = (UC)((IO_REG1 & 0x0f00) >> 8);
IO_REG2 = scan_led | 0xfd;
cvt.b[0] |= (UC)((IO_REG1 & 0x0f00) >> 4);
IO_REG2 = scan_led | 0xfb;
cvt.b[1] = (UC)((IO_REG1 & 0x0f00) >> 8);
IO_REG2 = scan_led | 0xf7;
cvt.b[1] |= (UC)((IO_REG1 & 0x0f00) >> 4);
if(last_scan_key == cvt.w[0]) {
if(key_assigned == UM) {
if(cvt.w[0] != 0xffff) {
scan_key_buf[scan_key_in_idx++] = cvt.w[0];
scan_key_in_idx &= 0xf;
}
key_assigned = OK;
}
}
else {
key_assigned = UM;
}
last_scan_key = cvt.w[0];
}
}
if((tick_ms % 1000) == 0) {
//tick_ms = 0;
tick_on = OK;
tick_sec++;
if(tick_sec >= 60) {
tick_sec = 0;
tick_min++;
if(tick_min >= 60) {
tick_min = 0;
tick_hour++;
}
}
}
ClearPending(BIT_TIMER0);
//IOPDATA ^= 0x20000; //Test
}
void Initial_TIMER0(void)
{
TMOD = 0x00000003;
TDATA0 = 50000; //=50000*20ns = 1ms
tick_on = UM;
tick_ms = 0;
tick_sec = 0;
tick_min = 0;
tick_hour = 0;
pISR_TIMER0 = (unsigned)IRQ_TIMER0;
ClearPending(BIT_TIMER0);
EnableInterrupt(BIT_TIMER0);
}
void OptimizationDelay(void)
{
}
void Delay (UI ms)
{
int i, j;
UI temp;
if(tick_on == OK) {
temp = (tick_ms + ms);
while(temp != tick_ms);
}
else {
for (i=0; i<ms; i++) {
for (j= 0; j < 1000; j++) {
}
}
}
}
/*************************************************************************
4X4 KEY PAD
*************************************************************************/
#define KEY_0 0xdfff
#define KEY_1 0xfffe
#define KEY_2 0xfffd
#define KEY_3 0xfffb
#define KEY_4 0xffef
#define KEY_5 0xffdf
#define KEY_6 0xffbf
#define KEY_7 0xfeff
#define KEY_8 0xfdff
#define KEY_9 0xfbff
#define KEY_A 0xfff7
#define KEY_B 0xff7f
#define KEY_C 0xf7ff
#define KEY_D 0x7fff
#define KEY_STAR 0xefff
#define KEY_POND 0xbfff
UC Creator_key2num(UI ch);
void Initial_KEYPAD(void)
{
UC i;
last_scan_key = 0xffff;
scan_key_in_idx = 0;
scan_key_out_idx = 0;
key_assigned = UM;
for(i=0; i<16; i++) scan_key_buf[i] = 0xffff;
}
UC KEYPAD_get_key(UC *ch)
{
UI temp;
if(scan_key_out_idx != scan_key_in_idx) {
temp = scan_key_buf[scan_key_out_idx++];
scan_key_out_idx &= 0xf;
*ch = Creator_key2num(temp);
return(OK);
}
return(UM);
}
UC KEYPAD_chk_key(UC *ch)
{
UI temp;
if(scan_key_out_idx != scan_key_in_idx)
{
temp = scan_key_buf[scan_key_out_idx];
*ch = Creator_key2num(temp);
return(OK);
}
return(UM);
}
UI key2num_tbl[16] = {
KEY_0, KEY_1, KEY_2, KEY_3,
KEY_4, KEY_5, KEY_6, KEY_7,
KEY_8, KEY_9, KEY_A, KEY_B,
KEY_C, KEY_D, KEY_STAR, KEY_POND
};
UC Creator_key2num(UI ch)
{
UC idx;
for(idx=0; idx<16; idx++) {
if(ch == key2num_tbl[idx]) return(idx);
}
return(0xff);
}
/*************************************************************************
7 SEGMENT LED
*************************************************************************/
const UC LED_tbl[] = {
0xc0, 0xf9, 0xa4, 0xb0, 0x99,
0x92, 0x82, 0xf8, 0x80, 0x90,
0x88, 0x83, 0xc6, 0xa1, 0x84,
0x8e, 0x7f, 0xff
};
void Initial_7SEG(void)
{
seven_seg_buf[0] = 0xc0;
seven_seg_buf[1] = 0xc0;
seven_seg_buf[2] = 0xc0;
seven_seg_buf[3] = 0xc0;
}
void _7SEG_put_led(UC digit, UC data)
{
if(data <= 0x0d)
{
seven_seg_buf[digit] = LED_tbl[data];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -