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

📄 st7920.c

📁 基于ARM的电梯控制程序
💻 C
字号:
/*本程序为液晶模块ST7920的驱动程序*/
#include "config.h"
//全局变量声明
const uint8 RowNum[4]={0x80,0x90,0x88,0x98};	//定义每一行在LCM中的RAM首地址
//**************************************************
	void Delay(uint16 n)
{ 
	int i;
  	for (i=n;i>0x00;i--);
}

/*********串行传送一字节数据************************/
void SendByte(uint8 dat)               
{
 	int i;
 	for (i=0;i<8;i++)
    {
     	IO1CLR=ST7920_Clk;               //SCK=0
     	if((dat & 0x80)!=0)
     	IO1SET=ST7920_Sda;               //SID=1
     	else
     	IO1CLR=ST7920_Sda;               //SID=0
     	Delay(5);
		IO1SET=ST7920_Clk;               //SCK=1;
     	dat = (dat<<1);
    }
}

/****************写控制指令****************************/
	void SendCmd(uint8 dat)                
{
 	SendByte(0xf8);
 	SendByte(dat & 0xf0);
 	SendByte((dat<<4)&0xf0);
}

/************写显示数据;也可以写一个单字节字符********/
	void SendDat(uint8 dat)                
{
 	SendByte(0xfa);
 	SendByte(dat & 0xf0);
 	SendByte((dat<<4)&0xf0);
}
/********显示单字符***
x_addr 	    显示RAM地址
data	    字符值
*******************************************/
	void DispChar(uint8 x_addr, uint8 data)
{   
	SendCmd(x_addr);
	SendDat(data);
	
}


/********显示字符口串,多余位置以空格填补***
x_addr 	显示RAM地址
p	    指向字符串的指针
*******************************************/
	void DispChars(uint8 Addr,uint8 *p,uint8 Num)
{   
	uint8 i;
	SendCmd(Addr);
	for(i=0;i<Num;i++)
	SendDat(*(p+i));
}

void Disp(uint8 x_addr, uint8 *p)
{   
	
	uint8 i,flag=0;
	SendCmd(x_addr);
	for(i=0;i<14;i++)
	{
	if(*(p+i)=='\0')
	flag=1;
	if(flag==0)
	SendDat((uint8)*(p+i));
	else
	SendDat(' ');
	}
	
	
}

/***************写一个汉字到 LCD 屏指定位置*************
x_add 显示 RAM 地址
high/low 为显示汉字的编码
****************************************************/
void Display(uint8 x_add,uint8 high,uint8 low)
{
 	SendCmd(x_add);
 	SendDat(high);
 	SendDat(low);
}

/****************************************************************************
* 名称:PreDisp()
* 功能:显示预处理
* 入口参数:data	输入输出的数据
			*p		对应的字符串指针
* 出口参数:无
****************************************************************************/
void PreDispIndoorCall(uint8 *data,uint8 *p)
{
	uint8 i;
	for(i=0; i<16; i++) 
    {  
    if((0x40&(*(data+i)))!=0)
    *(p+i)=0x08;
    else
    *(p+i)=0x2d;
    }
} 
/****************************************************************************
* 名称:PreDisp()
* 功能:显示预处理
* 入口参数:data	输入输出的数据
			*p		对应的字符串指针
* 出口参数:无
****************************************************************************/
void PreDispOutdoorCallUp(uint8 *data,uint8 *p)
{
	uint8 i;
	for(i=0; i<16; i++) 
    {  
    if((0x20&(*(data+i)))!=0)
    *(p+i)=0x08;
    else
    *(p+i)=0x2d;
    }
} 
/****************************************************************************
* 名称:PreDisp()
* 功能:显示预处理
* 入口参数:data	输入输出的数据
			*p		对应的字符串指针
* 出口参数:无
****************************************************************************/
void PreDispOutdoorCallDown(uint8 *data,uint8 *p)
{
	uint8 i;
	for(i=0; i<16; i++) 
    {  
    if((0x10&(*(data+i)))!=0)
    *(p+i)=0x08;
    else
    *(p+i)=0x2d;
    }
} 
void lcdclr(void)
{ uint8 lcdlow,lcdlie;  
  //清屏
       for(lcdlow=0;lcdlow<4;lcdlow++)
         for(lcdlie=0;lcdlie<8;lcdlie++)
           Display(RowNum[lcdlow]+lcdlie,0xA1,0xA0);   //0xA1A0为空格

}
//*****************************************************
	void InitLcm(void)           //初始化 LCM
{
 	IO1DIR|=(ST7920_Cs|ST7920_Clk|ST7920_Sda|ST7920_Rst);
 	IO1SET=ST7920_Cs;		// 高电平使能
	IO1CLR=ST7920_Rst;
	Delay(0xff);
	IO1SET=ST7920_Rst;
 	Delay(0xff);
 	SendCmd(0x30);              //功能设置:一次送 8 位数据,基本指令集
 	SendCmd(0x04);              //点设定 :显示字符/ 光标从左到右移位,DDRAM 地址加一
 	SendCmd(0x0f);              //显示设定:开显示 ,显示光标,当前显示位反白闪动
 	SendCmd(0x01);              //清DDRAM
 	SendCmd(0x02);              //*DDRAM 地址归位
 	SendCmd(DDRAM_0);   		 //DDRAM
 	SendCmd(off_cursor);		 //关光标 
}



	



⌨️ 快捷键说明

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