📄 8255+lcd矩阵键盘ok(me).c
字号:
#include<AT89X51.h>
#include<absacc.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define nop() _nop_()
#define DATA_PORT P0
#define COM8255 XBYTE[0x8003] //命令口地址
#define PA XBYTE[0x8000] //PA口地址
#define PB XBYTE[0x8001] //PB口地址
#define PC1 XBYTE[0x0002] //PC口地址 //读操作
#define PC2 XBYTE[0x8002] //PC口地址 //写操作
#define AB P2_7
/********************************************************
LCD函数声明
********************************************************/
uchar scan_key(void);
void delay(uchar n);
/********************************************************
LCD函数声明
********************************************************/
void WriteCom(uchar CMD);
void WriteDat(uchar DAT);
void Delay(uint ms);
uchar CheckBusy(void);
void Picture_Set_XY(uchar x, uchar y);
void Char_Set_XY(uchar x, uchar y, uchar *p);
void Lcd_Init(void);
void clear(void);
/********************************************************
LCD引脚定义
********************************************************/
#define RS P1_5
#define RW P1_6
#define EN P1_7
/*
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39*/
/***************************主函数*********************************/
void main(void)
{
uchar k=0;
COM8255=0x81;
Lcd_Init();
Char_Set_XY(0,0,"4*4 矩阵键盘测试");
Char_Set_XY(1,1,"--电气工程系");
Delay(5000);
clear();
Char_Set_XY(0,0,"4*4 矩阵键盘测试");
Char_Set_XY(1,1,"你按下的键是:");
while(1)
{
k=scan_key();
WriteCom(0x9e);
WriteDat((k/10)+0x30);
WriteDat((k%10)+0x30);
}
//while(1); //使程序停在此
}
/****************************键盘扫描程序区****************************/
/************************************************
键盘扫描子程序
************************************************/
uchar scan_key(void)
{
uchar i,j,temp_i,temp_j,key_value;
uchar a,b; //中间变量
temp_i=0x10;
temp_j=0x01;
//AB=1;
//AB=1;
//_nop_();
PC2=0x0f;
//AB=0;
//AB=0;
//_nop_();
a=PC1;
if(a!=0x0f)
{
Delay(15);
//AB=0;
//AB=0;
//_nop_();
a=PC1;
if(a!=0x0f)
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
b=~(temp_i<<i);
//AB=1;
// AB=1;
//_nop_();
PC2=b;
//AB=0;
//AB=0;
//_nop_();
a=PC1;
if((a&(temp_j<<j))==0)
key_value=i*4+j;
}
}
return key_value;
}
/*******************************LCD程序区****************************/
/*************************************************
初始化函数
*************************************************/
void Lcd_Init(void)
{
WriteCom(0x30); //写指令:功能设置 8位数据,基本指令
WriteCom(0x0c); //写指令:显示状态 ON,游标OFF,反白OFF
WriteCom(0x01); //写指令:清除显示
WriteCom(0x02); //写指令:地址归位
WriteCom(0x80); //写指令:设置DDRAM地址
Delay(100); //延时
}
/*************************************************
延时函数
*************************************************/
void Delay(uint ms) //延时ms毫秒
{
uchar j;
for(; ms>0; ms--)
for(j=100; j>0; j--)
{
nop();
nop();
}
}
/*************************************************
写控制字函数
*************************************************/
void WriteCom(uchar CMD)
{
while(CheckBusy()); //测忙,若忙则等待
RS = 0; //写控制字
RW = 0; //写操作
DATA_PORT = CMD;
EN = 1;
nop();
nop();
EN = 0; //下降沿写入
}
/*************************************************
写数据函数
*************************************************/
void WriteDat(uchar DAT)
{
while(CheckBusy()); //测忙,若忙则等待
RS = 1; //写数据
RW = 0; //写操作
DATA_PORT = DAT;
EN = 1;
nop();
nop();
EN = 0; //下降沿写入
}
/*************************************************
测忙函数
*************************************************/
uchar CheckBusy(void)
{
uchar temp;
DATA_PORT =0xff; //P0口置高,准备接收数据
RS = 0; //读控制字
RW = 1; //读操作
EN = 1;
nop();
nop();
temp = DATA_PORT;
nop();
nop();
EN = 0; //下降沿读入
temp &= 0x80;
return(temp); //若忙则返回1
}
/*************************************************
置x,y坐标函数——写汉字
*************************************************/
void Char_Set_XY(uchar x, uchar y, uchar *p)
{
if(y == 0)
{
WriteCom((0x80+x));
}
if(y == 1)
{
WriteCom((0x90+x));
}
if(y == 2)
{
WriteCom((0x88+x));
}
if(y == 3)
{
WriteCom((0x98+x));
}
while(*p != 0)
{
WriteDat(*p++);
}
}
/*************************************************
清屏函数
*************************************************/
void clear(void)
{
WriteCom(0x01); //写指令:清除显示
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -