📄 main.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 + -