51单片机12864显示汉字按键1,2,3,4控制流水灯代码
时间: 2024-03-11 07:46:56 浏览: 19
好的,下面是一个简单的51单片机代码,实现了12864液晶屏显示汉字和按键控制流水灯的功能。代码如下:
```
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
// 液晶屏控制引脚定义
sbit RS=P1^0;
sbit RW=P1^1;
sbit EN=P1^2;
sbit PSB=P1^3;
// 按键定义
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
// LED灯定义
sbit LED=P2^0;
// 汉字点阵数据
const uchar Hanzi[]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
// 液晶屏初始化
void LcdInit()
{
PSB=0; // 并口方式
RS=0;
RW=0;
EN=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
P0=0x30; // 8位数据,2行显示,5x7点阵
EN=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
EN=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
P0=0x0c; // 显示开,光标关,光标闪烁关
EN=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
EN=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
P0=0x01; // 清屏
EN=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
EN=0;
}
// 写入数据到液晶屏
void LcdWriteData(uchar dat)
{
RS=1;
RW=0;
EN=0;
_nop_();
_nop_();
_nop_();
_nop_();
P0=dat;
EN=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
EN=0;
}
// 写入指令到液晶屏
void LcdWriteCmd(uchar cmd)
{
RS=0;
RW=0;
EN=0;
_nop_();
_nop_();
_nop_();
_nop_();
P0=cmd;
EN=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
EN=0;
}
// 显示汉字
void LcdShowHanzi(const uchar *p)
{
uchar i;
for(i=0;i<16;i++)
{
LcdWriteData(p[i]);
}
}
// 主函数
void main()
{
uchar i=0;
uchar key=0;
LcdInit(); // 初始化液晶屏
while(1)
{
// 控制流水灯
LED=(i>>4)&0x01;
delay(50000);
LED=(i>>3)&0x01;
delay(50000);
LED=(i>>2)&0x01;
delay(50000);
LED=(i>>1)&0x01;
delay(50000);
LED=i&0x01;
delay(50000);
i++;
// 显示汉字
if(key1==0)
{
LcdWriteCmd(0x80); // 设置显示位置为第1行第1列
LcdShowHanzi(Hanzi); // 显示汉字
key=1;
}
else if(key2==0)
{
LcdWriteCmd(0x80); // 设置显示位置为第1行第1列
LcdShowHanzi(Hanzi+16); // 显示汉字
key=2;
}
else if(key3==0)
{
LcdWriteCmd(0x80); // 设置显示位置为第1行第1列
LcdShowHanzi(Hanzi+32); // 显示汉字
key=3;
}
else if(key4==0)
{
LcdWriteCmd(0x80); // 设置显示位置为第1行第1列
LcdShowHanzi(Hanzi+48); // 显示汉字
key=4;
}
else
{
if(key!=0)
{
// 清屏
LcdWriteCmd(0x01);
key=0;
}
}
}
}
// 延时函数
void delay(uint t)
{
uint i,j;
for(i=t;i>0;i--)
for(j=110;j>0;j--);
}
```
需要注意的是,以上代码仅供参考,具体实现过程需要根据具体的硬件和软件环境进行调整和修改。