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

📄 lcddisp.c

📁 sl811hs 的驱动
💻 C
字号:
// edit by chendong ,2004-3-10

#include "vd.h"
#include "string.h"

#define LCD_ADDR_BASE 0x3fc4000
#define LCD_ADDR_WI (*(volatile unsigned *)(LCD_ADDR_BASE))                  //writing pointer for instruction 
#define LCD_ADDR_WD (*(volatile unsigned *)(LCD_ADDR_BASE+0x100))			 //writing pointer for data 
#define LCD_ADDR_RI (*(volatile unsigned *)(LCD_ADDR_BASE+0x200))            //reading pointer for instruction 
#define LCD_ADDR_RD (*(volatile unsigned *)(LCD_ADDR_BASE+0x300))            //reading pointer for data 

void lcd_init(void);   
void lcd_clear(void);
void lcd_delay(void);                   			//instand of lcd_testbusy() ,also used for 1200ns delay
void lcd_locate(B32 x,B32 y);           			//x for line [0..9],y for row [0..1]
void lcd_print(char data[],B32 length); 			//length is the length of int[] 
B32 ltoa(B32 value,char data[],B32 radix);         	//transfer value to string,radix=[2..36]

void lcd_delay(void)
{
	B32 temp;
	for(temp=0;temp<500;temp++);
}

void lcd_init(void)
{
	B32 temp;
	temp=EXTACON0_C;
	temp=temp&0x0000ffff;
	temp=temp|0x0e410000;
	EXTACON0_C=temp;            //set EXTACON0 mode--tACS1=0cycle tACC1=7cycle tCOS1=1cycle tCOH1=1cycle
 						 
 						 
 						 //Initialization start
    //rIOPDATA=0x80; 						 
 	for(temp=0;temp<2000000;temp++);			 	 //delay 40ms 
	LCD_ADDR_WI=0x0030; 				 //function set--000011x0xx   <==RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
 	for(temp=0;temp<500;temp++);					 //delay 100us
 	LCD_ADDR_WI=0x0030;					 //function set--000011x0xx (000011x0xx)
 	for(temp=0;temp<185;temp++);					 //delay 37us
 	LCD_ADDR_WI=0x000f;					 //disp on/off control--0000001dcb (0000001111)
 	for(temp=0;temp<500;temp++);					 //delay 100us
 	LCD_ADDR_WI=0x0001;					 //display clear--0000000001 (0000000001)
 	for(temp=0;temp<50000;temp++);					 //delay 10ms
 	LCD_ADDR_WI=0x0006;					 //entry mode set--00000001I/Ds (0000000110)
	//rIOPDATA=0x00;
							 //Initialization end
}

void lcd_clear(void)
{
	B32 temp;
	lcd_delay();
	LCD_ADDR_WI=0x01;						 //display clear--0000000001 (0000000001)
	for(temp=0;temp<50000;temp++);		     //to clear 1.2ms needed			  
}


void lcd_locate(B32 x,B32 y)
{
	if(x<10&&y<2)                            //is the x and y valid
	{
		lcd_delay();
		LCD_ADDR_WI=0x80+0x10*y+x;
	}
	 //firstline   80h~89h
	 //secondline  90h~99h				
	
}

void lcd_print(char data[] ,B32 length)
{				
	B32 i;
	for(i=0;i<length;i++)
	{
		lcd_delay();
		LCD_ADDR_WD=(B32)data[i];           //汉字的显示先写入高字节,再写入低字节,  注意下面的说明
	}
}						 

//应用示例
/*
	B32 temp;
    char data[22];   //max 10 chinese charaters in a line
        
    lcd_init();
    
    strcpy(data,"西安电子科技大学");
    lcd_locate(1,0);
    lcd_print(data,16);
    
    for(temp=0;temp<5000000;temp++);
    lcd_clear();
    
    strcpy(data,"宽带无线重点实验室");
    lcd_locate(0,0);
    lcd_print(data,18);
    strcpy(data,"移动自组织网节点平台");
    lcd_locate(0,1);
    lcd_print(data,20);
*/    

//说明

/*
//变量及函数说明

液晶总计有4个地址,分别用于指令的读写和数据的读写。
LCD_ADDR_BASE            为液晶的基地址,也就是写指令地址      
LCD_ADDR_WI              液晶写指令地址指针
LCD_ADDR_WD				 液晶写数据地址指针
LCD_ADDR_RI              液晶读指令地址指针
LCD_ADDR_RD              液晶读数据地址指针

使用方法:       LCD_ADDR_WI=0x0C                  将指令0x0c写入液晶

int lcd_testbusy(void);         液晶忙指示位测试程序,0表示不忙,1表示忙;
								该函数并不使用,因为既是检测到不忙也要延时1200ns,才可以在进行读写操作(见ST7920手册)          

void lcd_init(void);            液晶初始化函数,用于在上电复位后对液晶初始化(见手册)  
void lcd_clear(void);           液晶清除显示函数,操作后光标自动回到屏幕左上角
void lcd_delay(void);           由于不使用lcd_testbusy()函数,所以使用此函数加以延迟
void lcd_locate(int x,int y);   显示的定位函数,针对16×16的汉字定位,无法定位于16×8的奇数位置
								x为显示定位的列数,取值范围【0..9】,y为行数,取值范围【0..1】
								第一行DDRAM地址为80H~89H,第二行地址为90H~99H            液晶为160×32 即2行10列的汉字

void lcd_print(char data[],int length);  写显示数据函数
                                data[] 为欲写字符串数组名,一个汉字被存在占用两个char型变量空间,先存高字节,后存低字节
                                length为欲写字个数   写的字串应不超出一行的显示范围
								length 计算方法为一个16×16的汉字计为2,一个16×8的字母或符号计为1。将其和记为length
								如:
									char data[22]="信息科学研究所 101室";   //101前有一空格(见下”注意“)
									lcd_locate(0,0);
									lcd_print(data,20);
									
									显示结果为:在液晶的第一行显示:信息科学研究所 101室
									
									如果将20改为10,则:
									显示结果为:在液晶的第一行显示:信息科学研
									
									如将20改为17,则:
									显示结果为:在液晶的第一行显示:信息科学研究所 10
									
							注意:由于该液晶显示16×16汉字时,必须将其显示在偶对齐位置(见手册),故在101前加一空格,令‘室’字偶对齐	
									

*/


B32 ltoa(B32 value,char data[],B32 radix)
{
	char tempdata[255];
	B32 i=0,j=0;
	strcpy(data,"");		//clear the string
	if(radix>=2&&radix<=16)
	{
		while(1)
		{
			if(value%radix<10)
				tempdata[i]=(char)(value%radix+0x30);
			else
				tempdata[i]=(char)(value%radix+0x37);
			value=value/radix;
			i++;
			if(value==0||i==253) break;
    	}		
		for(j=0;j<i;j++)
		{
			data[j]=tempdata[i-j-1];
		}
		data[i]='\0';
	}
	else
		while(i<20) data[i++]='x';
	return i;
			
}

//lcd_locate(0,0);
//lcd_print(data,ltoa(temp,data,10));

⌨️ 快捷键说明

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