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

📄 ps2_study.c

📁 基于ps/2接口协议的键盘学习机,采用128*64LCD显示,使用单片机为,mega16
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<iom16v.h>
#include <macros.h>
#include "ps2_study_data.h"

unsigned char  data_key[3];
unsigned  char flag_1=1,flag_del=0,flag_char1=0,key_i=1,flag_a=0,flag_w=0,flag_b=0,flag_c=0,
             flag_d=0,flag_e=0,flag_f=0,flag_g=0,flag_h=0,flag_i=0,
			 flag_j=0,flag_k=0,flag_l=0,flag_n=0,flag_m=0,flag_o=0,
			 flag_p=0,flag_q=0,flag_r=0,flag_s=0,flag_t=0,flag_u=0,
			 flag_v=0,flag_ww=0,flag_x=0,flag_y=0,flag_z=0,flag_esc=0;
unsigned char y_station,rig=0,LR=0,wed1=1,flag_L_R=0,flag_error=0,
              flag_over=0,flag_rig,flag_score=0,flag_enter=0,flag_time0=0,
			  flag_cout=0,flag_ts=0;
signed char		  x_station;
unsigned int flag_ms=0;
////////////////////////////////
#define start               34;
char extern xc=start;
unsigned char const *data_num[10]={&num0[0],&num1[0],&num2[0],&num3[0],
  &num4[0],&num5[0],&num6[0],&num7[0],&num8[0],&num9[0]};

unsigned  char num_data=0,test_num=0;
unsigned char key_ok=1;
////////////////////////////////


#define data_DDR          DDRA
#define data_OUT          PORTA
#define data_in           PINA

#define COMMAND_OUT       PORTD
#define COMMAND_DDR       DDRD

#define CS1               PD2
#define CS2               PD3
#define D_I               PD4
#define R_W               PD5
#define E                 PD6

#define COMMAND_INI()     COMMAND_DDR|=0X7C 

#define SET_CS1()         COMMAND_OUT |=(1<<CS1)
#define SET_CS2()         COMMAND_OUT |=(1<<CS2)
#define SET_D_I()         COMMAND_OUT |=(1<<D_I)
#define SET_R_W()         COMMAND_OUT |=(1<<R_W)
#define SET_E()           COMMAND_OUT |=(1<<E)

#define CLR_CS1()         COMMAND_OUT &=~(1<<CS1)
#define CLR_CS2()         COMMAND_OUT &=~(1<<CS2)
#define CLR_D_I()         COMMAND_OUT &=~(1<<D_I)
#define CLR_R_W()         COMMAND_OUT &=~(1<<R_W)
#define CLR_E()           COMMAND_OUT &=~(1<<E)
    
#define BUSY              0X80
#define LCD_ON            0X3F
#define LCD_OFF           0X3E
#define DIS_X             0X40
#define DIS_Y             0XB8
#define MAX_X             0X3F
#define MAX_Y             0X07

#define LEFT			   0X00
#define RIGHT			   0X01

#define page1              0xb8
#define page2              0xb9
#define page3              0xba
#define page4              0xbb
#define page5              0xbc



///////////////////////////////////////////////////////////////
void LCD_Test(char L_R)
{
  data_DDR=0x00;
  if(L_R)
  {
    SET_CS1();
	CLR_CS2();
  }
  else 
  {
    SET_CS2();
	CLR_CS1();
  }
  CLR_D_I();
  SET_R_W();
  SET_E();
  Delaynus(2);
  while(data_in & BUSY)
      ;
    CLR_E();
	data_DDR=0XFF;

}
///////////////////////////////////////////////////////////////////

void LCD_write (unsigned char data,char L_R)
{
  LCD_Test(L_R);
  SET_D_I();
  CLR_R_W();
  SET_E();
  data_OUT=data;
  CLR_E();
}

void LCD_write_command(unsigned char data,char L_R)
{
  LCD_Test(L_R);
  CLR_D_I();
  CLR_R_W();
  SET_E();
  data_OUT=data;
  CLR_E();
}


