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

📄 ok7s256ads.h

📁 AT91sam7s 256 B/D example
💻 H
字号:
/***********************************************************************************/
/*    OK7S256ads.h : Definition & User Function for OK-7S256 V1.0 Training Kit	   */
/***********************************************************************************/
#define	true		-1			// true  = 0xFFFFFFFF
#define	false		0			// false = 0x00000000

#define	EXT_OC		18432000		// external oscilator MAINCK
#define	MCK		48000000		// master clock MCK
#define	MCKKHz		(MCK/1000)		// MCK/1000

#define	PA0		(1 << 0)		// define bit number of PIO
#define	PA1		(1 << 1)
#define	PA2		(1 << 2)
#define	PA7		(1 << 7)
#define	PA8		(1 << 8)
#define	PA15		(1 << 15)
#define	PA17		(1 << 17)
#define	PA18		(1 << 18)
#define	PA19		(1 << 19)
#define	PA20		(1 << 20)
#define	PA21		(1 << 21)
#define	PA22		(1 << 22)
#define	PA23		(1 << 23)

#define LED1		PA0			// LED1,2 output signal
#define LED2		PA1

#define SPEAKER		PA0			// speaker
#define BUZZER		PA2			// buzzer output signal

#define KEY1		PA7			// KEY1,2 input signal
#define KEY2		PA8

#define CS1		PA15			// SPI CS1 output signal

#define J3		PA17			// J3 input signal
#define PCK1		PA17			// PCK1 output signal

#define LCD_RS		PA18			// LCD output signal
#define LCD_E		PA19
#define LCD_ALL		(0xFF000000|LCD_E|LCD_RS)

#define GLCD_DI		PA20			// GLCD output signal
#define GLCD_E		PA21
#define GLCD_CS1	PA22
#define GLCD_CS2	PA23
#define GLCD_ALL	(0xFF000000|GLCD_CS2|GLCD_CS1|GLCD_E|GLCD_DI)

void Delay_1us(void)				/* 1 us delay for -O2 -Otime option */
{ volatile unsigned int count;

  for(count = 0; count < 4; count++);
}

void Delay_us(unsigned int us)			/* us delay for -O2 -Otime option */
{ volatile unsigned int count, countmax = (MCK / 9600000) * us;

  for(count = 0; count < countmax; count++);
}

void Delay_ms(unsigned int ms)			/* ms delay for -O2 -Otime option */
{ volatile unsigned int count, countmax = (MCK / 10000) * ms;

  for(count = 0; count < countmax; count++);
}

void LED_on(unsigned int led)			/* LED on */
{ 
  AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, LED2|LED1); // PA1-PA0 = output
  AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, led);
}

void LED_off(unsigned int led)			/* LED off */
{ 
  AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, LED2|LED1); // PA1-PA0 = output
  AT91F_PIO_SetOutput(AT91C_BASE_PIOA, led);
}

void Buzzer_on(void)				/* buzzer on */
{ 
  AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, BUZZER);
}

void Buzzer_off(void)				/* buzzer off */
{ 
  AT91F_PIO_SetOutput(AT91C_BASE_PIOA, BUZZER);
}

void Beep(void)					/* beep for 50 ms */
{ 
  Buzzer_on();
  Delay_ms(50);
  Buzzer_off();
}

void Error(void)				/* beep 3 times */
{ 
  Beep();
  Delay_ms(50);
  Beep();
  Delay_ms(50);
  Beep();
}

__inline void AT91F_PIO_Opendrain(		/* configure open drain */
	AT91PS_PIO pPio, unsigned int multiDrvEnable)
{
//	pPio->PIO_MDDR = ~multiDrvEnable;
	pPio->PIO_MDER = multiDrvEnable;
}

__inline void AT91F_PIO_Pullup(			/* configure pull up */
	AT91PS_PIO pPio, unsigned int pullupEnable)
{
//	pPio->PIO_PPUDR = ~pullupEnable;
	pPio->PIO_PPUER = pullupEnable;
}

void MCU_initialize(void)			/* initialize AT91SAM7S256 & OK-7S256 kit */
{ 
  AT91F_RSTSetMode(AT91C_BASE_RSTC, AT91C_RSTC_URSTEN);	// enable User Reset by NRST pin input

  AT91F_PIOA_CfgPMC();					// enable clock of PIO

  AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, LED2|LED1);	// PA1-PA0 = output
  LED_off(LED2|LED1);					// LED2-LED1 off

  AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, BUZZER);		// PA2 = output
  Buzzer_off();						// buzzer off

  AT91F_PIO_CfgInput(AT91C_BASE_PIOA, J3|KEY2|KEY1);	// PA17,PA8,PA7 = input with pullup
  AT91F_PIO_Pullup(AT91C_BASE_PIOA, J3|KEY2|KEY1);
  
  AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, LCD_ALL);	// open drain output for LCD
  AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, LCD_ALL);
  AT91F_PIO_Opendrain(AT91C_BASE_PIOA, LCD_ALL);

  AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, GLCD_ALL);	// open drain output for GLCD
  AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, GLCD_ALL);
  AT91F_PIO_Opendrain(AT91C_BASE_PIOA, GLCD_ALL);
}

void LCD_command(unsigned int command)		/* write a command(instruction) on text LCD */
{
  AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, LCD_RS);       // RS = 0
  AT91F_PIO_SetOutput(AT91C_BASE_PIOA, command << 24);	// output command
  AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, (~command) << 24);

  AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LCD_E);		// E = 1
  Delay_1us();
  AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, LCD_E);	// E = 0

  if(command & 0xFC)					// wait for operation
    Delay_us(50);
  else
    Delay_ms(2);
}

void LCD_data(unsigned int data)		/* display a character on text LCD */
{
  AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LCD_RS);		// RS = 1
  AT91F_PIO_SetOutput(AT91C_BASE_PIOA, data << 24);	// output data
  AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, (~data) << 24);
  
  AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LCD_E);		// E = 1
  Delay_1us();
  AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, LCD_E);	// E = 0

  Delay_us(50);						// wait for operation
}

void LCD_initialize(void)			/* initialize text LCD module */
{
  AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, LCD_ALL); // open drain output
  AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, LCD_ALL);
  AT91F_PIO_Opendrain(AT91C_BASE_PIOA, LCD_ALL);
  Delay_ms(2);
  
  LCD_command(0x38);				// function set(8 bit, 2 line, 5x7 dot)
  LCD_command(0x0C);				// display control(display on, cursor off)
  LCD_command(0x06);				// entry mode set(increment, not shift)
  LCD_command(0x01);				// clear display
}

void LCD_string(unsigned int command, char *string) /* display a string on text LCD */
{
  LCD_command(command);				// cursor position
  
  while(*string != '\0')			// display string
    { LCD_data(*string);
      string++;
    }
}

unsigned char key_flag = 0;

unsigned int Key_in(void)			/* input key KEY2 - KEY1 without debouncing */
{ unsigned int keycode;				//   (no input = 0, KEY1 = 1, KEY2 = 2)

  AT91F_PIO_CfgInput(AT91C_BASE_PIOA, KEY2|KEY1); // PA8,PA7 = input with pullup
  AT91F_PIO_Pullup(AT91C_BASE_PIOA, KEY2|KEY1);

  keycode = (~(AT91F_PIO_GetInput(AT91C_BASE_PIOA) >> 7)) & 0x00000003;

  return keycode;
}

unsigned int Key_input(void)			/* input key KEY2 - KEY1 with debouncing */
{ unsigned int key;				//   (no input = 0, KEY1 = 1, KEY2 = 2)

  key = Key_in();				// any key pressed ?
  if(key == 0)					// if no key, check key off
    { if(key_flag == 0)
        return key;
      else
        { Delay_ms(20);
          key_flag = 0;
          return key;
        }
    }
  else						// if key input, check continuous key
    { if(key_flag != 0)				// if continuous key, treat as no key input
        return 0;
      else					// if new key, beep and delay for debounce
        { Beep();
          key_flag = 1;
          return key;
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -