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

📄 main.c.bak

📁 液晶控制器S6B0724的控制。mplab 7.60+pic ccs 4.057
💻 BAK
字号:
//亦木明

#include "keyscan.h"
#include "pig.h"


int1 Timer0_Flag=FALSE;
//#define CMD  0
//#define DAT  1
#define PAGES   8
#define COLUMNS 131   //64*131
#define LCD_DATA *(0x07)

void SFR_Init()
{
	set_tris_a(0xff);
	set_tris_b(0x01);
	set_tris_c(0x00);
	port_b_pullups(0xff);
	InitTimer0();
	Key_Init();

}
void LCD_WriteCmd(int8 cmd)
{
	disable_interrupts(INT_RTCC);
	output_low(PIN_B5);  //CS1=0;
	output_low(PIN_B2);  //A0=0	
	output_high(PIN_B4); //R=1
	LCD_DATA=cmd;
	output_low(PIN_B3); //WR=0
	#asm
	NOP
	NOP
	NOP
	NOP
	#endasm
	output_high(PIN_B3);  //WR=1
	output_high(PIN_B5);  //CS1=1
	enable_interrupts(INT_RTCC);
}

void LCD_WriteDat(int8 dat)
{
	disable_interrupts(INT_RTCC);
	output_low(PIN_B5);  //CS1=0;
	output_high(PIN_B2);  //A0=1	
	output_high(PIN_B4);  //R=1
	LCD_DATA=dat;
	output_low(PIN_B3); //WR=0
	#asm
	NOP
	NOP
	NOP
	NOP
	#endasm
	output_high(PIN_B3);  //WR=1
	output_high(PIN_B5);  //CS1=1;
	enable_interrupts(INT_RTCC);
	//output_c(0xff);
}
int8 LCD_ReadStatus()
{
	int8 dat;
	set_tris_c(0xff);
	output_low(PIN_B2);  //A0=0
	output_high(PIN_B3);  //WR=1
	output_low(PIN_B4); //R=0
	#asm
	NOP
	NOP
	NOP
	NOP
	#endasm
	dat=input_c();
	output_high(PIN_B4);  //R=1
	set_tris_c(0x00);
	return dat;
}

//SetPage 0-7
void LCD_SelPage(int8 page)
{
	page=page%PAGES;
	LCD_WriteCmd(0xb0+page);
}

//SetColumn 0-131  (131*64) 
void LCD_SelColumn(int8 column)
{
	column=column%COLUMNS;
	LCD_WriteCmd(column&0x0f);  //列的低四位
	column>>=4;
	LCD_WriteCmd(0x10|(column&0x0f)); //列的高四位
}

void LCD_Clear()
{
	int8 i,j;
	for(i=0;i<8;i++)
	{
	    LCD_SelPage(i);
		LCD_SelColumn(0);
		for(j=0;j<COLUMNS;j++)
		{
			LCD_WriteDat(0x00);
		}
	}
}

//从第page行,第column列开始,显示len个字母。Flag为反白显示。TRUE反白。
/***************************************************
// 函数原型:    Display_En(int8,int8,int8,int1)
// 入口参数:    page 起始行,column 起始列,len 字符个数,Flag 反白显示。
// 出口参数:  void
// 功    能:    显示8*5字符。
// 最后修改:    2008.09.29
// 注    意:	本函数具有自动换行功能 
				Flag=0  正常显示
				Flag=1  反白显示
***************************************************/
void Display_En(int8 page,int8 column,int8 len,int8 *En,int1 Flag)
{
	int8 i,j,count;
	count=column;  //对列进行计数,若大于本行的最大列,则转移到下一行。
	
	page=page%PAGES; //防止输入的行超过0-7
	column=column%COLUMNS; //防止输入的列超过0-131
	
	LCD_SelPage(page);   
    LCD_SelColumn(column);
    
	for(i=0;i<len;i++)
	{
		if(count+5>COLUMNS-1 && page<PAGES-1)  //如果本行已经不够显示此字符,且行小于在0-6,则转移到下一行。
		{ 
        	LCD_SelPage(++page);    //
			LCD_SelColumn(0);
			count=0;
		}
		for(j=0;j<5;j++)
		{
			if(Flag)  
			LCD_WriteDat(~En[i*5+j]);//反白
		    else
			LCD_WriteDat(En[i*5+j]);
		}
		count=count+5;    //列数监视
	}
}

/***************************************************
// 函数原型:    Display_En_16X8(int8,int8,int8,int1)
// 入口参数:    page 起始行,column 起始列,len 字符个数,Flag 反白显示。
// 出口参数:  void
// 功    能:    显示16*8字符。
// 最后修改:    2008.09.29
// 注    意:	本函数具有自动换行功能 
				Flag=0  正常显示
				Flag=1  反白显示
***************************************************/
void Display_En_16X8(int8 page,int8 column,int8 len,int8 *En,int1 Flag)
{
	int8 i,j,count;
//	count=column;  //对列进行计数,若大于本行的最大列,则转移到下一行。
	
	page=page%PAGES; //防止输入的行超过0-7
	column=column%COLUMNS; //防止输入的列超过0-131
	  
	for(i=0;i<len;i++)
	{
		if(column+8>COLUMNS-1 && page<PAGES-2)  //如果本行已经不够显示此字符,且行小于在0-5,则转移到下一行。
		{ 
			page+=2;
        	LCD_SelPage(page);    //
			LCD_SelColumn(0);
			column=0;
		}

		LCD_SelPage(page);   
  	    LCD_SelColumn(column);
		
		for(j=0;j<8;j++)   //上半个字符
		{
			if(Flag)   
			LCD_WriteDat(~En[i*16+j]);//反白
			else	
			LCD_WriteDat(En[i*16+j]);
		}
		
		page++;
		LCD_SelPage(page);   
  	    LCD_SelColumn(column);
		for(j=8;j<16;j++) //下半个字符
		{
			if(Flag)  
			LCD_WriteDat(~En[i*16+j]);//反白
			else
			LCD_WriteDat(En[i*16+j]);
		}

		page--;

	//	count=count+8;    //列数监视
		column+=8;
	}
}
/***************************************************
// 函数原型:    Display_Chn_16X16(int8,int8,int8,int1)
// 入口参数:    page 起始行,column 起始列,len 字符个数,Flag 反白显示。
// 出口参数:  void
// 功    能:    显示16*16汉字。
// 最后修改:    2008.09.29
// 注    意:	本函数具有自动换行功能 
				Flag=0  正常显示
				Flag=1  反白显示
***************************************************/
void Display_Chn_16X16(int8 page,int8 column,int8 len,int8 *En,int1 Flag)
{
	int8 i,j,count;
	page=page%PAGES; //防止输入的行超过0-7
	column=column%COLUMNS; //防止输入的列超过0-131
	  
	for(i=0;i<len;i++)
	{
		if(column+16>COLUMNS-1 && page<PAGES-2)  //如果本行已经不够显示此字符,且行小于在0-5,则转移到下一行。
		{ 
			page+=2;
        	LCD_SelPage(page);    //
			LCD_SelColumn(0);
			column=0;
		}

		LCD_SelPage(page);   
  	    LCD_SelColumn(column);
		
		for(j=0;j<16;j++)   //上半个字符
		{
			if(Flag)   
			LCD_WriteDat(~En[i*32+j]);//反白
			else	
			LCD_WriteDat(En[i*32+j]);
		}
		
		page++;
		LCD_SelPage(page);   
  	    LCD_SelColumn(column);
		for(j=16;j<32;j++) //下半个字符
		{
			if(Flag)  
			LCD_WriteDat(~En[i*32+j]);//反白
			else
			LCD_WriteDat(En[i*32+j]);
		}

		page--;

	//	count=count+8;    //列数监视
		column+=16;
	}
}
/***************************************************
// 函数原型:    Display_Chn_16X16(int8,int8,int8,int1)
// 入口参数:    page 起始行,column 起始列,len 字符个数,Flag 反白显示。
// 出口参数:  void
// 功    能:    显示16*16汉字。
// 最后修改:    2008.09.29
// 注    意:	本函数具有自动换行功能 
				Flag=0  正常显示
				Flag=1  反白显示
***************************************************/
void Display_Chn_32X32(int8 page,int8 column,int8 len,int8 *En,int1 Flag)
{
	
}

void Display_Bmp_126X64()
{
	int8 i,j;
	for(i=0;i<2;i++)
	{
	    LCD_SelPage(i);
		LCD_SelColumn(0);
		for(j=0;j<128;j++)
		{
			LCD_WriteDat(nBitmapDot1[i*128+j]);
		}
	}
	for(i=2;i<4;i++)
	{
	    LCD_SelPage(i);
		LCD_SelColumn(0);
		for(j=0;j<128;j++)
		{
			LCD_WriteDat(nBitmapDot2[i*128+j]);
		}
	}
	for(i=4;i<6;i++)
	{
	    LCD_SelPage(i);
		LCD_SelColumn(0);
		for(j=0;j<128;j++)
		{
			LCD_WriteDat(nBitmapDot3[i*128+j]);
		}
	}
	for(i=6;i<8;i++)
	{
	    LCD_SelPage(i);
		LCD_SelColumn(0);
		for(j=0;j<128;j++)
		{
			LCD_WriteDat(nBitmapDot4[i*128+j]);
		}
	}
}
void LCD_Init()
{
	
	output_low(PIN_B6);  //8080
	output_low(PIN_B5);  //CS1=0;
	
	//液晶复位
	output_low(PIN_B1);
	delay_ms(10);
	output_high(PIN_B1);
	delay_us(1);

	//软复位
	LCD_WriteCmd(0xe2);  
	delay_ms(10);

	//设置ADC  seg131-seg0
	LCD_WriteCmd(0xa1);
    //设置SHL  com0-com64
	LCD_WriteCmd(0xc8); 
	//设置Bias 1/9
	LCD_WriteCmd(0xa2);
	//Voltage Converter ON 
	LCD_WriteCmd(0x2c);
	delay_ms(40);
	//Voltage Regulator ON 
	LCD_WriteCmd(0x2e);
	delay_ms(40);
	//Voltage Follower ON
	LCD_WriteCmd(0x2f);
	delay_ms(40);
	
	//电阻率选择
	LCD_WriteCmd(0x27);
	delay_ms(40);

	//对比度设置 
	LCD_WriteCmd(0x81);
	//对比度设置值 0-63
	LCD_WriteCmd(0x05);

	//初始化显示行。0-63
	LCD_WriteCmd(0x40);

	//打开显示
	LCD_WriteCmd(0xaf);

	enable_interrupts(GLOBAL);
}

/*int8  asc[]={0x7C,0x12,0x11,0x12,0x7C, // -A-

	0x7F,0x49,0x49,0x49,0x36, // -B-

	0x3E,0x41,0x41,0x41,0x22, // -C-

	0x7F,0x41,0x41,0x41,0x3E, // -D-

	0x7F,0x49,0x49,0x49,0x41, // -E-

	0x7F,0x09,0x09,0x09,0x01, // -F-

	0x3E,0x41,0x51,0x51,0x72, // -G-

	0x7F,0x08,0x08,0x08,0x7F, // -H-

	0x00,0x41,0x7F,0x41,0x00, // -I-

	0x20,0x40,0x41,0x3F,0x01, // -J-

	0x7F,0x08,0x14,0x22,0x41, // -K-

	0x7F,0x40,0x40,0x40,0x40, // -L-

	0x7F,0x02,0x0C,0x02,0x7F, // -M-

	0x7F,0x04,0x08,0x10,0x7F};*/