void LCD_write_data( char x ,char y,unsigned char  data,char L_R)//设置xy地址
{
  LCD_Test(L_R);
  x=DIS_X | (x & MAX_X);
  y=DIS_Y | (y & MAX_Y);
 //x=x | 0x40;
 //y=y |0xb8;
  if(L_R)
  {
    SET_CS1();
	CLR_CS2();
  }
  else
  {
    SET_CS2();
	CLR_CS1();
  }
  LCD_write_command(x,L_R);//设置x,y的地址
  LCD_write_command(y,L_R);
  //LCD_write(data,L_R);
}

//////////////////////////////


void LED_ini(void)
{
  char i,j;
  COMMAND_INI();
  
  data_DDR=0XFF;
  LCD_write_command(LCD_OFF,LEFT);
  LCD_write_command(LCD_OFF,RIGHT);
  LCD_write_command(LCD_ON,LEFT);
  LCD_write_command(LCD_ON,RIGHT);
  LCD_write_command(0xc0,LEFT);
  LCD_write_command(0xc0,RIGHT);
}
void LCD_clear(void)
{
 char i, j;
 for (i = 0; i < MAX_Y + 1; i++)
 {
  LCD_write_page(0, i, MAX_X, 0x00, LEFT, 0);
  LCD_write_page(0, i, MAX_X, 0x00, RIGHT, 0);
 } 
}

void LCD_write_page(char x, char y, unsigned char end, unsigned char data, char L_R, char over)
{
 char i;
 if (over == 0)
 {
  LCD_write_data(x, y, data, L_R);
  for (i = 0; i < end - x+1; i++)
  {
   LCD_write(data, L_R);
  }
 }
 else 
 {
  LCD_write_data(x, y, ~data, L_R);
  for (i = 0; i < end - x; i++)
  {
   LCD_write(~data, L_R);
  }
 }
}


////////////////////////////////////////////////////////////////////////////
void Delaynus(unsigned int k)
{
  char i, j, m;
 for (m = 0; m < 8; m++)
 {
  for (i = 0; i < k; i++)
  {
   //for (j = 0; j < 150; j++);
   ;
  }
 }
}
//////////////////////////////////////////////////////
void Delaynms(unsigned int k)
{
  char i, j, m;
 for (m = 0; m < 8; m++)
 {
  for (i = 0; i < k; i++)
  {
   for (j = 0; j < 150; j++);
  
  }
 }
}
//////////////////////////////////

void Delay_key(unsigned char k)
{
 unsigned char i, j, m;
 for (i = 0; i < k; i++)
 {
  for (j = 0; j < 8; j++)
  {
   for (m = 0; m < 150; m++);
  }
 }
}



void LCD_China(char x, char y, unsigned char const *data, char L_R)
{
  char i;
  LCD_write_data(x, y, *data, L_R);
  for (i = 0; i < 16; i++)
  {
   LCD_write(*(data + i), L_R);
  }
 
  LCD_write_data(x, y + 1, *(data + 16), L_R);
  for (i = 16; i < 32; i++)
  {
  LCD_write(*(data + i), L_R);
    

  }
}
///////////////////////////////////////////////
void LCD_China_ini(char x, char y, unsigned char const *data, char L_R)
{

  char i,j,p=0;
  LED_ini();
  for(j=0;j<4;j++)
  {
    
    LCD_write_data(x, y+j, *(data+p), L_R);
	
	for (i = p; i < p+32; i++)
    {
      LCD_write(*(data + i), L_R);
    }
	p=p+32;
  }
}
//////////////////////////////////////////////////////////////////////
void LCD_char(char x,char y,unsigned char const *data,char L_R)
{
  char i;
  LCD_write_data(x, y, *data, L_R);
  for (i = 1; i < 8; i++)
  {
   LCD_write(*(data + i), L_R);
  }
 
  LCD_write_data(x, y + 1, *(data + 8), L_R);
  for (i = 9; i < 16; i++)
  {
  LCD_write(*(data + i), L_R);
  }
}


/*void LCD_pic(char x,char y,unsigned char const *data,char L_R)
{
  int i,j;
   int p=0;
  LED_ini();
  for(j=0;j<8;j++)
  {
    
    LCD_write_data(x, y+j, *(data+p), L_R);
	
	for (i = p; i < p+64; i++)
    {
      LCD_write(*(data + i), L_R);
    }
	p=p+64;
  }
  
}*/
/////////////////////////////////////////////////////////////
void return_last(unsigned char n)
{
  LCD_China(0,n,fan,0);
  LCD_China(17,n,hui,0);
  LCD_China(33,n,qing3,0);
  LCD_China(49,n,an,0);
  LCD_char(20,n,EE,1);
  LCD_char(28,n,s,1);
  LCD_char(36,n,c,1);
}
//////////////////////////////////////////////////////////////////////////

void Meu_ini(void)
{
  char i=0;
  LCD_write_command(0xc0, 0);//初始化x,y地址
  LCD_write_command(0xc0, 1);//初始化x,y地址
  LCD_China_ini(0,4,zhao,0);
  LCD_China_ini(32,4,qing,0);
  LCD_China_ini(0,4,xue,1);
  LCD_China_ini(32,4,yuan,1);
  
  while (17 != i)
 {
  Delaynms(90);
  LCD_write_command(0Xc0 | i, 0);
  LCD_write_command(0Xc0 | i, 1);
  i++;
 }
 LCD_China(1,8,dian,0);
 LCD_China(22,8,zhi,0);
 LCD_China(43,8,xin,0);
 LCD_China(1,8,xi,1);
 LCD_China(22,8,gong,1);
 LCD_China(43,8,cheng,1);
 while (32!= i)
 {
  Delaynms(90);
  LCD_write_command(0Xc0 | i, 0);
  LCD_write_command(0Xc0 | i, 1);
  i++;
 }
 LCD_China(40,10,cai,0);
 LCD_China(0,10,chu,1);
 LCD_China(23,10,bin,1);
 i = 24;
 while (i--)
 {
  Delaynms(90);
 }
 LCD_clear();
 LCD_write_command(0Xc0, 0);
 LCD_write_command(0Xc0, 1);
 
}
//////////////////////////////////////////////////////
void usart_init(void)
{
UCSRB=0X00;
  UCSRC=(1<<URSEL)|(1<<UMSEL)|(1<<UPM0)|(1<<UPM1)|(3<<UCSZ0);
  //UCSRC=BIT(URSEL)|0x06|(1<<UPM1)|(1<<UPM0);//设置数据位数
  ///UBRRH=0x33;//set band
  //UBRRL=0X00;
  UBRRH=0x00;//set band
  UBRRL=0X27;
  UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);//数据接收和发送允许,接收完成中断允许
