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

📄 display.c

📁 一个msp430与320*240加4*4键盘的菜单程序... ...!
💻 C
📖 第 1 页 / 共 2 页
字号:
//##############################################################################
//      液晶控制操作单元
//##############################################################################
#include <msp430x16x.h>
#include "math.h"
#include "asc_cosd.h"
#include "display.h"


#define Uchar unsigned char //变量类型标识的宏定义 
#define Uint unsigned int 
unsigned int    lcmcp,lcmdp;

//==============================================================================
//显示缓存分配 
#define BasePart1 0x00 //第一屏地址 0X0000 占用8K空间 
#define BasePart2 0x40 //第二屏地址 0X4000 占用8K空间 
#define BasePart3 0x80 //第三屏地址 0X8000 占用2K空间 
#define BasePart4 0x00 //第四屏地址 0X0000 占用2K空间 
//==============================================================================


//初始化参数配置数组 
Uchar const ParaSysTable8[]= { 0x30,0x87,0x07,0x27,0x42,0xf0,0x28,0x00}; 
Uchar const ParaScrTableA[]= //{0x00,BasePart1,0xF0,0x00,BasePart2,0xF0,0x00,BasePart3,0x00,BasePart4}; 
                             {0x0000,0x0000,0x00F0,0x00b0,0x0004,0x00F0,0x0000,0x0000,0x0000,0x0000};
                             //{0x00,0x00,0xef,0xb0,0x04,0xef,0x00,0x00,0x00,0x00};

#define SystemSet 0x40 //1335控制器定义 
#define Scroll    0x44 
#define SleepIn   0x53 
#define DispOn    0x59 
#define DispOff   0x58 
#define Ovlay     0x5b 
#define HdotScr   0x5a 
#define CsrForm   0x5d 
#define CgramAdr  0x5c 
#define CsrDirR   0x4c 
#define CsrDirL   0x4d 
#define CsrDirU   0x4e 
#define CsrDirD   0x4f 
#define CsrW      0x46 
#define CsrR      0x47 
#define mWrite    0x42 
#define mRead     0x43 

#define Busy      0x40 // 忙状态标志位0b0100 0000 
#define paraP9    0x28 // 相对于320 X 240 

