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

📄 lcd_disp.c

📁 2005年全国大学生电子设计竞赛论文集
💻 C
字号:
#include "spce061v004.h"
#define lcd_data_read      0x0030    //数据读
#define lcd_data_read_en   0x0070    //数据读使能
#define lcd_data_write     0x0020	 //数据写	
#define lcd_data_write_en  0x0060	 //数据写使能
#define lcd_comm_write     0x0000    //写命令
#define lcd_comm_write_en  0x0040 	 //写命令使能
#define lcd_status_read    0x0010    //状态读
#define lcd_status_read_en 0x0050    //状态读使能
//=========================================================================================
/*函数名称:LCD_DISP
//功能:LCD显示
//参数1.(unsigned int *PTR)32个要显示的数据
//    2. flash(16位)0--15,表示第几位闪烁
//                  16--31 表示第2行的闪烁
//                  安排是从左到右,从上到下
//        如果不需要闪烁的话,flash的值只要大于31即可,通常32就可以搞定,^_^  
*/
//=========================================================================================
void initial_lcd();
unsigned int read_busy();

unsigned int *point,flash;
unsigned int busy;   //判断LCD是否忙,

void lcd_disp(unsigned int *point,unsigned int flash)
{
	unsigned int i;     //决定用于显示哪一位
	unsigned int bitdisp;
	unsigned int disptemp;
	busy=read_busy();  
	while(busy)
	{
			busy=read_busy();           //busy!=0为忙,否则为不忙
	}
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write;
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write_en;
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x8000|lcd_comm_write_en;
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x8000|lcd_comm_write;   //设置开始显示的位置,第一行第一位
	for(i=0;i<16;i++)
	{
		disptemp=point[i];
		disptemp=disptemp<<8;
		busy=read_busy();
		while(busy)
		{
				busy=read_busy();           //busy!=0为忙,否则为不忙
		}
		*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_data_write;
		*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_data_write_en;
		*P_IOB_Data=(*P_IOB_Buffer&0x008f)|disptemp|lcd_data_write_en;
		*P_IOB_Data=(*P_IOB_Buffer&0x008f)|disptemp|lcd_data_write;
	}	
	busy=read_busy();  
	while(busy)
	{
			busy=read_busy();           //busy!=0为忙,否则为不忙
	}
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write;
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write_en;
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0xc000|lcd_comm_write_en;
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0xc000|lcd_comm_write;   //设置开始显示的位置,第2行第一位
	for(i=16;i<32;i++)
	{
		disptemp=point[i];
		disptemp=disptemp<<8;
		busy=read_busy();
		while(busy)
		{
				busy=read_busy();           //busy!=0为忙,否则为不忙
		}
		*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_data_write;
		*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_data_write_en;
		*P_IOB_Data=(*P_IOB_Buffer&0x008f)|disptemp|lcd_data_write_en;
		*P_IOB_Data=(*P_IOB_Buffer&0x008f)|disptemp|lcd_data_write;
	}	
	if(flash<=15)
	{	
		bitdisp=flash<<8;
		busy=read_busy();  
		while(busy)
		{
				busy=read_busy();           //busy!=0为忙,否则为不忙
		}
		*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write;
	    *P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write_en;
		*P_IOB_Data=(*P_IOB_Buffer&0x008f)|(0x8000+bitdisp)|lcd_comm_write_en;
		*P_IOB_Data=(*P_IOB_Buffer&0x008f)|(0x8000+bitdisp)|lcd_comm_write;   
	}
	if((flash>=16)&&(flash<=31))
	{
		bitdisp=(flash-16)<<8;
		busy=read_busy();  
		while(busy)
		{
				busy=read_busy();           //busy!=0为忙,否则为不忙
		}
		*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write;
	    *P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write_en;
		*P_IOB_Data=(*P_IOB_Buffer&0x008f)|(0xc000+bitdisp)|lcd_comm_write_en;
		*P_IOB_Data=(*P_IOB_Buffer&0x008f)|(0xc000+bitdisp)|lcd_comm_write; 
	}	  
}			
	


//=========================================================================================
//函数initial_lcd()用于初始化LCD
//硬件连接方法:notice
//IOB7--15负责输出数据
//RS     IOB5
//E      IOB6
//RW     IOB4
//=========================================================================================
void initial_lcd()
{
    *P_IOB_Dir=(*P_IOB_Dir&0x008f)|0xff70;            //设置IOB为低电平输出口
    *P_IOB_Attrib=(*P_IOB_Attrib&0x008f)|0xff70;
    *P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x0000;
	busy=read_busy();           //busy!=0为忙,否则为不忙
	while(busy)
	{
			busy=read_busy();           //busy!=0为忙,否则为不忙
	}                    //等待LCD
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write;
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write_en;
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x3800|lcd_comm_write_en;//系统设置 8位 两行,5*7点阵
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x3800|lcd_comm_write;
	busy=read_busy();
	while(busy)
	{
			busy=read_busy();           //busy!=0为忙,否则为不忙
	}
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write;
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write_en;
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x0d00|lcd_comm_write_en;   //显示,不显示光标,启用闪烁
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x0d00|lcd_comm_write;
	busy=read_busy();
	while(busy)
	{
			busy=read_busy();           //busy!=0为忙,否则为不忙
	}
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write;
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write_en;
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x0100|lcd_comm_write_en;  //清屏
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x0100|lcd_comm_write;
	busy=read_busy();
	while(busy)
	{
			busy=read_busy();           //busy!=0为忙,否则为不忙
	}
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write;
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write_en;
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x0200|lcd_comm_write_en;     //回到第一行第一列
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x0200|lcd_comm_write;
	busy=read_busy();
	while(busy)
	{
			busy=read_busy();           //busy!=0为忙,否则为不忙
	}
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write;
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|lcd_comm_write_en;
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x0600|lcd_comm_write_en;    //显示地址模式加1
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x0600|lcd_comm_write;
}	
//=========================================================================================
//
//=========================================================================================	
unsigned int read_busy()
{
	unsigned temp;	
	
	*P_IOB_Dir=(*P_IOB_Dir&0x008f)|0x0070;                 //将高8位改为输入口去读取BUSY信号
	*P_IOB_Attrib=(*P_IOB_Attrib&0x008f)|0x0070;
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0xff00|lcd_status_read;
	*P_IOB_Data=(*P_IOB_Buffer&0x008f)|0xff00|lcd_status_read_en;
	
	temp=*P_IOB_Data;	
	temp&=0x8000;
	
	*P_IOB_Dir=(*P_IOB_Dir&0x008f)|0xff70;                 //恢复原先的低电平输出口
    *P_IOB_Attrib=(*P_IOB_Attrib&0x008f)|0xff70;
    *P_IOB_Data=(*P_IOB_Buffer&0x008f)|0x0000;	
	return temp;
}

/*
void main()
{
	unsigned int f[]={0x0020,0x0020,0x0020,0x0049,0x0020,0x0020,0x004c,0x006f,
					  0x0076,0x0065,0x0020,0x0059,0x006f,0x0075,0x0021,0x0020,
					  0x0020,0x0020,0x0020,0x0049,0x0020,0x0020,0x004c,0x006f,
					  0x0076,0x0065,0x0020,0x0059,0x006f,0x0075,0x0021,0x0020};
	initial_lcd();
	
//	lcd_disp(f,0);
//	lcd_disp(f,15);
//	lcd_disp(f,16);
//	lcd_disp(f,31);
	lcd_disp(f,32);

	
}			
*/  //测试用程序

⌨️ 快捷键说明

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