📄 lcdkey.txt
字号:
#include <reg51.h>
#include "LCDKEY.h"
void LCD_Send_Byte(const uchar, const bit) ;
void LCD_SetDDRAM(uchar);
void LCD_Delay(void);
void LCD_Updata(void);
char LCD_data_G[LCD_LINES][LCD_CHARACTERS+1];
#define OSC_FREQ (12000000UL)
#define OSC_PER_INST (12)
void Hardware_Delay_T0(uint N)//延迟Nus
{
#define PRELOAD01 (65536 - (uint)(OSC_FREQ / (OSC_PER_INST * 20000)))
#define PRELOAD01H (PRELOAD01 / 256)
#define PRELOAD01L (PRELOAD01 % 256)
uint us;
TMOD &= 0xF0;
TMOD |= 0x01;
ET0 = 0;
for (us = 0; us < N; us++)
{
TH0 = PRELOAD01H;
TL0 = PRELOAD01L;
TF0 = 0;
TR0 = 1;
while (TF0 == 0);
TR0 = 0;
}
}
void LCD_Send_Byte(const uchar DATA, const bit DATA_FLAG) //发送字节
{
LCD_D4 = 0;
LCD_D5 = 0;
LCD_D6 = 0;
LCD_D7 = 0;
LCD_RS = DATA_FLAG;
LCD_EN = 0;
LCD_Delay();
LCD_D4 = ((DATA & 0x10) == 0x10);
LCD_D5 = ((DATA & 0x20) == 0x20);
LCD_D6 = ((DATA & 0x40) == 0x40);
LCD_D7 = ((DATA & 0x80) == 0x80);
LCD_Delay();
LCD_EN = 1;
LCD_Delay();
LCD_EN = 0;
LCD_Delay();
LCD_D4 = 0;
LCD_D5 = 0;
LCD_D6 = 0;
LCD_D7 = 0;
LCD_RS = DATA_FLAG;
LCD_EN = 0;
LCD_Delay();
LCD_D4 = ((DATA & 0x01) == 0x01);
LCD_D5 = ((DATA & 0x02) == 0x02);
LCD_D6 = ((DATA & 0x04) == 0x04);
LCD_D7 = ((DATA & 0x08) == 0x08);
LCD_Delay();
LCD_EN = 1;
LCD_Delay();
LCD_EN = 0;
LCD_Delay();
}
void LCD_SetDDRAM(uchar ADDRESS) //设置DDRAM的地址
{
ADDRESS |= 0x80;
LCD_Send_Byte(ADDRESS,0);
}
// Set cursor to a defined place
void LCD_Control_Cursor(const bit VISIBLE, const bit BLINKING,
uchar X, uchar Y)
{
uchar Command = 0x0C;
uchar ADDRESS;
if (VISIBLE)
{
Command |= 0x02;
}
if (BLINKING)
{
Command |= 0x01;
}
LCD_Send_Byte(Command,0);
switch(X)
{
case 0: ADDRESS=0x80; break;
case 1: ADDRESS=0x90; break;
case 2: ADDRESS=0x88; break;
case 3: ADDRESS=0x98; break;
default:break;
}
ADDRESS=Y+ADDRESS;
LCD_SetDDRAM(ADDRESS);
}
void LCD_Delay(void)
{
int x;
x++;
x++;
x++;
}
void DisplaceOneWord(uchar X,uchar Y,uint W) //在指定坐标显示汉字
{
uchar Disp_A, A_H;
switch(X)
{
case 0: A_H=0x80; break;
case 1: A_H=0x90; break;
case 2: A_H=0x88; break;
case 3: A_H=0x98; break;
default:break;
}
Disp_A=Y+A_H;
LCD_SetDDRAM(Disp_A);
LCD_Send_Byte(((W&0xff00)>>8)&0xff,1);
LCD_Send_Byte(W&0xff,1);
}
void LCD_Init(void)
{
uchar loop;
Hardware_Delay_T0(10);
// 设置端口
LCD_D4 = 1;
LCD_D5 = 1;
LCD_D6 = 1;
LCD_D7 = 1;
LCD_RS = 1;
LCD_EN = 1;
Hardware_Delay_T0(10);
LCD_RS = 0;
LCD_EN = 0;
Hardware_Delay_T0(100);
// 发送三次
for (loop = 0; loop < 3; loop++)
{
// 4-bit总线 2行 5*8点阵
LCD_Send_Byte(0x20,0);
Hardware_Delay_T0(1);
}
LCD_Send_Byte(0x08,0);
Hardware_Delay_T0(1);
LCD_Send_Byte(0x01,0);
Hardware_Delay_T0(1);
LCD_Control_Cursor(0,0,0,0);
Hardware_Delay_T0(1);
// 清屏
LCD_Send_Byte(0x01,0);
Hardware_Delay_T0(1);
LCD_Send_Byte(0x06,0);
Hardware_Delay_T0(1);
LCD_Send_Byte(0x0C,0);
Hardware_Delay_T0(1);
}
void Clear_Line(uint a) //清除显示
{
DisplaceOneWord(a,0,0xa1a0);
DisplaceOneWord(a,1,0xa1a0);
DisplaceOneWord(a,2,0xa1a0);
DisplaceOneWord(a,3,0xa1a0);
DisplaceOneWord(a,4,0xa1a0);
DisplaceOneWord(a,5,0xa1a0);
DisplaceOneWord(a,6,0xa1a0);
DisplaceOneWord(a,7,0xa1a0);
}
uint KeyDown(void)
{
col1=0; col2=0; col3=0; col4=0; // 列线全部置低
if((row1==0) || (row2==0) || (row3==0) || (row4==0)) // 若有任一行线读回状态为低
{
Hardware_Delay_T0(2); // 延时消抖
if((row1==0) || (row2==0) || (row3==0) || (row4==0)) // 再次读行线状态,若有任一行线读回状态为低
return 1; // 返回1,表明有键盘按下
else
return 0; // 返回0,表明无键盘按下
}
else
return 0;
}
/********************************************************************************************
* 函数名称:KeyNum()
* 功 能:检测用户按下的键盘所对应的键盘号
* 入口参数:无
* 出口参数:返回0表示没有键盘被按动,返回1~16对应被按动的键盘
* 说 明:用户可根据自己的键盘编号修改该函数。
*********************************************************************************************/
uint KeyNum(void)
{
uint KeyTemp;
KeyTemp=0;
if(KeyDown()==1) // 若键盘被按下
{
col1=0; col2=1; col3=1; col4=1; // 将列线1置低,其他列线置高
if (row1==0) KeyTemp=0; // 若行线1读回状态为低,则表明按键1被按下
if (row2==0) KeyTemp=1; // 若行线2读回状态为低,则表明按键5被按下
if (row3==0) KeyTemp=2; // 若行线3读回状态为低,则表明按键9被按下
if (row4==0) KeyTemp=3; // 若行线4读回状态为低,则表明按键13被按下
col1=1; col2=0; col3=1; col4=1; // 将列线2置低,其他列线置高
if (row1==0) KeyTemp=4; // 若行线1读回状态为低,则表明按键2被按下
if (row2==0) KeyTemp=5; // 若行线2读回状态为低,则表明按键6被按下
if (row3==0) KeyTemp=6; // 若行线3读回状态为低,则表明按键10被按下
if (row4==0) KeyTemp=7; // 若行线4读回状态为低,则表明按键14被按下
col1=1; col2=1; col3=0; col4=1;
if (row1==0) KeyTemp=8;
if (row2==0) KeyTemp=9;
if (row3==0) KeyTemp=10;
if (row4==0) KeyTemp=11;
col1=1; col2=1; col3=1; col4=0;
if (row1==0) KeyTemp=12;
if (row2==0) KeyTemp=13;
if (row3==0) KeyTemp=14;
if (row4==0) KeyTemp=15;
return KeyTemp; // 返回被按下并被释放的键盘的编号
}
else
return 0;
}
void Key_Displace(void)
{
static int D=-1;
static uint L=0;
static uint N=0;
uint HEX=0xa3b0;
switch(KeyNum()){
case 7: DisplaceOneWord(0,0,0xbba2);
DisplaceOneWord(0,1,0xa3b0);
DisplaceOneWord(0,2,0xa3b0);
DisplaceOneWord(0,3,0xa3b0);
break;
case 8: DisplaceOneWord(1,0,0xcdc3);
DisplaceOneWord(1,1,0xa3b0);
DisplaceOneWord(1,2,0xa3b0);
DisplaceOneWord(1,3,0xa3b0);
break;
case 9: DisplaceOneWord(2,0,0xc2ed);
DisplaceOneWord(2,1,0xa3b0);
DisplaceOneWord(2,2,0xa3b0);
DisplaceOneWord(2,3,0xa3b0);
break;
case 10: DisplaceOneWord(3,0,0xd1f2);
DisplaceOneWord(3,1,0xa3b0);
DisplaceOneWord(3,2,0xa3b0);
DisplaceOneWord(3,3,0xa3b0);
break;
case 2:
if(D<=3)
{
D=D+1;
LCD_Control_Cursor(0,1,D,0);
L=0;
}
else D=0;
break;
case 3: if(D>0)
{
D=D-1;
LCD_Control_Cursor(0,1,D,0);
L=0;
}
break;
case 12: if(L<3)
{
L=L+1;
LCD_Control_Cursor(0,1,D,L);
N=0;
}
break;
case 13: if(L>1)
{
L=L-1;
LCD_Control_Cursor(0,1,D,L);
N=0;
}
break;
case 4: if(N>0,L!=0)
{
N=N+1;
HEX=HEX+N;
DisplaceOneWord(D,L,HEX);
LCD_Control_Cursor(0,1,D,L);
}
break;
case 5: if(N<9,L!=0)
{
N=N-1;
HEX=HEX+N;
DisplaceOneWord(D,L,HEX);
LCD_Control_Cursor(0,1,D,L);
}
break;
case 15: LCD_Control_Cursor(0,0,D,L);
D=-1;
L=0;
break;
case 14: DisplaceOneWord(0,1,0xa3b0);
DisplaceOneWord(0,2,0xa3b0);
DisplaceOneWord(0,3,0xa3b0);
DisplaceOneWord(1,1,0xa3b0);
DisplaceOneWord(1,2,0xa3b0);
DisplaceOneWord(1,3,0xa3b0);
DisplaceOneWord(2,1,0xa3b0);
DisplaceOneWord(2,2,0xa3b0);
DisplaceOneWord(2,3,0xa3b0);
DisplaceOneWord(3,1,0xa3b0);
DisplaceOneWord(3,2,0xa3b0);
DisplaceOneWord(3,3,0xa3b0);
break;
}
}
void main(void)
{
LCD_Init();
DisplaceOneWord(0,0,0xbbb6);
DisplaceOneWord(0,1,0xd3ad);
Hardware_Delay_T0(20);
Clear_Line(0);
while(1)
{
Key_Displace();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -