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

📄 key.c

📁 键盘扫描程序
💻 C
字号:
#include "iom16v.h"
#include "macros.h"
#include "eeprom.h"
#define	uchar unsigned char
#define	uint unsigned int
#define LCD_DAT PORTA
#define SET_RS PORTB|=0x01
#define CLR_RS PORTB&=0xFE
#define SET_EN PORTB|=0x02
#define CLR_EN PORTB&=0xFD
#define LCD_DATA_EN   PORTD&=0XFC

const uchar tab1[]="MCU";
const uchar tab2[]="FPGA";
const uchar tab3[]="(download)";
uchar tab[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
void delay_1us(void);
void delay_us(uint n);
void delay_1ms(void);
void delay_ms(uint n);
void port_init(void);
void init_lcd(void);
void new_display(void);
void wc(uchar Lcdcommand);//写LCD指令
void wd(uchar Lcddate);//写LCD数据
void wnum(uchar date,uchar location);
void sel_key(void);
void down_key(void);
void mcu_down(void);
void fpga_down(void);
uchar mcu_value;
uchar fpga_value;
uchar key_value;
uchar key_num=0;
uchar key_flag=0;

void main(void)
{ 
  //EEPROMwrite(0x20,18);
  //EEPROMwrite(0x30,18);
  mcu_value=EEPROMread(0x20);
  fpga_value=EEPROMread(0x30);
  //uchar key_value;
  delay_ms(100);//等待100ms使电压稳定
  CLI(); //disable all interrupts
  port_init();
  MCUCR = 0x00;
  GICR  = 0x00;
  TIMSK = 0x00; //timer interrupt sources
  SEI();
  init_lcd();
  delay_ms(10);           
  new_display();
  
  while(1)
   {
	key_value=PIND&0xc0;
	if(key_value!=0xc0)
	  {
	   delay_ms(15);
	   key_value=PIND&0xc0;
	   if(key_value!=0xc0)
	     {
		  while((PIND&0xc0)!=0xc0);//等待按键松开
		  switch(key_value)
			 {
			  case 0x80:key_num++;sel_key();break;
			  case 0x40:down_key();break;
			  default:break;
			 }
		   }
	    } 
   }
}   
	
void port_init(void)
	 {  	  
	  PORTA = 0x00;
 	  DDRA  = 0xFF;
 	  PORTB = 0x00;
 	  DDRB  = 0x0B;
 	  PORTC = 0x00; //m103 output only
 	  DDRC  = 0x40;
 	  PORTD = 0x00;
	  DDRD  = 0X00;
	 }

void init_lcd(void)
	{   
	 wc(0x01);      //清屏
	 wc(0x38);       //8位数据传送,两行显示,5*7
	 wc(0x03);		//输入模式设置
	 wc(0x0c);     //开显示,关光标
	 delay_ms(50);
	}

void new_display(void)
	 {
	  uchar n;
	  wc(0x80);
  	  for(n=0;n<3;n++)
      	{
	  	 wd(tab1[n]);
	 	}
  	  wnum(mcu_value,0x8e);
  
  	  wc(0xc0);
  	  for(n=0;n<4;n++)
        {
	  	 wd(tab2[n]);
	 	}
  	  wnum(fpga_value,0xce);	
  	}
	
void wc(uchar Lcdcommand)
	{
	 CLR_RS;              //select LCD command register	  
	 SET_EN;              //when EN derises,output the command
	 LCD_DATA_EN;
	 delay_us(5);
	 LCD_DAT=Lcdcommand;
	 delay_us(5);	 
	 CLR_EN;
	 delay_us(5);
	}
void wd(uchar Lcddate)
	{
 	 SET_RS;                 //select LCD data register	 
	 SET_EN;                 //when EN derises,output the data
	 LCD_DATA_EN;
	 delay_us(5);
	 LCD_DAT=Lcddate;        //LCD data
	 delay_us(5);           	 
	 CLR_EN;
	 delay_us(5);	 
	}

void wnum(uchar date,uchar location)
	{
	 uchar temp0,temp1;
	 temp0=date/10;
	 temp1=date%10;
	 wc(location);
	 wd(tab[temp0]);
	 wd(tab[temp1]);
	}

void sel_key(void)
	 {
	  uchar i;
	  switch(key_num)
	  {case 1:
	   {
	  	key_flag=1;
		wc(0x01);
		delay_1ms();
		new_display();
	   	wc(0x84);
		for(i=0;i<10;i++)
		   wd(tab3[i]);
		break;
	   }
	   case 2:
	   {
	    key_flag=2;
		 wc(0x01);
		 delay_1ms();
		 new_display();
		 wc(0xc4);
		 for(i=0;i<10;i++)
		    wd(tab3[i]);
		 key_num=0;
		 break;
		}
	   default:break;
	  }
	 }
	 
void down_key(void)
	 {
	  switch(key_flag)
	  {
	   case 1:{
			  switch(mcu_value)
			  		{
					 case 0:
					 	  {
						   mcu_value=18;
						   wnum(mcu_value,0x8e);
						   break;
						  }
					 default:
					 	  {
						   mcu_value--;
						   EEPROMwrite(0x20,mcu_value);
						   wnum(mcu_value,0x8e);
						   break;
						  }
					}
			  } 
			  delay_ms(50);
			  mcu_down();
			  key_flag=0;
			  key_num=0;
			  break;
			
	   case 2:{
			  switch(fpga_value)
			  		{
					 case 0:fpga_value=18;wnum(fpga_value,0xce);break;
					 default:fpga_value--;EEPROMwrite(0x30,fpga_value);wnum(fpga_value,0xce);break;
					}
			  } 
			  delay_ms(50);
			  fpga_down();
			  key_flag=0;
			  key_num=0;
			  break;
	   default:break;
	  }
	 }
	 
void mcu_down(void)
	 {
	  uchar i;
	  wc(0x01);
	  new_display();
	  wc(0x83);
	  for(i=0;i<11;i++)//例子效果,使用真正的下载程序代替
	    {
		 wd(0x2e);
		 delay_ms(100);
		}
	  wc(0x01);
	  new_display();
	  wc(0x86);
	  wd('D');
	  wd('O');
	  wd('N');
	  wd('E');
	  wd('!');
	  delay_ms(500);
	  wc(0x01);
	  new_display();
	 }
	 
void fpga_down(void)
	 {
	  uchar i;
	  wc(0x01);
	  new_display();
	  wc(0xc4);
	  for(i=0;i<10;i++)//例子效果,使用真正的下载程序代替
	    {
		 wd(0x2e);
		 delay_ms(100);
		}
	  wc(0x01);
	  new_display(); 
	  wc(0xc6);
	  wd('D');
	  wd('O');
	  wd('N');
	  wd('E');
	  wd('!');
	  delay_ms(500);
	  wc(0x01);
	  new_display();
	 }

//1us延时函数
void delay_1us(void)
{
	asm("nop");
}

//nus延时函数
void delay_us(uint n)
{
	uint i=0;
	for(i=0;i<n;i++)
	delay_1us();
}

//1ms延时函数
void delay_1ms(void)
{
	uint i;
	for(i=0;i<1000;i++)
	delay_1us();
}

//nms延时函数
void delay_ms(uint n)
{
	uint i;
	for(i=0;i<n;i++)
	delay_1ms();
}

⌨️ 快捷键说明

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