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

📄 lcm.c

📁 自己的一个320*240的液晶屏(1335控制器)的驱动
💻 C
📖 第 1 页 / 共 2 页
字号:



#define LCD_READ    1
#define LCD_WRITE   0

#define DATA    1
#define INS     0 

#define SEL     0
#define NO_SEL  1
#define KONGBAI 0x20


#include<ADuC834.h>


extern unsigned char code hz1212[];
extern unsigned char code hz[];
extern unsigned char code asc6_12[];
extern unsigned char code asc6_8[];
extern unsigned char code asc11_16[];
extern unsigned char code asc12_16[];
extern unsigned char code asc16_32[];
extern unsigned char code asc24_32[];

extern unsigned char  xdata  dis_buf1[128],dis_buf2[128];      // 使用12*12字库时,用于缓冲拼装行

sbit p_csa  = P2^4;
sbit p_csb  = P2^3;
sbit p_di   = P2^0;
sbit p_rw   = P2^1;
sbit p_e    = P2^2;
//sbit p_rs   = P2^0;              



/*
管脚号   管脚   电平          说     明 
  1      CSA    H/L    片选择信号,低电平时选择前64列。 
  2      CSB    H      片选择信号,低电平时选择后64列。 
  3      GND    0V     逻辑电源地。 
  4      VCC    5V     逻辑电源。 
  5      V0     -10V   LCD驱动电源。 
  6      D/I    H/L    数据\指令选择,高电平:数据D0-D7将送入显示RAM; 
                                      低电平:数据D0-D7将送入指令寄存器执行。 
  7      R/W    H/L    读\写选择,高电平:读数据;低电平:写数据。 
  8      E      H.H/L  读写使能,高电平有效,下降沿锁定数据。 
  9      DB0    H/L    数据输入输出引脚。 
  10     DB1    H/L    数据输入输出引脚。 
  11     DB2    H/L    数据输入输出引脚。 
  12     DB3    H/L    数据输入输出引脚。 
  13     DB4    H/L    数据输入输出引脚。 
  14     DB5    H/L    数据输入输出引脚。 
  15     DB6    H/L    数据输入输出引脚。 
  16     DB7    H/L    数据输入输出引脚。 
  17     RET    L      复位信号,低电平有效。 
  18     VEE    -10V   LCD驱动电源。 
  19     BLA    AC     背光电源,LED+。 
  20     BLK    AC     背光电源,LED-。 
*/ 

//                               屏幕显示与DD RAM地址映射关系 
//		  	Y1 	Y2 	Y3 	Y4 	………… 	Y62 	Y63 	Y64 	  
// X=0 	| Line 0 	1/0 	1/0 	1/0 	1/0 	………… 	1/0 	1/0 	1/0 	DB0 
//	| Line 1 	1/0 	1/0 	1/0 	1/0 	………… 	1/0 	1/0 	1/0 	DB1 
//	| Line 2 	1/0 	1/0 	1/0 	1/0 	………… 	1/0 	1/0 	1/0 	DB2 
//	| Line 3 	1/0 	1/0 	1/0 	1/0 	………… 	1/0 	1/0 	1/0 	DB3 
//	| Line 4 	1/0 	1/0 	1/0 	1/0 	………… 	1/0 	1/0 	1/0 	DB4 
//	| Line 5 	1/0 	1/0 	1/0 	1/0 	………… 	1/0 	1/0 	1/0 	DB5 
//	| Line 6 	1/0 	1/0 	1/0 	1/0 	………… 	1/0 	1/0 	1/0 	DB6 
//	| Line 7 	1/0 	1/0 	1/0 	1/0 	………… 	1/0 	1/0 	1/0 	DB7 
//------------------------------------------------------------------------------------------
//                                                      ………… 
//                                                      ………… 
//                                                      ………… 
//------------------------------------------------------------------------------------------
// X=7 	| Line60 	1/0 	1/0 	1/0 	1/0 	………… 	1/0 	1/0 	1/0 	DB4 
//	| Line61 	1/0 	1/0 	1/0 	1/0 	………… 	1/0 	1/0 	1/0 	DB5 
//	| Line62 	1/0 	1/0 	1/0 	1/0 	………… 	1/0 	1/0 	1/0 	DB6 
//	| Line63 	1/0 	1/0 	1/0 	1/0 	………… 	1/0 	1/0 	1/0 	DB7 


//  屏幕坐标(每个坐标单元为(8*8像素)) 
//  0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  (X)
//  1
//  |
//  7


/*忙判别*/
void lcd_busy(void)
{

	p_di = INS;
	p_rw = LCD_READ;
	p_e = 1;	
	P0 = 0xff;
	while (1) 
	{
		p_e = 1;
		if (P0 < 0x80) break;
		p_e = 0;
 	} 
	p_e = 0;
}

void lcd_on_off(unsigned char onoff)
{
 	lcd_busy();	
	p_di = INS;
	p_rw = LCD_WRITE;
	p_e = 1;	
	if(!onoff)
		P0 = 0x3e;    //off display
	else 
		P0 = 0x3f;    //on display		
	p_e = 0;		
}	

//       设置显示起始行
// 功能:执行该命令后,所设置的行将显示在屏幕的第一行。
// 显示起始行是由Z地址计数器控制的,该命令自动将A0-A5位地址送入Z地址计数器,
// 起始地址可以是0-63范围内任意一行。Z地址计数器具有循环计数功能,用于显示行扫描同步,
// 当扫描完一行后自动加一 
void set_start_column(unsigned char col)
{
 	lcd_busy();
	p_di = INS;
	p_rw = LCD_WRITE;
	p_e = 1;	
	P0 = col|0xc0;	
	p_e = 0;
}	

// 设置页地址 
//CODE:  R/W    D/I      DB7     DB6      DB5      DB4      DB3     DB2      DB1     DB0 
//        L 	  L 	   H 	   L 	    H 	     H 	      H 	      页地址(0~7) 
//功能:执行本指令后,下面的读写操作将在指定页内,直到重新设置。页地址就是DD RAM 的行地址,
//      页地址存储在X地址计数器中,A2-A0可表示8页,读写数据对页地址没有影响,除本指令可改变页地址外,
//      复位信号(RST)可把页地址计数器内容清零。 
//      DD RAM地址映像表 
//                  Y 地址 
//   0   1   2  ………………………  61   62   63 	
// -------------------------------------  
// |DB0                                |
// | ∫             PAGE0               |   X=0
// |DB7                                |	
// ------------------------------------        
// |DB0                                |
// | ∫             PAGE1               |   X=1
// |DB7                                |	  
// -------------------------------------   
// |                ∷                 |  
// |                ∷                 |
// |                ∷                 |
// |                ∷                 |
// -------------------------------------	  
// |DB0                                |
// | ∫             PAGE6               |   X=7 
// |DB7 	                       | 
// -------------------------------------  
// |DB0                                |
// | ∫             PAGE7               |   X=8 
// |DB7 	                       | 
// ------------------------------------- 	 	 	 	 	 	 	 	 

void set_page(unsigned char page)
{
 	lcd_busy();
	p_di = INS;
	p_rw = LCD_WRITE;
	p_e = 1;		
	P0 = page|0xb8;	
	p_e = 0;		
}

//        设置列地址 
// DD RAM 的列地址存储在Y地址计数器中,读写数据对列地址有影响,在对DD RAM进行读写操作后,Y地址自动加一。
void set_row(unsigned char col)
{
 	lcd_busy();
	p_di = INS;
	p_rw = LCD_WRITE;
	p_e = 1;	
	P0 = col|0x40;	
	p_e = 0;
}



//      状态检测 
//CODE:  R/W    D/I     DB7      DB6     DB5        DB4     DB3      DB2     DB1     DB0 
//        H 	  L 	  BF 	   L 	 ON/OFF       RST      L 	L 	L 	 L 
//功能:读忙信号标志位(BF)、复位标志位(RST)以及显示状态位(ON/OFF)。 
//	BF=H:内部正在执行操作;	BF=L:空闲状态。 
//	RST=H:正处于复位初始化状态;	RST=L:正常状态。 
//	ON/OFF=H:表示显示关闭;	ON/OFF=L:表示显示开。 
/*
unsigned char read_status(void)
{
    unsigned char status;
	
	p_di = INS;
	p_rw = LCD_READ;
	p_e = 1;	
	status = P0;
	p_e = 0;	
	return status;		
}	
*/

//       写显示数据 
//CODE:  R/W    D/I      DB7     DB6      DB5      DB4     DB3     DB2       DB1     DB0 
//         L 	   H 	    D7 	   D6 	    D5       D4      D3      D2 	D1 	D0 
//功能:写数据到DD RAM,DD RAM是存储图形显示数据的,写指令执行后Y地址计数器自动加1。
//      D7-D0位数据为1表示显示,数据为0表示不显示。写数据到DD RAM前,要先执行"设置页地址"及"设置列地址"命令。
void write_data(unsigned char da)
{

    lcd_busy();
	p_di = DATA;
	p_rw = LCD_WRITE;
	p_e = 1;	
	P0 = da;
	p_e = 0;		
}


//        读显示数据 
//CODE:   RS      R/W     DB7     DB6      DB5      DB4      DB3     DB2     DB1     DB0 
//          H 	    H 	   D7 	   D6 	    D5 	     D4       D3      D2 	D1 	D0 
//功能:从DD RAM读数据,读指令执行后Y地址计数器自动加1。从DD RAM读数据前要先执行"设置页地址" 及"设置列地址"命令。
/*
unsigned char read_data(void)
{
    unsigned char da;	

	lcd_busy();
	P0 = 0xff;
	p_di = DATA;
	p_rw = LCD_READ;
	p_e = 1;
	p_rw = LCD_READ;
	da = P0;
	P0 = 0xff;
	p_e = 0;
	return da;		
}
*/



/*设置xy*/
void set_xy(unsigned char x,unsigned char y) 
{
 	if (x>=64) 
	{	
	 	p_csa = 0;
 		p_csb = 1;
 	} 
 	else 
 	{
 		p_csb = 0;
 		p_csa = 1;
 	}

	set_row(x);
	set_page(y);

	P0=0xff;
}




/*显示初始化*/
void lcd_init(void) 
{
 unsigned char x,y;
 
 	/*开显示*/
 	p_csa = 1;
	p_csb = 0;
	lcd_on_off(1);

 	p_csa = 0;
	p_csb = 1;
	lcd_on_off(1);


	 /*0行开始显示*/
 	p_csa = 1;
	p_csb = 0;
	set_start_column(0);

 	p_csa = 0;
	p_csb = 1;
	set_start_column(0);

	for (y=0;y<8;y++) 
 	{
 		 for (x=0;x<128;x++) 
		 {
	    	set_xy(x,y);
			write_data(0xff);
		 }
 	}
}



//显示汉字,fb==1:反白显示
//汉字字库(16*16)
//   byte0  (DB0)    ~   byte 15
//          (DB1)
//            |
//          (DB7)

//   byte16 (DB0)    ~   byte 31
//          (DB1)
//            |
//          (DB7)   

/*
void diplay_chinese(unsigned char x,unsigned char y,unsigned char n,unsigned char fb) 
{
 unsigned char i,dd;
 
 for (i=0;i<16;i++) 
 {
	dd=hz[i+n*32];
	if (fb) dd=255-dd;
   	set_xy(x*8+i,y);
	write_data(dd);

	dd=hz[i+n*32+16];
	if (fb) dd=255-dd;
   	set_xy(x*8+i,y+1);
	write_data(dd);
 }
}
*/

void diplay_chinese(unsigned char x,unsigned char y,unsigned char n,unsigned char fb) 
{
 unsigned char i,dd,ch,ch2,yy;
 
	switch(y)
	{
		case 0: 
			yy = 0;
		break;
		case 1: 
			yy = 1;
		break;
		case 2:
			yy = 3;
		break;
		case 3:
			yy = 4;
		break;
		case 4:
			yy = 6;
		break;
	}

 for (i=0;i<12;i++) 
 {
	dd=hz1212[i+n*24];          // 汉字的上半部分
	if (fb) dd=255-dd;
   	set_xy(x*12+i,yy);
	
 	switch(yy)
	{
		case 1:
		//	ch = read_data();      // 上半字节拼装
		 	ch = dis_buf1[x*12+i];
			ch = ch & 0x0f;
			ch2 = dd;
			dd = dd<<4;	
			dd = dd & 0xf0;
			dd = ch | dd;          // 先显示高4位
		 	dis_buf1[x*12+i] = dd;
		break;
		case 4:
	 	//	ch = read_data();      // 上半字节拼装
		 	ch = dis_buf2[x*12+i];
			ch = ch & 0x0f;
			ch2 = dd;
			dd = dd<<4;	
			dd = dd & 0xf0;
			dd = ch | dd;          // 先显示高4位
		 	dis_buf2[x*12+i] = dd;
		break;

	}
//  	set_xy(x*12+i,yy);
	write_data(dd);

	dd=hz1212[i+n*24+12];          // 汉字的下半部分
	if (fb) dd=255-dd;
   	set_xy(x*12+i,yy+1);

 	switch(yy)
	{
		case 0: 
		//	ch = read_data();     // 下半字节拼装
			ch = dis_buf1[x*12+i];
			ch = ch & 0xf0;
			dd = dd & 0x0f;
			dd = ch | dd;
			dis_buf1[x*12+i] = dd;
		break;
		case 3: 
		//case 6:    
		//	ch = read_data();     // 下半字节拼装
			ch = dis_buf2[x*12+i];
			ch = ch & 0xf0;
			dd = dd & 0x0f;
			dd = ch | dd;
			dis_buf2[x*12+i] = dd;
		break;
		case 1: case 4:
			ch2 = ch2>>4;
			ch2 = ch2 & 0x0f;
			dd = dd << 4;
			dd = dd & 0xf0;
			dd = dd | ch2;
		break;
	}
//	set_xy(x*12+i,yy+1);
	write_data(dd);
 }
}


void diplay_menu_chinese(unsigned char x,unsigned char frame,unsigned char n,unsigned char act) 
{
 unsigned char i,dd,ch,xx;
 
 
 if(frame > 1)	 
 {
	xx = 0;

	switch(frame)
	{
		case 4:
			xx = 64; 
		case 2:
	   		set_xy(xx,6);
			write_data(0x07); 
	   		set_xy(xx,7);
			write_data(0xc0); 
	   		set_xy(1+xx,6);
			write_data(0xfb); 
	   		set_xy(1+xx,7);
			write_data(0xbf); 
			for(i=0;i<6;i++)
			{
	   			set_xy(2+i+xx,6);
				write_data(0xfd); 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -