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

📄 m.c

📁 AVR单片机控制下的实时按键显示 实验条件 ⑴ SL-AVRAD编程开发实验板 (2) AVR系列单片机ATMega16(L) (3) AVR单片机的C语言编译器WinAVR (4) AVR单片
💻 C
字号:
#define KEYPORT PORTC
#define KEYPIN PINC
//PB port as led data port
#define LED_DATA_DDR DDRB
#define LED_DATA_PORT PORTB
#define LED_DATA_PIN PINB

//PD port as led select port
#define LED_ADD_DDR DDRD
#define LED_ADD_PORT PORTD
#define LED_ADD_PIN PIND

#include <avr/io.h>
#include <inttypes.h>
#include <avr/signal.h>
#include <avr/interrupt.h>



uint8_t keyboard(void)
{
static uint8_t scancode=0xF7,tempnum=16,lastnum=16,currentnum=16,times=0;
 switch(scancode)
   {
    case 0xF7:scancode=0xFB;break;
    case 0xFB:scancode=0xFD;break;
    case 0xFD:scancode=0xFE;break;
    case 0xFE:scancode=0xF7;break;
    default:scancode=0xF7;break; 
   }
 KEYPORT=scancode;
  switch(KEYPIN)
   {
    case 0xE7:tempnum=0;times=0;break;
	case 0xD7:tempnum=1;times=0;break;
	case 0xB7:tempnum=2;times=0;break;
	case 0x77:tempnum=3;times=0;break;
	case 0xEB:tempnum=4;times=0;break;
	case 0xDB:tempnum=5;times=0;break;
	case 0xBB:tempnum=6;times=0;break;
	case 0x7B:tempnum=7;times=0;break;
	case 0xED:tempnum=8;times=0;break;
	case 0xDD:tempnum=9;times=0;break;
	case 0xBD:tempnum=10;times=0;break;
	case 0x7D:tempnum=11;times=0;break;
	case 0xEE:tempnum=12;times=0;break;
	case 0xDE:tempnum=13;times=0;break;
	case 0xBE:tempnum=14;times=0;break;
	case 0x7E:tempnum=15;times=0;break;
    default:{
	          times++;
			  if(times==4)
			   {
			   tempnum=16;
			   times=0;
			   }
			 }break;
    }
lastnum=currentnum;
currentnum=tempnum;
if(currentnum==lastnum)return(16);
else return(currentnum);
   
} 



uint8_t ledcode[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67,0x77,0x7C,0x58,0x5E,0x79,0x71};
//uint8_t ledaddr[6]={0xDF,0xEF,0xF7,0xFB,0xFD,0xFE}; //for PD port  pd5=0,


void Initi_Device(void)
{
	LED_ADD_DDR=0xFF;
	LED_ADD_PORT=0xFE;

	LED_DATA_DDR=0xFF;
	LED_DATA_PORT=0xFF;
}

SIGNAL(SIG_OVERFLOW1)
{
	static uint8_t code_num=0;
	
	code_num=keyboard();
	
	if (code_num!=16)
		LED_DATA_PORT=ledcode[code_num];

	TCNT1L=0xB2;
	TCNT1H=0xFF;
}

int main(void)
{
	Initi_Device();
	DDRC=0x0F;
	PORTC=0xFF;
	TCNT1L=0xB2;
	TCNT1H=0xFF;
	TCCR1A=0;
	TCCR1B=5;
	TIMSK=(1<<TOIE1);
	LED_ADD_PORT=0xDF;
	LED_DATA_PORT=0x3F;
	sei();
	for(;;)
		{}
}

⌨️ 快捷键说明

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