//##############################################################################
//**********************************************/
//     接口设置
//     8位数据 :(DB0--DB7)   
//     输出口 :
//     控制信号:(/RES,/A0,/CS,/WR,/RD)
//     输出口:        
//**********************************************/ 
void lcd_init_io(void)
{
//      WDTCTL = WDTPW + WDTHOLD;        // 关闭看门狗
        
	KONGZHI_DIR = 0xff;                      //控制信号   /RES,C/D,CE,/WR,/RD
	KONGZHI_OUT = 0xff;                      
	
	SHUJU_DIR = 0xff;                        //数据端口 P6.0~P6.7 DB0~DB7
	SHUJU_OUT = 0xff;
}
//***************************************************************************/
void Reset_lcd(void)
{	
	unsigned int i;
//------------------------------
                                   //8080方式        
	RES_L;                     //reset=0   
//------------------------------
	for(i=100;i>0;i--)
    {
      _NOP();
    }
	RES_H;                     //reset=1 	                                     
}
//***************************************************************************/
//   clear textram
//   清除文本区
//***************************************************************************/
void clr_textram(void)
{
    unsigned int i;	
   WriteCommand(0x4c);                                //  Set direction of cursor movement
   WriteCommand(0x46);                                //  Set cursor address
   WriteData(0);
   WriteData(0);
   WriteCommand(0x42);                                // Write to display memory
   for(i=0;i<1200;i++)        
   {
     WriteData(0x00);          // 文本区写数据  空格符   
   }    
  
}
//***************************************************************************/
//   clear graphics ram
//   清除图形区
//***************************************************************************/
void clr_grphram(void)
{
    unsigned int i;	
   WriteCommand(0x4c);                                //  Set direction of cursor movement
   WriteCommand(0x46);                                //  Set cursor address
   WriteData(0xb0);
   WriteData(0x04);
   WriteCommand(0x42);                                //Write to display memory
   for(i=0;i<9600;i++)        
   {            
     WriteData(0x00);       // 文本区写数据  空格符   
   }    
}
//***************************************************************************/
//  LcmInition
//  液晶初始化
//***************************************************************************/
void LcmInition(void)
{
   unsigned int i;
   
   Reset_lcd();
//---------------------------------

   WriteCommand(0x40);                              // Initialize device and display
   for(i=0;i<8;i++)        
   {            
     WriteData(ParaSysTable8[i]);      // 写系统设置数据        
   }    

   WriteCommand(0x44);                              // Set display start address and display regions
   for(i=0;i<10;i++)        
   {            
     WriteData(ParaScrTableA[i]);      // 写显示控制数据        
   }  
    WriteCommand(0x5a);                              //  Set horizontal scroll position
    WriteData(0x00);
    WriteCommand(0x5b);                              //  Set display overlay format
    WriteData(0x00);      
    clr_textram();
    clr_grphram();
    WriteCommand(0x59);                              //???? 58 Enable display flashing; 59 Disable display flashing
    WriteData(0x14);      // text graph on 04 
     
//-----------------------------------	
}
//################函数2.写参数及显示数据子程序############################# 
// 
// 写参数及显示数据子程序 
//入口参数:dataW 将数据dataW 写入SED1335 
//******************************************************* 
void WriteData( Uchar dataW ) { 

CS1335_0; /*CS_0for430*/ 

A01335_0; /*A0_0for430*/
RD1335_1; /*RD_1for430*/
WR1335_0; /*WR_0for430*/
SHUJU_OUT=dataW;
WR1335_1;
A01335_1; 
CS1335_1;
} 
//################函数3.读参数及显示数据子程序############################# 
// 
// 读参数及显示数据子程序 
// 读出的参数 LcmRdataPort 
//****************************************************** 
Uchar ReadDataLcm( void )
{ 
Uchar readdata1335;
P4DIR=0x00;
CS1335_0;
A01335_1;
WR1335_1;
RD1335_0;
readdata1335=SHUJU_IN;
RD1335_1;
A01335_1;
CS1335_1;
P4DIR=0xff;
return readdata1335;
} 
//################函数4. 写指令代码子程序################################## 
// 
// 写指令代码子程序 
//入口参数:CommandByte 将指令CommandByte写入SED1335 
//****************************************************** 
void WriteCommand( Uchar CommandByte ) { 

CS1335_0; /*CS_0for430*/   
A01335_1; /*A0_1for430*/
RD1335_1; /*RD_1for430*/
WR1335_0; /*WR_0for430*/
SHUJU_OUT=CommandByte;
WR1335_1;
CS1335_1;
} 
//################函数5.延时子程序######################################### 
//延时子程序1 
//短暂延时参数tt 
void Delay( Uint tt ) { 

while( tt-- ); 
} 
//################函数6.长延时程序######################################### 
// 延时程序2 
// 参数:count 
// 延时: 1MS *COUNT 
void DelayMs(Uint count) 
{ 
Uint i,j; 

for(i=0;i<count;i++) 
for(j=0;j<120;j++) 
; 
} 
//################函数8. 清显示 32K RAM区(清屏)子程序###################### 
// 清显示 32K RAM区(清屏)子程序 

void LcmClear( void ) { 

Uint i1=32768; 

WriteCommand( CsrDirR ); // 光标移动方向定义:自动右移 
WriteCommand( CsrW ); // 光标Locate,定位 
WriteData( 0 ); // 写入参数CSRL设置参数光标指针低8位 
WriteData( 0 ); // 写入参数CSRH设置参数光标指针高8位 
WriteCommand( mWrite ); // 数据写入指令,代码0x42 
while(i1--) { 

WriteData( 0x0 ); // 写入数据0 
} 
} 
//############################################################################################# 

// 滚动演示程序段 (包含向上,向下,向左,向右四个函数) 
// 使用SED1335 等的屏幕滚动功能, 可以实现逐点滚动的显示效果. 这个效果的实现, 在 
// 水平方向是依赖于指令HDOT SET的支持. 下面的演示程序中看到HDOT SET指令的使用方法. 
// 参数说明:V控制移动的速度。 tt控制移动的幅度 
// 横向移动的时候 tt控制移动的字节数目 纵向移动tt控制移动的点行数 
// 
//################函数15.滚动往左########################## 
// 第一显示区向左滚动 
//V控制移动的速度。 tt控制移动的幅度 横向移动的时候 tt控制移动的字节数目 
void RollLaft( Uchar v,Uchar tt ) { 

Uchar tempI,jj=tt; 
Uint iTemp=0; 

while(jj--) { 

for(tempI=0;tempI<8;tempI++) { 
WriteCommand( HdotScr ); // 写入HDOT SET 指令 
WriteData( tempI ); // 写入参数 
DelayMs(v); // 调延时子程序 
} 

iTemp ++; 
} 
// WriteCommand( Scroll ); // 设定显示区域起始地址 
// WriteData( (Uchar)(iTemp &amt; 0xff) ); // 写入参数 
// WriteData( (Uchar)(iTemp /256) ); // 写入参数 

} 

//#################函数16.滚动往右###################### 
// 第一显示区向右滚动 
//V控制移动的速度。 tt控制移动的幅度 横向移动的时候 tt控制移动的字节数目 

void Rollright( Uchar v,Uchar tt ) { 

Uchar tempI,jj=tt; 
Uint iTemp=24; 
while(jj--) { 
tempI = 8; 
WriteCommand( Scroll ); // 显示区域(起点)设置 
WriteData( (Uchar)(iTemp & 0xff) ); // 写入参数 
WriteData( (Uchar)(iTemp /256) ); // 写入参数 
while( tempI-- ) { 
WriteCommand( HdotScr ); // 写入HDOT SET 指令 
WriteData( tempI ); // 写入参数 
DelayMs(v); // 调延时子程序 
} 

iTemp--; 
} 
} 
//##################函数17.滚动往下########################## 
// 第一显示区向下滚动 
//V控制移动的速度。 tt控制移动的幅度 纵向移动tt控制移动的点行数 
void RollDown( Uchar v,Uchar tt ) { 

Uchar jj = tt; // 演示32次 
Uint iTemp=paraP9*50; 
while(jj--) { 
iTemp -= paraP9; 
WriteCommand( Scroll ); // 设定显示区域起始地址 
WriteData( (Uchar)(iTemp & 0xff) ); // 写入参数 
WriteData( (Uchar)(iTemp /256) ); // 写入参数 
DelayMs(v); // 调延时子程序 
} 
WriteCommand( Scroll ); // 设定显示区域起始地址 
WriteData( 0 ); // 写入参数 
WriteData( 0 ); // 写入参数 
DelayMs(30); 
} 
//#####################函数18.向上滚动######################### 
// 第一显示区向上滚动 
//V控制移动的速度。 tt控制移动的幅度 纵向移动tt控制移动的点行数 
void RollUp( Uchar v,Uchar tt ) { 

Uint iTemp=0; 
Uchar jj = tt; // 演示30次 

while(jj--) { 

iTemp += paraP9; 

WriteCommand( Scroll ); // 设定显示区域起始地址 
WriteData( (Uchar)(iTemp&0xff) ); // 写入参数 
WriteData( (Uchar)(iTemp /256) ); // 写入参数 

DelayMs(v); // 调延时子程序 
} 
WriteCommand( Scroll ); // 设定显示区域起始地址 
WriteData( 0 ); // 写入参数 
WriteData( 0 ); // 写入参数 
DelayMs(30); 
} 
//***************************************************************************/
void wr_cmd_2(unsigned int uCmd,unsigned int uPar)              // 带两个参数的命令
{
   lcmcp=uCmd;
   WriteCommand(lcmcp);  
   
   lcmdp= uPar&0xff;
   WriteData(lcmdp);  
   lcmdp=uPar>>8;
   lcmdp&=0x00ff;
   WriteData(lcmdp);
}
//***************************************************************************/
void wr_cmd_1(unsigned int uCmd,unsigned int uPar)              // 带一个参数的命令
{
   lcmcp=uCmd;
   WriteCommand(lcmcp);  
   lcmdp= uPar;
   WriteData(lcmdp);  
}
//***************************************************************************/
void wr_cmd_0(unsigned int uCmd)                                // 不带带参数的命令
{
   lcmcp=uCmd;
   WriteCommand(lcmcp);  
}
//***************************************************************************/
//***************************************************************************/
void char_addr_point_set( unsigned int urow,unsigned int ucol)
{
   unsigned int ipos;
   ipos=urow*40+ucol+1200; 
   wr_cmd_0(0x004c); 
   wr_cmd_2(0x0046,ipos);        
}
//***************************************************************************/
void showchar8(unsigned int row,unsigned int col,unsigned int chp,unsigned int attribute)
{//   row:显示行  col:显示列   chp:显示第几个字. attribute:反色。1:显示字黑,0显示字白
  unsigned int  j,char_data;
  const unsigned int *p;
  p=&HZ8_DOT_LIB[0];
  chp=chp*16; 
  p=p+chp;           //指针指向显示数字的地址
  col/=8;  		 		         
//----------------------------------------	 	        
//          显示中文
//----------------------------------------
  if(attribute)
  {       
    for(j=0;j<16;j++)
    {	 			
      char_addr_point_set(row,col);  //设置Vram地址
      WriteCommand(0x0042);  
	 	            

⌨️ 快捷键说明

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