⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 12864lcd.txt

📁 用5252单片机驱动LCD12864,程序已经过测试
💻 TXT
📖 第 1 页 / 共 2 页
字号:
#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 + -