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

📄 main.c

📁 ATmage8515键盘扫描程序
💻 C
字号:
/*************************************************************
 文件件:mian.c                      
 设计人员:李志双
 主要功能:    键盘扫描程序
 特殊功能:    无
*************************************************************/
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <avr/io.H>
#include <inttypes.h> 
#include <avr/interrupt.h>
#include <avr/signal.h>
/***************************************/
#define DD_MOSI 3
#define DD_MISO 4
#define DD_SCK 5
#define DD_SS 2
#define DDR_SPI DDRB
uint8_t RevData;
void delay(volatile uint16_t time)
{
	volatile uint16_t i,j;
	for( i=0;i<time;i++)
		for( j=0;j<10;j++);
}
void SPI_SlaveInit(void)
{
/* 设置MISO为输出,其他为输入 */
 DDR_SPI = (1<<DD_MISO);
 //DDR_SPI &= ~(1<<DD_MOSI);
 //DDR_SPI &= ~(1<<DD_SS);
/* 使能 SPI */
 SPCR = (1<<SPE)|(1<<CPHA)|(1<<SPIE);
 //SPCR |= (1<<CPHA);
 //SPCR|=1<<SPIE;//开中断
 SREG=0x80;
}
char SPI_SlaveReceive(void)
{
/* 等待接收结束 */
while(!(SPSR & (1<<SPIF)));
/* 返回数据 */
return SPDR;
}
ISR(SPI_STC_vect)
{
   RevData=SPDR;
}
uint8_t KeySan(void)
{
	uint8_t temp;
	uint8_t KeyValue=0xff;
	PORTD=0xe0;
	delay(1);
	temp=PINC;
	temp=~temp;
	if((temp&0x1f)!=0)
	{
		
			switch(temp&0x1f)
			{
				case 0x01:
					KeyValue=1;
					break;
				case 0x02:
					KeyValue=2;
					break;
				case 0x04:
					KeyValue= 3;
					break;
				case 0x08:
					KeyValue= 4;
					break;
				case 0x10:
					KeyValue= 5;
					break;
			}
		
	}
	PORTD=0xd0;
	delay(1);
	temp=PINC;
	temp=~temp;
	if((temp&0x1f)!=0)
	{
		
			switch(temp&0x1f)
			{
				case 0x01:
					KeyValue=6;
					break;
				case 0x02:
					KeyValue=7;
					break;
				case 0x04:
					KeyValue= 8;
					break;
				case 0x08:
					KeyValue= 9;
					break;
				case 0x10:
					KeyValue= 10;
					break;
			}
		
	}
	PORTD=0xb0;
	delay(1);
	temp=PINC;
	temp=~temp;
	if((temp&0x1f)!=0)
	{
		
			switch(temp&0x1f)
			{
				case 0x01:
					KeyValue=11;
					break;
				case 0x02:
					KeyValue=12;
					break;
				case 0x04:
					KeyValue= 13;
					break;
				case 0x08:
					KeyValue= 14;
					break;
				case 0x10:
					KeyValue= 15;
					break;
			}
		
	}
	PORTD=0x70;
	delay(1);
	temp=PINC;
	temp=~temp;
	if((temp&0x1f)!=0)
	{
			switch(temp&0x1f)
			{
				case 0x01:
					KeyValue=16;
					break;
				case 0x02:
					KeyValue=17;
					break;
				case 0x04:
					KeyValue= 18;
					break;
				case 0x08:
					KeyValue= 19;
					break;
				case 0x10:
					KeyValue= 20;
					break;
			}
	}
	return(KeyValue);
	
}
/****************************************
      主程序
****************************************/
int main(void)
{
  uint8_t tKeyValue;
  DDRB|=0x02;
  SPI_SlaveInit();
  DDRD=0xf0;//D4,D5,D6,D7为扫描线
  DDRC=0x00;//C0-C4为输入线
  while(1)
  {
	  tKeyValue=KeySan();
	  if(tKeyValue!=0xff)
		  SPDR=tKeyValue;
  }
  return 0;
}



⌨️ 快捷键说明

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