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

📄 12864_serial_5410_new.c

📁 C语言代码
💻 C
字号:
#include   <stc12c5410ad.h>   
#include   <intrins.h> 
#include   "string.h"

#define uint  unsigned int
#define uchar unsigned char
  
sbit   sclk=P3^2;//clock   input                                         同步时钟输入端   
sbit   sid=P3^3;//data   input/output                         串行数据输入、输出端   
//sbit   RS_CS=P3^5;//chip   select                                         片选端   
//sbit   PSB  =P3^6;//serial   mode   select                         串口模式   
//sbit   RST  =P1^2; 
  
xdata uchar wave[256];
//idata uchar dpdata[128];

void   	delay(uchar n);    
void   	delayint(uint n);  

void   	sendbyte(uchar dat);   
uchar   receievebyte(void);   
bit   	readbf();   
void   	sendcmd(uchar dat);   
void   	senddat(uchar dat);   
void   	display(uchar x_add,uchar dat1,uchar dat2);   
void	initlcm(void);   
void   	write_str(char * str);
void 	clrscreen();

uint r_power2(uchar n);
void scalewave();
void buildwave();
void showwave();
void storewave();
//uint reverse16(uint);


void   main(void)   
{ 
// 	CLK_DIV=0x03;//8分频工作 
// uchar i;
	initlcm();  
	clrscreen();

	storewave();
	scalewave();
	buildwave();
	showwave();


	while(1);
}   

void   delay(uchar i)     
{   
	for(;i>0;i--);
}   
void   delayint(uint i)     
{   
	for(;i>0;i--);
}   
//串行发送一字节数据   
void   sendbyte(unsigned   char   dat)   
{   
    unsigned   char   i;   
    for(i=0;i<8;i++)   
    {   
 		sclk=0;   
        if(dat&0x80)
	   		sid=1;
	    else
     		sid=0;
        sclk=1;   
        dat=dat<<1;   
    }   
}  
 
//串行接收一字节数据   
uchar   receievebyte(void)   
{   
	unsigned   char   i,d1,d2;  
    sid=1;
    for(i=0;i<8;i++)   
    {   
    	sclk=0;delay(100);   
        sclk=1;   
        if(sid)d1++;   
        d1=d1<<1;   
    }   
    for(i=0;i<8;i++)   
    {   
 		sclk=0;delay(100);   
 	    sclk=1;   
        if(sid)d2++;   
        	d2=d2<<1;   
    }   
    return   (d1&0xF0+d2&0x0F);   
} 
  
//读取标志位BF   
bit   readbf()   
{   
	bit bf;
    uchar   dat;   
    sendbyte(0xFA);//11111,01,0   RW=1,RS=0   
    dat=receievebyte();  
	P1=~dat;
    if(dat>0x7F)
		bf=1;
	else   
		bf=0;   
    return   bf;   
} 
              
//写控制命令   
void   sendcmd(unsigned   char   dat)   
{   
	while(readbf());
//  RS_CS=1;   
	sendbyte(0xF8);//11111,00,0   RW=0,RS=0   同步标志   
    sendbyte(dat&0xF0);//高四位   
    sendbyte((dat&0x0F)<<4);//低四位   
//  RS_CS=0;   
}   
//写显示数据或单字节字符   
void   senddat(unsigned   char   dat)   
{   
	while(readbf());
//  RS_CS=1;   
	sendbyte(0xFA);//11111,01,0   RW=0,RS=1   
    sendbyte(dat&0xF0);//高四位   
    sendbyte((dat&0x0F)<<4);//低四位   
//  RS_CS=0;   
}    
           
/*写汉字到LCD   指定的位置      x_add显示RAM的地址      dat1/dat2显示汉字编码  */   
void   display(unsigned   char   x_add,unsigned   char   dat1,unsigned   char   dat2)   
{   
    sendcmd(x_add);//1xxx,xxxx   设定DDRAM   7位地址xxx,xxxx到地址计数器AC   
    senddat(dat1);   
    senddat(dat2);   
}   
//初始化   LCM   

void   initlcm(void)   
{   
//  RST=0;   
//  RS_CS=0;   
//  PSB=0;//serial   mode   
    delayint(1000);   
//  RST=1;   
    sendcmd(0x30);//功能设置,一次送8位数据,基本指令集   
    sendcmd(0x0C);//0000,1100     整体显示,游标off,游标位置off   
    sendcmd(0x01);//0000,0001   清DDRAM   
    sendcmd(0x02);//0000,0010   DDRAM地址归位   
//    sendcmd(0x80);//1000,0000   设定DDRAM   7位地址000,0000到地址计数器AC   
//  sendcmd(0x04);//点设定,显示字符/光标从左到右移位,DDRAM地址加   一   
//  sendcmd(0x0F);//显示设定,开显示,显示光标,当前显示位反白闪动   
}   

void write_str(char * str)
{
	uchar i;
	for(i=0;i<strlen(str);i++)
		senddat(*(str+i));
}

void clrscreen()
{
	uchar i,j;
	sendcmd(0x36);
	for(i=0;i<16;i++)
	{
		for(j=0;j<32;j++)
		{
			sendcmd(0x80+j);
			sendcmd(0x80+i);
			senddat(0);
			senddat(0);
		}
	}
}

uint r_power2(uchar n)
{
	switch(n)
	{
		case 15:return 1;break;
		case 14:return 2;break;
		case 13:return 4;break;
		case 12:return 8;break;			
		case 11:return 16;break;
		case 10:return 32;break;
		case 9:return 64;break;
		case 8:return 128;break;	
		case 7:return 256;break;
		case 6:return 512;break;
		case 5:return 1024;break;
		case 4:return 2048;break;			
		case 3:return 4096;break;
		case 2:return 8192;break;
		case 1:return 16384;break;
		case 0:return 32768;break;
		default:break;
	}
}

void scalewave()
{
	uchar i=0;
	do
	{
//		wave[i]=wave[i]*3/16;
		wave[i]=(uchar)(wave[i]*3.0/8.0);
		i--;
	}
	while(i!=0);
}

void buildwave()
{
/*	uchar i,j,k,m;
	for(i=0;i<8;i++)
	{
		for(m=0;m<2;m++)
		{
			for(j=0;j<8;j++)
			{
				dpdata[i*16+m*8+j]=r_power2(7-j);
				for(k=m*8+j;k>0;k--)
				{
					if(wave[i*16+m*8+j]==wave[i*16+k-1])
					{
						dpdata[i*16+m*8+j]=r_power2(7-j)+dpdata[i*16+k-1];
						break;
					}
				}
			}
		}
	}*/
}

void showwave()
{
/*	uchar i;
	sendcmd(0x36);
	for(i=0;i<128;i++)
	{
		sendcmd(0x80+wave[i]);
		sendcmd(0x80+i/16);
		senddat(dpdata[2*(i/2)]);
		senddat(dpdata[2*(i/2)+1]);		
	}*/
	
	uchar i,low;

	sendcmd(0x36);
	for(i=0;i<128;i++)
	{		
		if(wave[i]<16)
			low=1;
		else
			low=0;
		sendcmd(0x80+(47-wave[i])%32);
		sendcmd(0x80+i/16+8*low);
		senddat((char)(r_power2(i%16)>>8));
		senddat((char)r_power2(i%16));
	}
}

void storewave()
{
	uchar i;
	for(i=0;i<128;i++)
	{
		wave[i]=i;
	}
}

/*uint reverse16(uint w)
{
 	uint chDst; 
    uchar i;
 	chDst=w&1;   
 	for( i=0; i<15; i++) 
  	{
		chDst<<=1,
	 	w>>=1, 
		chDst|=(w&1);
    }
  
 	return chDst; 
}*/

⌨️ 快捷键说明

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