📄 main.c
字号:
#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 + -