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

📄 18f240128.c

📁 pic18f4580上实现lcd显示(t6963) 显示为128*128(可用于240*128lcm)
💻 C
字号:
/*-----------------------------------------------------------------------------------
项目名称:用pic18f4580写的lcm128*128液晶程序,已经通过调试2007-3-1
方案实现:
公司名称:中山矩通机电有限公司
软件作者:张文治
编写开始日期:2007-1-17
调试通过日期:
版本号:
第一次修改日期:2007-3-1
第一次修改内容:
----------------------------------------------------------------------------------------*/
#include<p18f4580.h>
#include<math.h>
#include<delays.h>
#include"ASCII816.h"
#include"chnum.h"
#include"map.h"
#include"ch4064.h"
#include"hztable.h"
#define uchr unsigned char
#define uint unsigned int



uchr	cc2,cc3=0;

void delay (unsigned int tm)
{
	while(--tm);
}

/*--------------------------------------------------------------------
函数名:beep(void)
函数功能:峰鸣器驱动,频率4k
输入参数:无
输出参数:无
---------------------------------------------------------------------*/
void beep(void)
{
	uchr	ct;
	for(ct=0;ct<30;ct++)//控制音长
	{
		PORTAbits.RA0=1;
		delay(100);//控制音调
		PORTAbits.RA0=0;
	}
}

/*--------------------------------------------------------------------
函数名:key_ch
函数功能:判断是否有任意键按下
输入参数:无
输出参数:0,1标志
---------------------------------------------------------------------*/
uchr key_ch(void)
{
	
	PORTC=0x0f;													//行输入低电平
	if(PORTC!=0x0f)
	{
		delay(100);												//检查到有键按下延时10Ms
		if(PORTC!=0x0f)											//再次检查按键情况
		beep();return(1);												//有键按下则返回1
	}
	return(0);
}


/*--------------------------------------------------------------------
函数名:get_key函数功能:判断具体是什么键(得到键值)
输入参数:无
输出参数:byte(一个键值数据)
---------------------------------------------------------------------*/	
unsigned char get_key(void)
{
	while(key_ch())
	{
	PORTC=0xef;
	if(PORTC==0xee)					{while(PORTC!=0xef){;}return(1);}//等键放开,返回键值,按键1
	else if(PORTC==0xed)			{while(PORTC!=0xef){;}return(2);}//等键放开,返回键值,按键1
	else if(PORTC==0xeb)			{while(PORTC!=0xef){;}return(3);}//等键放开,返回键值,按键1
	else if(PORTC==0xe7)			{while(PORTC!=0xef){;}return(4);}//等键放开,返回键值,按键1
	
	PORTC=0xdf;
	if(PORTC==0xde)					{while(PORTC!=0xdf){;}return(5);}//等键放开,返回键值,按键1
	else if(PORTC==0xdd)			{while(PORTC!=0xdf){;}return(6);}//等键放开,返回键值,按键1
	else if(PORTC==0xdb)			{while(PORTC!=0xdf){;}return(7);}//等键放开,返回键值,按键1
	else if(PORTC==0xd7)			{while(PORTC!=0xdf){;}return(8);}//等键放开,返回键值,按键1

	PORTC=0xbf;
	if(PORTC==0xbe)					{while(PORTC!=0xbf){;}return(9);}//等键放开,返回键值,按键1
	else if(PORTC==0xbd)			{while(PORTC!=0xbf){;}return(10);}//等键放开,返回键值,按键1
	else if(PORTC==0xbb)			{while(PORTC!=0xbf){;}return(11);}//等键放开,返回键值,按键1
	else if(PORTC==0xb7)			{while(PORTC!=0xbf){;}return(12);}//等键放开,返回键值,按键1

	PORTC=0x7f;
	if(PORTC==0x7e)					{while(PORTC!=0x7f){;}return(13);}//等键放开,返回键值,按键1
	else if(PORTC==0x7d)			{while(PORTC!=0x7f){;}return(14);}//等键放开,返回键值,按键1
	else if(PORTC==0x7b)			{while(PORTC!=0x7f){;}return(15);}//等键放开,返回键值,按键1
	else if(PORTC==0x77)			{while(PORTC!=0x7f){;}return(16);}//等键放开,返回键值,按键1
	}
	return(0);	
}

//*******忙标志*************************/

uchr busy(void) 
{
 	uchr dat;
	PORTBbits.RB3=1;//cd=1; 
	PORTBbits.RB0=1;//wr=1; 
	PORTD=0;
	LATD=0;
	TRISD=0x00;//d口为写操作口 
	PORTD=0xff;
	PORTBbits.RB1=0;//rd=0;
	TRISD=0xff;//d口为读操作口
	dat=PORTD;
	PORTBbits.RB1=1;//rd=1;
	return(dat);
}
//*******读写状态判断*************************/
void rwchk(void)
{
	while(busy()&0x03!=0x03){}
}
//*******数据自动读状态判断*************************/
void auto_r_chk(void)
{
	while(busy()&0x04!=0x04){}
}
//*******数据自动写状态判断*************************/
void auto_w_chk(void)
{
	while(busy()&0x08!=0x08){}
}
//*******向数据口发送一个数据*************************/
void wr_data(uchr dat)
{
	rwchk();
	PORTD=0;
	LATD=0;
	TRISD=0x00;//d口为写操作口 
	PORTBbits.RB0=0;//wr=0; 
	PORTBbits.RB3=0;//cd=0; 
	PORTD=dat;
	delay(2);
	PORTBbits.RB0=1;//wr=1;
	PORTBbits.RB3=1;//cd=1; 
}
//*******向数据口发送一个命令*************************/
void wr_com(uchr com)
{
	rwchk();
	PORTD=0;
	LATD=0;
	TRISD=0x00;//d口为写操作口 
	PORTBbits.RB0=0;//wr=0; 
	PORTD=com;
	delay(2);
	PORTBbits.RB0=1;//wr=1;
}
//*******写一个数据写一个命令*************************/
void wr_data1com(uchr dat,uchr com)
{
	wr_data(dat);
	wr_com(com);
}

//*******写2个数据写一个命令*************************/
void wr_data2com(uchr dat1,uchr dat2,uchr com)
{
	wr_data(dat1);
	wr_data(dat2);
	wr_com(com);
}
//*******自动写*************************/
void auto_wr(uchr dat)
{
	auto_w_chk();
	PORTD=0;
	LATD=0;
	TRISD=0x00;//d口为写操作口 
	PORTBbits.RB3=0;//cd=0; 
	PORTBbits.RB0=0;//wr=0; 
	PORTD=dat;
	delay(2);
	PORTBbits.RB0=1;//wr=1;
	PORTBbits.RB3=1;//cd=1; 
}
//*******读数据*************************/
uchr read(void)
{
	uchr dat;
	rwchk();
	PORTBbits.RB3=0;//cd=0; 
	PORTD=0;
	LATD=0; 
	TRISD=0x00;//d口为写操作口 
	PORTD=0xff;
	PORTBbits.RB1=0;//rd=0;
	PORTD=0;
	LATD=0;
	TRISD=0xff;//d口为读操作口
	dat=PORTD;
	delay(2);
	PORTBbits.RB1=1;//rd=1;
	PORTBbits.RB3=1;//cd=1;
 	return(dat);
}
//*******自动读数据*************************/
uchr auto_rd(void)
{
	uchr dat;
	auto_r_chk();
	PORTBbits.RB3=0;//cd=0; 
	TRISD=0x00;//d口为写操作口 
	PORTD=0xff;
	PORTBbits.RB1=0;//rd=0;
	TRISD=0xff;//d口为读操作口
	dat=PORTD;
	delay(2);
	PORTBbits.RB1=1;//rd=1;
	PORTBbits.RB3=1;//cd=1;
	TRISD=0x00;//d口为写操作口  
 	return(dat);
}

//*******lcd清屏********************************/	
void clr_lcd(void)
{
	uint i;
	wr_data2com(0,0,0x24);
	wr_com(0xb0);
	for(i=0;i<0x2000;i++)
	{
		auto_wr(0x00);
	}
	wr_com(0xb2);
	wr_data2com(0,0,0x24);	
}
//*******lcd初始化********************************/	
void initial(void)
{
	PORTB=0;
	LATB=0;
	ADCON1=0x0e;
	TRISB=0xe0;//输出
	LATA=0;
	PORTA=0;
	ADCON1=0x0f;
	CMCON=0x07;
	TRISA=0x00;
	PORTC=0;
	LATC=0;
	TRISC=0x0f;	
	PORTBbits.RB4=0;
	delay(2);
	PORTBbits.RB4=1;//lcd复位
	PORTBbits.RB2=0;//ce=0; 
//	wr_data2com(0,0,0x40);
//	wr_data2com(16,0,0x41);
	wr_data2com(0,0,0x42);
	wr_data2com(16,0,0x43);
//	wr_data2com(0,0,0x22);
	wr_com(0xa7);
	wr_com(0x80);
	wr_com(0x98);

	
	clr_lcd();
	
}
//************************************
//设置光标
//************************************
void setgb(unsigned char lin,unsigned char column)
{

	wr_com(0x9b);

	wr_data2com( lin, column, 0x21); //set address

}


void ShowChar(unsigned char lin,unsigned char column,unsigned char ch)
{
	unsigned char i;
	unsigned char dat;
	unsigned int StartAddr;
	StartAddr=(uint)lin*16 +(uint)column; //定位起始行
	for(i=0;i<16;i++)
	{
		dat=ASCII816[ ch-0x20 ][i];
		wr_data2com( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //set address
		wr_data1com( dat, 0xc4);
		StartAddr=StartAddr + 16;
	}
}
//纯数字显示
//显示大小:8*16
void ShowCharnum(unsigned char lin,unsigned char column,unsigned char ch)
{
	unsigned char i;
	unsigned char dat;
	unsigned int StartAddr;
	StartAddr=(uint)lin*16 +(uint)column; //定位起始行
	for(i=0;i<16;i++)
	{
		dat=ASCII8_16[ ch ][i];
		wr_data2com( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //set address
		wr_data1com( dat, 0xc4);
		StartAddr=StartAddr + 16;
	}
}
//显示一个大号的数字
//大小:40*64
void ShowChD(unsigned char lin,unsigned char column,unsigned char ch)
{
	unsigned int i;
	unsigned int StartAddr;
	StartAddr=(uint)lin*16 +(uint)column; //定位起始行
	for(i=0;i<64;i++)
	{
		wr_data2com( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //set address
		wr_data1com( chD[ch][i*5], 0xc0);
		wr_data1com( chD[ch][i*5+1], 0xc0);
		wr_data1com( chD[ch][i*5+2], 0xc0);
		wr_data1com( chD[ch][i*5+3], 0xc0);
		wr_data1com( chD[ch][i*5+4], 0xc4);
		StartAddr=StartAddr + 16;
	}
}
//显示一个大号的整形数字
//大小:40*64
void Shownum(unsigned char lin,unsigned char column,uchr num)
{
	unsigned char nm[3];
	uchr	ii;
	nm[0]=num%10;
	nm[1]=num/10%10;
	nm[2]=num/100%10;
	for(ii=0;ii<3;ii++)
	{
	ShowChD(lin,column+ii*5,nm[2-ii]);
	}
}
//显示一个汉字(16*16点阵)
//lin:行(0-7), column: 列(0-7)
//hzcode: 汉字代码(自定义的)
void ShowHZ(unsigned char lin,unsigned char column,unsigned int hzcode)
{
	unsigned char i;
	unsigned int StartAddr;
	StartAddr=(uint)lin*16 + (uint)column; //定位起始行
	for(i=0;i<16;i++)
	{
		wr_data2com( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);
		wr_data1com( HZTable[hzcode][i*2], 0xc0); //左半部 地址加一
		wr_data1com( HZTable[hzcode][i*2+1], 0xc4); //右半部 字模地址加一
		StartAddr=StartAddr + 16;
	}
}
//显示一个汉字(40*35点阵)
//lin:行(0-7), column: 列(0-7)
//hzcode: 汉字代码(自定义的)
void ShowHZD(unsigned char lin,unsigned char column,unsigned int hzcode)
{
	unsigned char i,j;
	unsigned int StartAddr;
	StartAddr=(uint)lin*16 +(uint)column; //定位起始行
	for(i=0;i<35;i++)
	{
	wr_data2com( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //定位当前操作位置
	for(j=0;j<5;j++){ wr_data1com( HZTable[hzcode][i*5+j], 0xc0);} //显示当前一行
	StartAddr=StartAddr + 16;
	}
}

/*----------------------------------------------------------------------------------------------------*/
//反显一个字符
//lin:行(0-7), column: 列(0-15)
void ReverseShowChar(unsigned char lin,unsigned char column)
{
unsigned char i;
unsigned char dat;
unsigned int StartAddr;
StartAddr=(uint)lin*16 +(uint)column; //定位起始行
for(i=0;i<16;i++)
{
wr_data2com( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //set address
wr_com( 0xc5 ); //数据一次读,地址不变
dat=read(); //读入数据
delay(2);
dat=~dat; //取反
wr_data1com( dat, 0xc4); //送回
StartAddr=StartAddr+ 16;
}
}
/*----------------------------------------------------------------------------------------------------*/
//反显一个字符
//lin:行(0-7), column: 列(0-15)
void Rev_string(unsigned char lin,unsigned char column,uchr num)
{
unsigned char i;
for(i=0;i<num;i++)
{
	ReverseShowChar(lin,(column+i));
}
}


//////////////////////////////
//显示一副图片
//**********************************
void ShowPicture(unsigned char Startline,unsigned char Startcolumn,unsigned char LineWidth,unsigned char ColumnWidth,unsigned int address)
{
unsigned char i,j;
unsigned int StartAddr; 
StartAddr=(uint)Startline*16 + (uint)Startcolumn; //定位起始位置 
	for(i=0;i<ColumnWidth;i++)
	{ 
		wr_data2com( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //set address
		for(j=0;j<LineWidth;j++)
		{
			wr_data1com( CBYTE[address + i*LineWidth+ j ], 0xc0);
		}
		StartAddr=StartAddr + 16;
	}
}

////////////////////////
/////////////////////
//图形函数,用于描点画图
//-------------------
//在指定位置显示一个点
//如果显示屏超过了256*256,请修改这个函数 PointX,PointY的类型
//Mode 1:显示 0:清除该点
void Pixel(unsigned char PointX,unsigned char PointY, uchr Mode)
{
unsigned int StartAddr=0;
unsigned char dat;
 
StartAddr=(uint)PointX*16 + (uint)PointY/8;
dat=0xf0+7-PointY%8;
if(Mode) dat=dat|0x08;
 
wr_data2com( (unsigned char)(StartAddr),(unsigned char)(StartAddr>>8),0x24 ); //设置该点所在单元地址
wr_com(dat);
}
 
//-----------------------
//划线函数
void Line( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, uchr Mode)
{
unsigned char x,y;
double k,b;
 
	if( fabs(y1-y2) <= fabs(x1-x2) ) // |k|<=1
	{
		k=(float)(y2-y1) / (float)(x2-x1) ;
		b=y1-k*x1;
 
		if( x1 <= x2 )
		{
			for(x=x1;x<=x2;x++)
			{
				y=k*x+b;
				Pixel(x, y, Mode);
			}
		}
		else
		{
			for(x=x2;x<=x1;x++)
			{ y=k*x+b;
			Pixel(x, y, Mode);
			}
		}
	}
	else // abs(y1-y2) > abs(x1-x2) |K|>1
	{
		k=(float)(x2-x1) / (float)(y2-y1) ;
		b=x1-k*y1;
 
		if( y1 <= y2 )
		{
			for(y=y1;y<=y2;y++)
			{ x=k*y+b;
			Pixel( x , y,Mode );
			}
		}
		else
		{
			for(y=y2;y<=y1;y++)
			{ x=k*y+b;
			Pixel( x , y,Mode );
			}
		}
	}
}
 

//显示一行字符串
//lin:行
//lineheadaddr: 此行汉字代码区首地址

void ShowString(unsigned char lin,unsigned char column,uchr nn,rom static char *s)//数组类形参指定在程序存储器中
{
	unsigned char i,j;
	for( i= column,j=0; i< column+nn ; )
    {
      	if(i<16)
      	{ShowChar(lin, i , *s);
      	i++;
      	s++;}
      	else
      	{
      	ShowChar((lin+20), (i-16 ), *s);
      	i++;
      	s++;
      	}
    }
}



	
void main(void)
{
	uchr 	cc1;

	cc2=0;
	initial();

    for(cc1=0;cc1<4;cc1++)
    {
    	ShowHZ( 16,(6+cc1*2),cc1);
    } 
/*
    for(cc1=6;cc1<9;cc1++)
    {
        ShowHZ(26,(10+cc1*2),cc1);
    }
*/
	ShowPicture(10,1,4,32,0); 
	ShowString(60,2,12,"welcome you!");

	Rev_string(16,6,8);

//	ReverseShowChar(40,5);
//	Pixel(80,7,1);
	Line(80,0,80,127,1);
	Line(81,0,81,127,1);
//	setgb(15,15);
	while(1)
	{
		switch(get_key())
		{
			case 1:cc2=1;clr_lcd();ShowString(0,0,7,"menu:  ");ShowString(20,0,7,"floor: ");ShowString(40,0,7,"next:  ");ShowString(60,0,7,"key is:");break;
			case 2:cc2=2;clr_lcd();ShowString(110,0,4,"back");Rev_string(110,0,4);ShowString(110,12,4,"next");break;
			case 3:cc2=3;clr_lcd();ShowString(110,0,4,"back");ShowString(110,12,4,"next");Rev_string(110,12,4);break;
			case 4:cc2=4;break;
			case 5:cc2=5;Shownum(50,1,cc3);break;
			case 6:cc2=6;break;
			case 7:cc2=7;break;
			case 8:cc2=8;break;
			case 9:cc2=9;break;
			case 10:cc2=10;break;
			case 11:cc2=11;break;
			case 12:cc2=12;break;
			case 13:cc2=13;break;
			case 14:cc2=14;break;
			case 15:cc2=15;break;
			case 16:cc2=16;break;
			default:break;
		}
		cc3++;	
	}
}







⌨️ 快捷键说明

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