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

📄 lcd.c

📁 课程设计做得一个基于51单片机的声光报警电路
💻 C
字号:
#include"reg52.h"
#include"intrins.h"
#include"ziku.h"

#include"def.h"

sbit rs = P3^4;
sbit rw = P3^5;
sbit ep = P3^6;

uchar code AD_TABLE[]={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,      //第一行汉字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,      //第二行汉字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,      //第三行汉字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,      //第四行汉字位置
};

uchar value[];

void delay(uint ms)
{  
   uchar i;
   while(ms--)
     {
	   for(i=0;i<250;i++)
	     {
		    _nop_();
		    _nop_();
			_nop_();
			_nop_();
		 }
     }
}

bit lcd_busy()
{
   bit result;
   rs=0;
   rw=1;
   ep=1;
   _nop_();
   _nop_(); 
   _nop_();
   _nop_();
   result=(bit)(P1&0x80);
   ep=0;
   return result;
}

void wcmd(uchar cmd)
{
  while(lcd_busy());
   rs=0;
   rw=0;
   ep=0;
   _nop_();
   _nop_();
   P1=cmd;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   ep=1;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   ep=0;
}

void wdat(uchar dat)
{
   while(lcd_busy());
   rs=1;
   rw=0;
   ep=0;
   P1=dat;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   ep=1;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   ep=0;
}

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

}

void cleartext()
{
    wcmd(0x30);      //8BitMCU,基本指令集合
	wcmd(0x01);
}

void putstr(uchar row,uchar col,uchar *puts)
{
   wcmd(0x30);      //8BitMCU,基本指令集合
   wcmd(AD_TABLE[8*row+col]);      //起始位置
     while(*puts != '\0')      //判断字符串是否显示完毕
     {
           
           wcmd(AD_TABLE[8*row+col]);
           wdat(*puts);      //一个汉字要写两次
           puts++;
           wdat(*puts);
           puts++;
           col++;
		  if(col==8)            //判断换行
             {            //若不判断,则自动从第一行到第三行
                 col=0;
                 row++;
              }
          if(row==4) row=0;      //一屏显示完,回到屏左上角
     }
}

void hanzi(uchar row,uchar col,uchar *puts)
{
   wcmd(0x30);      //8BitMCU,基本指令集合
   wcmd(AD_TABLE[8*row+col]);      //起始位置 
   wcmd(AD_TABLE[8*row+col]);
   wdat(*puts);       //一个汉字要写两次	
}

void putbmp(uchar *put)
{
   uchar x,y;
   for(y=0;y<32;y++)
     for(x=0;x<8;x++)
	   {
	      wcmd(0x80+y);
		  wcmd(0x80+x);
		  wdat(*put);
		  put++;
		  wdat(*put);
		  put++;
	   }
	for(y=0;y<32;y++)
	   for(x=8;x<16;x++)
	     {
		    wcmd(0x80+y);
			wcmd(0x80+x);
			wdat(*put);
			put++;
			wdat(*put);
			put++;
		 }
}

void clearbmp()
{   
   uchar x,y;
   lcd_init();
   wcmd(0x34);
   wcmd(0x3e);
   for(y=0;y<32;y++)
     for(x=0;x<8;x++)
	   {
	      wcmd(0x80+y);
		  wcmd(0x80+x);
		  wdat(0x00);
		  wdat(0x00);
		  
	   }
	for(y=0;y<32;y++)
	   for(x=8;x<16;x++)
	     {
		    wcmd(0x80+y);
			wcmd(0x80+x);
			wdat(0x00);
			wdat(0x00);
		 }
}

void put_5_7(uchar row,uchar col,uchar dat)
{
	uchar i;
	uint a;
	a = 2550/dat-10;
	for(i=0;i<4;i++)
	{
		value[i] = a%10;
		a = a/10;
	}

	if(value[3] != 0)	{
		for(i=0;i<16;i++)
		{	
			wcmd(0x80+row*16+i);
			wcmd(0x80+col);
			wdat(ziku[value[3]*16+i]);      
			wdat(ziku[value[2]*16+i]);	 
		}
		for(i=0;i<16;i++)
		{
			wcmd(0x80+row*16+i);
			wcmd(0x80+col+1);
			wdat(ziku[value[1]*16+i]);
			wdat(ziku[160+i]);
		
		}
		for(i=0;i<16;i++)
		{
			wcmd(0x80+row*16+i);
			wcmd(0x80+col+2);
			wdat(ziku[value[0]*16+i]);
			wdat(ziku[176+i]);	
		}
	}
	else
	{
		if(value[2] != 0)
		{
			for(i=0;i<16;i++)
			{
				wcmd(0x80+row*16+i);
				wcmd(0x80+col);
				wdat(ziku[value[2]*16+i]);
				wdat(ziku[value[1]*16+i]);		
			}
	
			for(i=0;i<16;i++)
			{
				wcmd(0x80+row*16+i);
				wcmd(0x80+col+1);
				wdat(ziku[160+i]);
				wdat(ziku[value[0]*16+i]);	
			}
			for(i=0;i<16;i++)
			{
				wcmd(0x80+row*16+i);
				wcmd(0x80+col+2);
				wdat(ziku[176+i]);	
			}
		}
		else
		{
			for(i=0;i<16;i++)
			{
				wcmd(0x80+row*16+i);
				wcmd(0x80+col);
				wdat(ziku[value[1]*16+i]);
				wdat(ziku[160+i]);		
			}

			for(i=0;i<16;i++)
			{
				wcmd(0x80+row*16+i);
				wcmd(0x80+col+1);
				wdat(ziku[value[0]*16+i]);
				wdat(ziku[176+i]);	
			}		
		}	
				
	}
} 

⌨️ 快捷键说明

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