?? 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 + -