/*int8 asc[]={
		0xE0,0xF0,0x98,0x8C,0x98,0xF0,0xE0,0x00,  // -A-
	0x0F,0x0F,0x00,0x00,0x00,0x0F,0x0F,0x00,

	0x04,0xFC,0xFC,0x44,0x44,0xFC,0xB8,0x00,  // -B-
	0x08,0x0F,0x0F,0x08,0x08,0x0F,0x07,0x00,

	0xF0,0xF8,0x0C,0x04,0x04,0x0C,0x18,0x00,  // -C-
	0x03,0x07,0x0C,0x08,0x08,0x0C,0x06,0x00
};*/
/*int8 asc[]={
	 0x00,0x84,0x44,0x34,0x04,0xFC,0x05,0x86, //栾
      0x04,0xFC,0x04,0x14,0x26,0xC4,0x00,0x00,
      0x02,0x42,0x42,0x22,0x12,0x0A,0x06,0xFF,
      0x06,0x0A,0x12,0x12,0x22,0x62,0x22,0x00,

      0x00,0xFC,0x84,0x84,0x84,0xFE,0x04,0xFC,//"昕",
      0x44,0x44,0x44,0xC2,0x43,0x62,0x40,0x00,
      0x00,0x3F,0x10,0x10,0x10,0x9F,0x40,0x3F,
      0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,

			};
*/
/*
int8 const asc[]={
     0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,
      0x40,0x40,0x40,0x40,0xC0,0x40,0x44,0x58,
      0x78,0x40,0x40,0xC0,0xC0,0x40,0x40,0x40,
      0x40,0x40,0x40,0x60,0x60,0x40,0x00,0x00,
      0x00,0x00,0x00,0x00,0xC0,0x60,0x38,0x1E,
      0x0C,0x04,0x00,0x00,0xFF,0x00,0x00,0x00,
      0x00,0x00,0x00,0xFF,0xFF,0x00,0x02,0x04,
      0x0C,0x18,0x38,0x70,0xE0,0x00,0x00,0x00,
      0x00,0x00,0x10,0x11,0x10,0x10,0x10,0x10,
      0x10,0x10,0x10,0x90,0xF1,0x70,0x30,0xFF,
      0xFF,0x12,0x30,0x51,0x90,0x10,0x10,0x10,
      0x10,0x10,0x10,0x08,0x0C,0x08,0x00,0x00,
      0x00,0x00,0x40,0x20,0x20,0x10,0x18,0x08,
      0x04,0x06,0x03,0x01,0x00,0x00,0x00,0x7F,
      0x7F,0x00,0x00,0x00,0x01,0x03,0x06,0x06,
      0x0C,0x1C,0x18,0x38,0x18,0x08,0x00,0x00
	};
	*/
void main()
{
	int8 i;
//	delay_ms(1000);
	

	SFR_Init();
	LCD_Init();
	LCD_Clear();
	
	i=LCD_ReadStatus();
	putc(i);
/*
	//Display_En(0,87,14,asc,TRUE);
	Display_En_16X8(0,0,3,asc,TRUE);
	Display_En_16X8(0,24,3,asc,TRUE);
	Display_En_16X8(0,48,3,asc,TRUE);
	Display_En_16X8(0,72,3,asc,TRUE);
	Display_En_16X8(0,96,3,asc,TRUE);
	Display_En_16X8(0,120,3,asc,TRUE);
//	Display_En_16X8(0,0,3,asc,TRUE);*/
//	Display_Chn_16X16(0,110,2,asc,TRUE);
	Display_Bmp_126X64();
while(1)
{
Display_Bmp_126X64();
}

	

}
/*
#int_rtcc
void timer0_handle(void)
{
	SET_TIMER0(217);
	Timer0_Flag=TRUE;

} */
int8 contrast=0,add=0,dec=0;
#int_rtcc
void timer0_handle(void)
{
	SET_TIMER0(SCANTIME);
//	if(input(PIN_B2)) output_low(PIN_B2); else output_high(PIN_B2);
	GetKey();
	if((KeyPress&0x03)!=0x03)
	{
		if(KeyDown&0x01)
		{
			KeyDown&=0xfe;
			if(contrast<63) contrast++;
		}
		if(!(KeyPress & 0x01))
		{
			add++;
			if(add==10)
			{
				add=0;
				if(contrast<63) contrast++;
			}
		}
		if(KeyDown&0x02)
		{
			KeyDown&=0xfd;
			if(contrast>0) contrast--;
		}
		if(!(KeyPress & 0x02))
		{
			dec++;
			if(dec==10)
			{
				dec=0;
				if(contrast>0) contrast--;
			}
		}
		if(KeyUp&0x01)
		{
			KeyUp&=0xfe;
			add=0;
		}
		if(KeyUp&0x02)
		{
			KeyUp&=0xfd;
			dec=0;
		}
		//对比度设置 
		LCD_WriteCmd(0x81);
		//对比度设置值 0-63
		LCD_WriteCmd(contrast);
	}
} 

⌨️ 快捷键说明

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