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

📄 main.c

📁 在AT89S52上写的一个扫雷程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <reg51.h>
#include <intrins.h>
#include <absacc.h>
#include <stdlib.h>
#include <string.h>
#include "table.h"

/*---lcd driver.c----*/
/*-----------------------------------------------------*/
/*                定义LCD引脚                          */
/*-----------------------------------------------------*/
#define RS P1_0  /*RS为寄存器选择信号,RS=0时,为命令或状态寄存器;RS=1时,为数据寄存器*/
#define RW P1_1  /*RW为读写控制信号,RW=0时,为写状态;RS=1时,为读状态*/ 
#define E  P1_2  /*芯片的使能信号*/
#define CS1 P1_4 /*左屏幕的选择信号*/
#define CS2 P1_5 /*右屏幕的选择信号*/
#define com8255 XBYTE[0xff2b] /*扩展口8255的命令端口地址*/
#define Data XBYTE[0xff28]    /*用8255的PA口做为LCD的数据接口*/
/*-----------------------------------------------------*/
/*                 延时模块                            */
/*-----------------------------------------------------*/
void Delay400Ms(void) small
{
	unsigned char TempCycA = 5;/*改变TempCycA、TempCycB的值,可改变延时时间*/
	unsigned int TempCycB;
	while(TempCycA--)
		{
			TempCycB=7269;
			while(TempCycB--);
		};
}

/*-----------------------------------------------------*/
/*          状态检查函数,判断是否处于忙状态              */
/*-----------------------------------------------------*/
void  CheckState() small
{
 	RS=0;  
 	RW=1;  
 	do
 	{
 	     E=1; /*如频率太高可以多加几个,以便读出数据*/
            E=1;
            E=1;
            E=1;          
        }
 	while (Data&0x80);/*检查状态寄存器的最高为是否为高,为高就表示忙,继续等待变低*/
}

/*-----------------------------------------------------*/
/*        写显示数据   形参dat:显示数据                 */
/*-----------------------------------------------------*/
void WriteByte(unsigned char dat) small
{
 	CheckState();/*写前先检查LCD是否忙*/
 	RS=1;
 	RW=0; /*写入数据*/
  	Data=dat;
 	E=1;
       E=1;
       E=1;
       E=1;
 	E=0;  /*下降沿时写入数据*/
}

/*-----------------------------------------------------*/
/*         向LCD发送命令  形参command :命令             */
/*-----------------------------------------------------*/
void SendCommandToLCD(unsigned char command) small
{
	CheckState();
	RS=0;
 	RW=0;              
	Data=command;
	E=1;
       E=1;
            E=1;
            E=1;
 	E=0;
}

/*----------------------------------------------------*/
/*           设定行地址(页)--X 0-7                     */
/*----------------------------------------------------*/
void SetLine(unsigned char line) small
{
line=line & 0x07; 	  	    /* 0<=line<=7*/
line=line|0xb8;	   	  	    /*1011 1xxx*/
SendCommandToLCD(line);
}

/*----------------------------------------------------*/
/*           设定列地址--Y 0-63                       */
/*----------------------------------------------------*/
void SetColumn(unsigned char column) small
{
column=column &0x3f; 		 /* 0=<column<=63*/
column=column | 0x40; 		 /*01xx xxxx*/
SendCommandToLCD(column);
}

/*----------------------------------------------------*/
/*           设定显示开始行--XX                        */
/*----------------------------------------------------*/
void SetStartLine(unsigned char startline) small /*0--63*/
{
startline=startline & 0x07;              /*??0x3f*/
startline=startline|0xc0; 		 /*1100 0000*/
SendCommandToLCD(startline);
}

/*----------------------------------------------------*/
/*                开关显示                             */
/*----------------------------------------------------*/
void SetOnOff(unsigned char onoff) small
{
onoff=0x3e | onoff; 
SendCommandToLCD(onoff);
}

/*----------------------------------------------------*/
/*                清除内存                            */
/*----------------------------------------------------*/
void Clr_Scr() small
{
 	unsigned char j,k;
 	CS1=1;
       CS2=1;       /*左右屏同时选通*/
 	SetLine(0);
 	SetColumn(0);
 	for(k=0;k<8;k++)
 	{
 	 	SetLine(k);       /*第K页*/
 	 	for(j=0;j<64;j++)
    	WriteByte(0x00);
 	}
}

/*----------------------------------------------------*/
/*                 初始化LCD屏                         */
/*----------------------------------------------------*/
void init_lcd() small
{

 	CS1=1;
       CS2=1;                 /*左右屏同时选通*/
 	SetOnOff(0x3f);	   /*关显示*/
 	SetLine(0x00);         /* 设定页*/
 	SetStartLine(0x00);
 	SetColumn(0x00);
 	SetOnOff(0x3f);       /*开显示*/
}

/*----------------------------------------------------*/
/*说明:12864液晶横放,汉字按正常方式显示,pag:0~7;      */
/*	  row:0~7(从左到右,水平行,一行可显示8个汉字)      */
/*功能:指定位置显示汉字16*16                           */
/*----------------------------------------------------*/
void word_disp(unsigned char pag,unsigned char row, unsigned int code  *hzk) small
{
 	unsigned char j=0,i=0,k=0;
 	for(j=0;j<2;j++)
 	{
	 	if (row <4)
	 	{
			k=row;
			CS1=1;
                     CS2=0;       /*左屏幕显示*/

		}
		else
		{
			k = row-4;
			CS1=0;
                     CS2=1;       /*右屏幕显示*/
		}
  		SetLine(pag+j);
  		SetColumn(k*16);
  		for(i=0;i<16;i++)
    	{
     		WriteByte(hzk[16*j+i]);
		}
 	}
}

/*----------------------------------------------------*/
/*说明:12864液晶横放,字符按正常方式显示,pag:0~7;      */
/*	  row:0~15(从左到右,水平行,一行可显示16个字符)   */
/*功能:指定位置显示字符8*16                            */
/*----------------------------------------------------*/
void byte_disp(unsigned char pag, unsigned char row, unsigned int code  *bytek) small
{
 	unsigned char j=0,i=0,k=0;
 	for(j=0;j<2;j++)
 	{
		if (row < 8)
		{
			k=row;
			CS1=1;
                     CS2=0;       /*左屏幕显示*/
		}
		else
		{
			k=row-8;
			CS1=0;
                     CS2=1;       /*右屏幕显示*/

		}
  		SetLine(pag+j);
 	 	SetColumn(k*8);
  		for(i=0;i<8;i++)
    	{
     		WriteByte(bytek[8*j+i]);
		}
 	}
}

/*----------------------------------------------------*/
/*说明:12864液晶横放,图形按正常方式显示,pag:0~7;      */
/*	  row:0~15(从左到右,水平行,一行可显示16个小图片)   */
/*功能:指定位置显示图片8*8                            */
/*----------------------------------------------------*/
void photo_disp(unsigned char pag, unsigned char row, unsigned int code  *photo) small
{
 	unsigned char i=0,k=0;

		if (row < 8)
		{
			k=row;
			CS1=1;
                     CS2=0;       /*左屏幕显示*/
		}
		else
		{
			k=row-8;
			CS1=0;
                     CS2=1;       /*右屏幕显示*/
		 }

  		SetLine(pag);
 	 	SetColumn(k*8);
  		for(i=0;i<8;i++)
    	        {
     		   WriteByte(photo[i]);
		  }
 }


/*----------------------------------------------------*/
/*功能:指定位置显示图片1*8长条                         */
/*----------------------------------------------------*/
void now_disp(unsigned char pag, unsigned char row, unsigned int code  *photo) small
{
 	unsigned char i=0,k=0;

		if (row < 8)
		{
			k=row;
			CS1=1;
                     CS2=0;       /*左屏幕显示*/
		}
		else
		{
			k=row-8;
			CS1=0;
                     CS2=1;       /*右屏幕显示*/
		 }

  		SetLine(pag);
 	 	SetColumn(k*8+7);
     		WriteByte(photo[0]);
		
 }

/*----------------------------------------------------*/
/*说明:全屏幕显示子程序                                */
/*功能:直接显示一幅128*64的BMP图片                     */
/*----------------------------------------------------*/
void  bmp_disp(unsigned int code  *bmp) small
 { 	unsigned char j,k,i;
 	CS1=1;
       CS2=0;       /*CS1=1,CS2=0 先写左屏幕*/
 	SetLine(0);
 	SetColumn(0);
 	for(k=0;k<8;k++)
 	{      SetLine(k); /*第K页*/ 
             for(i=0;i<8;i++)
             {   SetColumn(i*8);   /*第I列*/
 	 	  for(j=0;j<8;j++)
    	         WriteByte(bmp[k*128+i*8+j]);
              }
 	}

       CS1=0;
       CS2=1;       /*CS1=0,CS2=1 后写右屏幕*/
 	SetLine(0);
 	SetColumn(0);
 	for(k=0;k<8;k++)
 	{     SetLine(k); /*第K 行*/ 
             for(i=0;i<8;i++)
             {   SetColumn(i*8);   /*第I页*/
 	 	  for(j=0;j<8;j++)
    	         WriteByte(bmp[k*128+i*8+j+64]);
              }
 	}
    }

/*------pskey.c-------*/
/*-----------------------------------------------------*/
/*                定义PS/2引脚和一些参数                */
/*-----------------------------------------------------*/
#define Key_CLK  INT1 /*P3_3为外部中断1的输入端,作为PS/2的时钟线*/   
#define Key_data T0   /*P3_4为普通IO口,作为PS/2的数据线*/

static unsigned char data	IntNum = 0;/*中断次数*/ 
static unsigned char data	KeyV; /*接受到PS/2键盘发送来的数据编码*/
static unsigned char data	DisChar;/*通过查表得到的ASCII码*/
static unsigned char data	Key_UP=0, Shift = 0;/*按键是否放开,Shift是否按下*/
static unsigned char data	BF = 0;/*是否接收到一个完整的数据编码*/
//#define ENTER p
//#define UP w
//#define DOWN s
//#define LEFT a
//#define RIGHT d
//#define ESC e
//#define SPACE u
//#define LOWERF f
//#define UPPERF F
//#define LOWERA o
//#define UPPERA O
//#define LOWERQ q
//#define UPPERQ Q

/*-----------------------------------------------------------*/
/*                    INT1中断程序                            */
/*-----------------------------------------------------------*/
void Keyboard_out(void) small interrupt 2 
{
	if ((IntNum > 0) && (IntNum < 9)) /*从发送来的信号中提取数据*/
		{			
		       KeyV = KeyV >> 1;
		   if (Key_data) KeyV = KeyV | 0x80; 
		 }
	IntNum++;

while(!Key_CLK);/*等到时钟变为低电平*/

	if (IntNum > 10)
		{
		     IntNum = 0; 
	   	     BF = 1;/*一个数据编码接收完毕*/
		     EA = 0;/*关INT1中断*/
		 }
}


/*-----------------------------------------------------------*/
/*                    解码程序                                */
/*-----------------------------------------------------------*/
void Decode(unsigned char	ScanCode) small
{
unsigned char data	TempCyc;	

if (!Key_UP)  
 {
	switch (ScanCode)
		{
			case 0xF0 :	/*按键放开时发送来的断码的第一个字节*/
				Key_UP = 1;DisChar=0;
			break;

			case 0x12 :	/*判断Shift是否有被按下*/
				Shift = 1;
			break;

			case 0x59 :
				Shift = 1;
			break;

			default:						
				if(!Shift)/*没有按下Shift键时,得到其ASCII码*/
					{
						for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); 
						if (UnShifted[TempCyc][0] == ScanCode) 
                                           {
                                                 DisChar=UnShifted[TempCyc][1];
                                                 break;
                                            }
					}

				else /*按下Shift键时,得到其ASCII码*/
					{
						for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++);
						if (Shifted[TempCyc][0] == ScanCode) 
                                           {
                                                 DisChar=Shifted[TempCyc][1];
                                                 break;
                                            }
					}

		      break;
		}
}
else/*对于断码只判断Shift键是否放开,其他的不判断*/
    {	
	Key_UP = 0;
	switch (ScanCode)
		{
			case 0x12 :
				Shift = 0;
			break;

			case 0x59 :
				Shift = 0;
			break;
		}DisChar=0;
      }
BF = 0;
} 

/*-----------------------------------------------------------*/
/*                    取得控制的几个按键                      */
/*-----------------------------------------------------------*/
unsigned char  getKey(void) small
{ 
while(1){			
     if (BF)
        {Decode(KeyV);break;}
     else				
        EA = 1;}
switch(DisChar){

⌨️ 快捷键说明

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