⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 driver.c

📁 s3c2410 example code , it s a simple code to use s3c2410.
💻 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 + -