//SEI();
}
void time0_init(void)
{
  //TCCR0=(1<<CS00);//8分频
  TCCR0=0x00;//8分频
  TCNT0=0X38;
  TIMSK=(1<<TOIE0);
}
////////////////////////////////
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
 flag_time0++;
 if(flag_time0==5)
 {
   flag_time0=0;
   flag_ms++;
   if(flag_ms==1000)
   {
     flag_ms=0;
     flag_ts++;
   }
 }
 TCNT0 = 0x38;//reload counter value
}
/////////////////////////////////////////////////////
void char_display(void)
{
  if(flag_char1==1)
  {
    LCD_clear();
  LCD_char(9,0,b,0);
   LCD_char(27,0,d,0);
   LCD_char(36,0,e,0);
   LCD_char(54,0,g,0);
   LCD_char(9,4,i,0);
   LCD_char(18,4,j,0);
   LCD_char(36,4,l,0);
   LCD_char(54,4,m,0);
   LCD_char(9,0,p,1);
   LCD_char(18,0,q,1);
   LCD_char(27,0,r,1);
   LCD_char(45,0,t,1);
   LCD_char(54,0,u,1);
   LCD_char(9,4,w,1);
   LCD_char(18,4,x,1);
   LCD_char(27,4,y,1);
  if(wed1==2)
   {
 
   LCD_char(0,0,c,0);
   //LCD_char(9,0,b,0);
   LCD_char(18,0,f,0);
  // LCD_char(27,0,d,0);
   //LCD_char(36,0,e,0);
   LCD_char(45,0,a,0);
  // LCD_char(54,0,g,0);
   LCD_char(0,4,v,0);
  // LCD_char(9,4,i,0);
   //LCD_char(18,4,j,0);
   LCD_char(27,4,h,0);
   //LCD_char(36,4,l,0);
   LCD_char(45,4,o,0);
   //LCD_char(54,4,m,0);
   LCD_char(0,0,n,1);
  // LCD_char(9,0,p,1);
  // LCD_char(18,0,q,1);
  // LCD_char(27,0,r,1);
   LCD_char(36,0,k,1);
  // LCD_char(45,0,t,1);
  // LCD_char(54,0,u,1);
   LCD_char(0,4,s,1);
  // LCD_char(9,4,w,1);
  // LCD_char(18,4,x,1);
  // LCD_char(27,4,y,1);
   //LCD_char(36,4,z,1);
   //LCD_char(45,4,o,1);
  // LCD_char(54,4,x,1);
   //LCD_char(0,4,v,1);
   flag_char1=0;
   flag_w=1;
   }
   if(wed1==1)
   {
     LCD_char(0,0,z,0);
  // LCD_char(9,0,b,0);
   LCD_char(18,0,s,0);
   //LCD_char(27,0,d,0);
  // LCD_char(36,0,e,0);
   LCD_char(45,0,n,0);
  // LCD_char(54,0,g,0);
   LCD_char(0,4,o,0);
  // LCD_char(9,4,i,0);
  // LCD_char(18,4,j,0);
   LCD_char(27,4,v,0);
  // LCD_char(36,4,l,0);
   LCD_char(45,4,f,0);
 //  LCD_char(54,4,m,0);
   LCD_char(0,0,h,1);
  // LCD_char(9,0,p,1);
  // LCD_char(18,0,q,1);
   //LCD_char(27,0,r,1);
   LCD_char(36,0,c,1);
  // LCD_char(45,0,t,1);
  // LCD_char(54,0,u,1);
   LCD_char(0,4,k,1);
  // LCD_char(9,4,w,1);
  // LCD_char(18,4,x,1);
  // LCD_char(27,4,y,1);
   //LCD_char(36,4,z,1);
   //LCD_char(45,4,o,1);
  // LCD_char(54,4,x,1);
   //LCD_char(0,4,v,1);
   flag_char1=0;
   flag_w=1;
   }
  }
  wed1++;
  if(wed1==3)
  {
   wed1=1;
  }
  
}



void key(void)
{
   if(data_key[key_i-1]==0x5a)//enter
    {
	 if(flag_enter==1)
	 {
	  TCCR0=0x00;
	  flag_score=1;
	  flag_over=1;
	  //flag_enter=0;
	  flag_char1=0;
	  
	 }
	 if(flag_enter==0)
	 {
	 flag_1=0;
     flag_char1=1;
	 x_station=0;
	 y_station=2;
	 flag_error=0;
	 flag_over=0;
	 LR=0;
	 rig=0;
	 key_i=1;
	 flag_enter=1;
	 char_display();
	 flag_ts=0;
     flag_cout=0;
     flag_ms=0;
     flag_time0=0;
	  TCNT0=0X38;
	 TCCR0=(1<<CS01);//8分频
	 }
	 data_key[1]=0;
	  data_key[2]=0;
	  
	}
	
	if((data_key[key_i-1]==0x76)&(flag_w==1))//esc
	{
	  //if(data_key[3]==0xe0)
	  {
	  flag_esc=1;
	  flag_1=0;
      flag_char1=1;
	  x_station=0;
	  y_station=2;
	  flag_error=0;
	  flag_over=0;
	  flag_score=0;
	  LR=0;
	  rig=0;
	  char_display();
	  key_i=1;
	  flag_ts=0;
      flag_cout=0;
      flag_ms=0;
      flag_time0=0;
	   TCNT0=0X38;
	  TCCR0=(1<<CS01);//8分频
	  }
	}
	if(flag_over==0)
	{
	if((data_key[key_i-1]==0x71)&(flag_w==1))///del
	{
	  //if(data_key[3]==0xe0)
	  {
	  flag_del=1;
	  key_i=1;
	  }
	}
	if((data_key[key_i-1]==0x1c)&(flag_w==1))///a
	{
	  flag_a=1;
	  flag_cout++;
	  key_i=1;
	}
	if((data_key[key_i-1]==0x32)&(flag_w==1))///b
	{
	  flag_b=1;
	  flag_cout++;
	  key_i=1;
	}
	if((data_key[key_i-1]==0x21)&(flag_w==1))///c
	{
	  flag_c=1;
	  flag_cout++;
	  key_i=1;
	}
	if((data_key[key_i-1]==0x23)&(flag_w==1))///d
	{
	  flag_d=1;
	  flag_cout++;
	  key_i=1;
	}
	if((data_key[key_i-1]==0x24)&(flag_w==1))///e
	{
	  flag_e=1;
	  flag_cout++;
	  key_i=1;
	}
	if((data_key[key_i-1]==0x2b)&(flag_w==1))///f
	{
	  flag_f=1;
	  flag_cout++;
	  key_i=1;
	}
	if((data_key[key_i-1]==0x34)&(flag_w==1))///g
	{
	  flag_g=1;
	  flag_cout++;
	  key_i=1;
	}
	if((data_key[key_i-1]==0x33)&(flag_w==1))///h
	{
	  flag_h=1;
	  flag_cout++;
	  key_i=1;
	}
	if((data_key[key_i-1]==0x43)&(flag_w==1))///i
	{
	  flag_i=1;
	  flag_cout++;
	key_i=1;
	}
	if((data_key[key_i-1]==0x3b)&(flag_w==1))///j
	{
	  flag_j=1;
	  flag_cout++;
	 key_i=1;
	}
	if((data_key[key_i-1]==0x42)&(flag_w==1))///k
	{
	  flag_k=1;
	  flag_cout++;
	 key_i=1;
	}
	if((data_key[key_i-1]==0x4b)&(flag_w==1))///l
	{
	  flag_l=1;
	  flag_cout++;
	 key_i=1;
	}
	if((data_key[key_i-1]==0x31)&(flag_w==1))///n
	{
	  flag_n=1;
	  flag_cout++;
	 key_i=1;
	}
	if((data_key[key_i-1]==0x3a)&(flag_w==1))///m
	{
	  flag_m=1;
	  flag_cout++;
	 key_i=1;
	}
	if((data_key[key_i-1]==0x44)&(flag_w==1))///o
	{
	  flag_o=1;
	  flag_cout++;
	 key_i=1;
	}
	if((data_key[key_i-1]==0x4d)&(flag_w==1))///p
	{
	 flag_p=1;
	 flag_cout++;
	 key_i=1;
	}
	if((data_key[key_i-1]==0x15)&(flag_w==1))///q
	{
	  flag_q=1;
	  flag_cout++;
	 key_i=1;
	}
	if((data_key[key_i-1]==0x2d)&(flag_w==1))///r
	{
	  flag_r=1;
	  flag_cout++;
	 key_i=1;
	}
	if((data_key[key_i-1]==0x1b)&(flag_w==1))///s
	{
	  flag_s=1;
	  flag_cout++;
	 key_i=1;
	}
	if((data_key[key_i-1]==0x2c)&(flag_w==1))///t
	{
	  flag_t=1;
	  flag_cout++;
	 key_i=1;
	}
	if((data_key[key_i-1]==0x3c)&(flag_w==1))///u
	{
	  flag_u=1;
	  flag_cout++;
	 key_i=1;
	}
	if((data_key[key_i-1]==0x2a)&(flag_w==1))///v
	{
	  flag_v=1;
	  flag_cout++;
	 key_i=1;
	}
	if((data_key[key_i-1]==0x1d)&(flag_w==1))///ww
	{
	  flag_ww=1;
	  flag_cout++;
	 key_i=1;
	}
	if((data_key[key_i-1]==0x22)&(flag_w==1))///x
	{
	  flag_x=1;
	  flag_cout++;
	 key_i=1;
	}
	if((data_key[key_i-1]==0x35)&(flag_w==1))///y

⌨️ 快捷键说明

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