📄 12864lcd.txt
字号:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
/*******************
矩阵键盘
D---------P1.0
C---------P1.1
B---------P1.2
A---------P1.3
1---------P1.4
2---------P1.5
3---------P1.6
4---------P1.7
按键值的分布
D C B A
1〔15 14 13 12〕
2〔11 10 9 8〕
3〔 7 6 5 4〕
4〔 3 2 1 0〕
利用已有的那个按键程序
LCD与单片机AT89C51之间的接线
GND----0
VO,Vcc---5V
REST-----5V
P0.0----P0.7 <--->DB0---DB7
P3.0 <---->RS
P3.1 <---->R/W
P3.2 <---->E
P3.3 <---->CS1
P3.4 <---->CS2
***********************/
/********总线以及地址线的定义************/
#define disp_on 0x3f
#define disp_off 0x3e
#define col 0x40
#define row 0xb8
#define start_line 0xc0
#define lcd_bus P0
sbit di=P3^0;
sbit rw=P3^1;
sbit enable=P3^2;
sbit cs1=P3^3;
sbit cs2=P3^4;
/************函数声明******************/
void clear_sreen(); //清屏(即清除显存)
void delay(); //延时1ms
void init_lcd(); //LCD初始化
//void lcd_busy(); //忙闲判断
void hz_disp16(unsigned char start_row,unsigned char start_col,unsigned char code *hzk);
// 指定位置显示汉字(16*16)
//汉字(16*16)显示
//row 为起始行(0--7)
//col 为起始列(0---63)
void shu_disp8(unsigned char start_row,unsigned char start_col,unsigned char code *shuk);
//指定位置显示数字(8*16)
//数字(8*16)显示
//row 为起始行(0--7)
//col 为起始列(0---63)
void write_command(unsigned char cmdcode); //写指令
void write_data(unsigned char dispdata); //写数据
unsigned char read_data(); //读数据
unsigned char getkey(); //矩阵键盘处理
/************
矩阵键盘
D---------P1.0
C---------P1.1
B---------P1.2
A---------P1.3
1---------P1.4
2---------P1.5
3---------P1.6
4---------P1.7
按键值的分布
D C B A
1〔15 14 13 12〕
2〔11 10 9 8〕
3〔 7 6 5 4〕
4〔 3 2 1 0〕
利用已有的那个按键程序
*************/
/*********矩阵键盘***********/
unsigned char getkey()
{
unsigned char keycode=0xff,temp,i;
P1=0x0f;
temp=P1&0x0f;
if(temp!=0x0f) //有键按下
{
// beep=0;
P1=0x7f;
for(i=0;i<4;i++)
{
temp=P1&0x0f;
if(temp==0x07)
{
keycode=i*4;
break;
}
else if(temp==0x0b)
{
keycode=i*4+1;
break;
}
else if(temp==0x0d)
{
keycode=i*4+2;
break;
}
else if(temp==0x0e)
{
keycode=i*4+3;
break;
}
P1=(P1>>1)|0x80;
}
while((P1&0x0f)!=0x0f) //等待释放
{
P1=0x0f;
}
// beep=1;
}
return keycode;
}
/*******写指令到LCD*********/
void write_command(unsigned char cmdcode)
{
//lcd_busy();
di=0;
rw=0;
lcd_bus=cmdcode; //输入控制命令(display on/off,display startline,row,col)
enable=1;
_nop_();
enable=0;
}
/***********写显示的数据到LCD***********/
void write_data(unsigned char dispdata)
{
//lcd_busy();
di=1;
rw=0;
lcd_bus=dispdata;
enable=1;
_nop_();
enable=0;
}
/***********读LCD显示的数据***********/
unsigned char read_data()
{
unsigned char lcddata;
lcd_bus=0xff; //P0口读数据时要先置高电平
di=1;
rw=1;
enable=0; //这里要虚读一次(这样不知行不行?????)
enable=0;
enable=1;
enable=1;
enable=1;
lcddata=lcd_bus;
return lcddata;
}
/**********清除显屏(清除显示内存)***********/
void clear_screen()
{
unsigned char i,j;
cs1=0;cs2=1; /**清除左屏**/
for(i=0;i<8;i++)
{
write_command(row+i);
write_command(col+0); //列地址0
for(j=0;j<64;j++)
write_data(0x00); //每做一次写操作,列地址加1
}
cs1=1;cs2=0; /**清除右屏**/
for(i=0;i<8;i++)
{
write_command(row+i);
write_command(col+0); //列地址0
for(j=0;j<64;j++)
write_data(0x00); //每做一次写操作,列地址加1
}
}
/***********延时1ms**************/
void delay()
{ unsigned int dy=500;
while(--dy);
}
/*************初始化LCD屏***************/
void init_lcd()
{
delay();
cs1=0;cs2=1; //左屏
delay();
write_command(disp_off);
write_command(row);
write_command(col);
write_command(start_line);
write_command(disp_on);
cs1=1;cs2=0; //右屏
delay();
write_command(disp_off);
write_command(row);
write_command(col);
write_command(start_line);
write_command(disp_on);
}
/**********指定位置显示汉字(16*16)*************/
void hz_disp16(unsigned char start_row,unsigned char start_col,unsigned char code *hzk)
{
unsigned char i,j;
for(j=0;j<2;j++)
{
write_command(row+start_row+j);
write_command(col+start_col);
for(i=0;i<16;i++) write_data(hzk[16*j+i]);
}
}
/**********指定位置显示数字(8*16)*************/
void shu_disp8(unsigned char start_row,unsigned char start_col,unsigned char code *shuk)
{
unsigned char i,j;
for(j=0;j<2;j++)
{
write_command(row+start_row+j);
write_command(col+start_col);
for(i=0;i<8;i++) write_data(shuk[8*j+i]);
}
}
/*********我的汉字字库*************/
/******screen0*********/
/*-- 文字: 中 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
unsigned char code zhong0[]={
0x00,0x00,0xFC,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0xFC,0x08,0x00,0x00,
0x00,0x00,0x07,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x07,0x00,0x00,0x00
};
/*-- 文字: 国 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
unsigned char code guo0[]={
0x00,0xFE,0x02,0x0A,0x8A,0x8A,0x8A,0xFA,0x8A,0x8A,0x8A,0x0A,0x02,0xFE,0x00,0x00,
0x00,0xFF,0x40,0x48,0x48,0x48,0x48,0x4F,0x48,0x49,0x4E,0x48,0x40,0xFF,0x00,0x00
};
/*-- 文字: 移 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
unsigned char code yi0[]={
0x10,0x92,0x72,0xFE,0x91,0x19,0x90,0x88,0x44,0x53,0xA2,0x52,0x0A,0x06,0x00,0x00,
0x02,0x01,0x00,0xFF,0x00,0x81,0x88,0x44,0x46,0x29,0x11,0x09,0x05,0x03,0x01,0x00
};
/*-- 文字: 动 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
unsigned char code dong0[]={
0x20,0x24,0x24,0xE4,0x24,0x24,0x24,0x20,0x10,0x10,0xFF,0x10,0x10,0xF0,0x00,0x00,
0x08,0x1C,0x0B,0x08,0x0C,0x05,0x4E,0x24,0x10,0x0C,0x03,0x20,0x40,0x3F,0x00,0x00
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -