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

📄 lcd.c

📁 基于MB95F168气体检漏仪软件代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "mb95100.h"
#include "zimo.h"
#define   uchar unsigned char
#define   uint   unsigned int
/***************************************/
/*************液晶接口定义**************/
#define LCD_RESET 	PDR9_P90
#define LCD_CE 		PDR9_P91
#define CD1			PDRA_PA0
//#define LCD_FS		PDRB_PA1
#define RD1			PDRA_PA2
#define WR1			PDRA_PA3
#define LCD_BUS		PDRB
/***************************************/
/*************液晶指令定义************/
#define   CursorPointer    0x21          // 光标地址设置 
#define   OffsetReg        0x22          // CGRAM偏移地址设置 
#define   AddrSet          0x24          // 显示地址设置 
#define   TextHomeAddr     0x40          // 文本首地址 
#define   TextArea         0x41          // 文本宽度设置 
#define   GraHomeAddr      0x42          // 图形首地址设置 
#define   GraArea          0x43          // 图形宽度设置 
#define   OrMode           0x80          // 或模式显示 
#define   ExorMode         0x81          // 异或模式显示 
#define   AndMode          0x83          // 与模式显示 
#define   TextAttMode      0x84          // 文本属性模式 
#define   InterCGROM       0x80          // 内部CGROM 
#define   ExCGRAM          0x88          // 外部CGRAM 
#define   DisplayOff       0x90          // 显示关闭 
#define   CursorOn         0x92          // 光标显示,但不闪烁 
#define   CursorBlink      0x93          // 光标闪烁 
#define   TextOn           0x94          // 文本模式打开 
#define   GraOn            0x98          // 图形模式打开 
#define   TGAllOn          0x9c          // 文本图形模式都打开 
#define   DataAutoWrite    0xb0          // 数据自动写 
#define   DataAutoRead     0xb1          // 数据自动读 
#define   ExitAutoRW       0xb2          // 退出数据自动读写模式 
#define   DataWAddrI       0xc0          // 数据写,地址加1 
#define   DataWAddrD       0xc2          // 数据写,地址减1 
#define   DataWAddrNV      0xc4          // 数据写,地址不变 
#define   DataRAddrI       0xc1          // 数据读,地址加1 
#define   DataRAddrD       0xc3          // 数据读,地址减1 
#define   DataRAddrNV      0xc5          // 数据读,地址不变 
#define   ScreenPeek       0xe0          // 屏读 
#define   ScreenCopy       0xe1          // 屏拷贝 
#define   LineChar         32            // 设置宽度  
unsigned char Cursor_X,Cursor_Y; 
unsigned long delayloop;
unsigned char display_flag;

extern unsigned char Clock_yr, Clock_mn, Clock_date, Clock_week, Clock_hr, Clock_min, Clock_sec;
extern unsigned int g_iCurrADValue;
/********************************************************************************
函数原型: void delay(uchar t)
功     能; (1)延时 T*10 (2) 1MS*k
入口参数: (1) uchar t   (2)uint k
出口参数: 
********************************************************************************/ 
void delay(uchar t)
{ 
   uchar i,j;
   for(i=0;i<t;i++) {   for(j=0;j<10;j++);   }
}
void delay1(uint k)
{ 
   uchar j;
   while ((k--)!=0) {   for (j=0;j<125;j++);}
}
/******************************************************************************** 
函数名:    ReadSdate(void) 
函数功能: IOPORT输出数据并检查LCD忙数据。
返回数据:checkbusy
/********************************************************************************/ 
ReadSdate()
{  
    uchar   checkbusy; 
    DDRB=0x00;
    PDRA_PA1=1;
    CD1=1;
    RD1=0;
    WR1=1;
    checkbusy=LCD_BUS;
   // _LEDDISPLAY(checkbusy);
    RD1=1; 
    DDRB=0xFF;
    PDRA_PA1=0;
    return ( checkbusy );  
}
/******************************************************************************** 
函数名:    Void RWcheck() 
函数功能: 判断状态位STA1,STA0子程序(读写指令和读写数据状态),在写指令的读,
           写数据之前这两个标志位必须同时为1 
/********************************************************************************/ 
void RWcheck(void)
{   
     uchar   databusy;
     do{ databusy=ReadSdate();
     //_LEDDISPLAY(9);
     }
while( !(databusy&0x03) );
}
/******************************************************************************** 
函数名:    Void AutoRcheck() 
函数功能: 判断状态位STA2的子程序(数据自动读状态),该位在数据自动读操作过程中
           取代STA0和STA1有效。在连续读过程中每读一次之前都要确认STA2=1
********************************************************************************/ 
void AutoRcheck(void)
{   
     uchar   databusy;
     do{databusy=ReadSdate(); }
while( !(databusy&0x04) ); 
}
/******************************************************************************** 
函数名: Void AutoWcheck() 
函数功能: 判断状态位STA3子程序(数据自动写状态) 
********************************************************************************/ 
void AutoWcheck(void)
{    
     uchar   databusy;
     do{databusy=ReadSdate(); }
while( !(databusy&0x08) );
}
/******************************************************************************** 
函数名:    Void WriteCmd1(uchar cmd)
           Void WriteCmd2(uchar dat1,uchar cmd)
           Void WriteCmd3(uchar dat1,uchar dat2,uchar cmd)
     Void WriteData(uchar dat)
函数功能: 写指令和写数据子程序
********************************************************************************/ 
void WriteData(uchar dat)
{   
RWcheck();
CD1=0;                 
LCD_BUS=dat;
WR1=0;
WR1=1;
}
void WriteCmd1(unsigned char cmd)
{
RWcheck();
CD1=1;       
LCD_BUS=cmd; 
WR1=0;       
WR1=1;       
}
void WriteCmd2(uchar dat,uchar cmd)
{
    WriteData(dat);   
    WriteCmd1(cmd);      
}
void WriteCmd3(uchar dat1,uchar dat2,uchar cmd)
{       
    WriteData(dat1); 
    //_LEDDISPLAY(1); 
    WriteData(dat2);
    //_LEDDISPLAY(2); 
    WriteCmd1(cmd); 
    //_LEDDISPLAY(3);   
}
void AutoWriteData( uchar dat)
{  
    AutoWcheck();
    CD1 = 0;    
    LCD_BUS= dat;
    WR1=0;
    WR1=1;
}
/******************************************************************************** 
函数名: Void ClearScreen(unsigned int ram) 
函数功能: 清除整个屏幕 
     ram : 需要清零的单元数
********************************************************************************/ 
void ClearScreen(uint ram) 
{ 
     unsigned int i; 
                                                            // 清显示 RAM 区 0000h--2000h (8k) 
     WriteCmd3(0x00,0x00,0x24);                              // 设置指针地址0000H 
     WriteCmd1(0xb0);                                        // 设置自动写状态 
     for(i=0x00;i<ram;i++) AutoWriteData(0x00);                  // data=0; 
     WriteCmd1(0xb2);                                        // 自动写结束 
} 


/********************************************************************************
函数原型: void draw_dot(x,y)
功     能; T6963屏上打点
入口参数: 横坐标(x),枞坐标(y)
出口参数: 
********************************************************************************/ 
void draw_dot(uchar x,uchar y,uchar mode)
{   uchar dat11,dat22;
    uchar n,t;

    dat11=(y*32)%256 +x/8; 
    dat22=(y*32)/256;
    delay(20);
    WriteCmd3(dat11,dat22,0x24);
    if(mode)    n=0xf8;
    else        n=0xf0; 
    t=n|((~(x%8))&0x07);
    WriteCmd1(t);
}
/******************************************************************************** 
函数名: Void CursorPosSet(uchar X,uchar Y) 
函数功能:   光标位置设置 
********************************************************************************/ 
void CursorPosSet(unsigned char x,unsigned char y) 
{ 
    WriteCmd3(x,y,CursorPointer);          //X的取值范围0-20;Y的取值范围0-15; 
} 
/******************************************************************************** 
函数名: Void CursorUp() 
函数功能:   光标向上移动一格 
********************************************************************************/ 
void CursorUp() 
{ 
         if(Cursor_Y>0)Cursor_Y-=1;  
         WriteCmd3(Cursor_X,Cursor_Y,CursorPointer); 
} 
/******************************************************************************** 
函数名: Void CursorDown() 
函数功能:   光标向下移动一格 
********************************************************************************/ 
void CursorDown() 
{ 
         if(Cursor_Y<8)Cursor_Y+=1; 
         WriteCmd3(Cursor_X,Cursor_Y,CursorPointer); 
} 
/******************************************************************************** 
函数名: Void CursorRight() 
函数功能:   光标向右移动一格 
********************************************************************************/ 
void CursorRight() 
{ 
         if(Cursor_X<20)Cursor_X+=1; 
         WriteCmd3(Cursor_X,Cursor_Y,CursorPointer); 
} 
/******************************************************************************** 
函数名: Void CursorLeft() 
函数功能:   光标向左移动一格 
********************************************************************************/ 
void CursorLeft() 
{ 
         if(Cursor_X>0)Cursor_X-=1; 
         WriteCmd3(Cursor_X,Cursor_Y,CursorPointer); 
} 
/******************************************************************************** 
函数名: Void CursorEnter() 
函数功能:   光标换行
********************************************************************************/ 
void CursorEnter() 
{ 
    Cursor_X=0; 
    Cursor_Y+=1; 
    WriteCmd3(Cursor_X,Cursor_Y,CursorPointer); 
} 

/********************************************************************************
函数名:   void lcd_init (void)
函数功能:LCD初始化设置
********************************************************************************/ 

void lcd_init (void)
{  
	PDRA_PA1=0;
	LCD_CE=0;
	LCD_RESET=1;
    WriteCmd3(0x00,0x00,0x40);   //文本首地址
    WriteCmd3(0x20,0x00,0x41);   //文本宽度设置
    WriteCmd3(0x00,0x00,0x42);   // 图形首地址
    WriteCmd3(0x20,0x00,0x43);   //设置图形宽度                          //即一行显示所占字节数
    WriteCmd1(0xa1);             //光标设置
    WriteCmd1(0x88);             //显示方式设置   逻辑“或”合成
    WriteCmd1(0x9b);             //显示开关
    Cursor_X=0x00;
    Cursor_Y=0x00; 
    CursorPosSet(Cursor_X,Cursor_Y); 
    ClearScreen(0x2000);
    //WriteCmd1(0x92); 
    //WriteCmd1(0x93); 
    //WriteCmd1(0x9c); 
   
   }
/******************************************************************************** 
函数名:Void ShowHZ16x16(unsigned char column,unsigned char lin,unsigned int hzcode) 
函数功能:显示一个汉字(16*16点阵)
           column:汉字起始列(0-30) (240/8=30)
           lin: 汉字起始行(0-7)     (128/16=8)
        hzcode: 汉字代码(自定义的) 
注:超出范围的将直接写到RAM中,可以实现卷屏效果
********************************************************************************/ 
void ShowHZ16x16(unsigned char column,unsigned char lin,unsigned char hzcode) 
{ unsigned char temp1,temp2; 
     unsigned int StartAddr; 
     unsigned char i=0;
     unsigned int * temp;
     //temp=&Hz[];
     StartAddr=16*lin*LineChar+ column;        //定位起始行
     for(i=1;i<16;i++) 
     { 
       WriteCmd3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), AddrSet); 
       temp1=Hz[hzcode][2*i];
       //temp1=i;
       WriteCmd2(temp1, DataWAddrI);              // 左半部 地址加一 
       temp2=Hz[hzcode][2*i+1]; 
       //temp2=i;
       WriteCmd2(temp2, DataWAddrNV);             // 右半部 显示地址不变
       StartAddr=StartAddr + LineChar;            // 换到下一行
     } 
} 
/******************************************************************************** 
函数名:Void ShowFX16x16(unsigned char column,unsigned char lin,unsigned int hzcode) 
函数功能:反显示一个汉字(16*16点阵)
           column:汉字起始列(0-30) (240/8=30)
           lin: 汉字起始行(0-7)     (128/16=8)
        hzcode: 汉字代码(自定义的) 
注:超出范围的将直接写到RAM中,可以实现卷屏效果
********************************************************************************/ 
void ShowFX16x16(unsigned char column,unsigned char lin,unsigned char hzcode) 
{ unsigned char temp1,temp2; 
     unsigned int StartAddr; 
     unsigned char i=0;
     unsigned int * temp;
     //temp=&Hz[];
     StartAddr=16*lin*LineChar+ column;        //定位起始行
     for(i=1;i<16;i++) 
     { 
       WriteCmd3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), AddrSet); 
       temp1=~Hz[hzcode][2*i];
       //temp1=i;
       WriteCmd2(temp1, DataWAddrI);              // 左半部 地址加一 
       temp2=~Hz[hzcode][2*i+1]; 
       //temp2=i;
       WriteCmd2(temp2, DataWAddrNV);             // 右半部 显示地址不变
       StartAddr=StartAddr + LineChar;            // 换到下一行
     } 
} 
/******************************************************************************** 
函数名:Void ShowSZ16x8(unsigned char column,unsigned char lin,unsigned int Szcode) 
函数功能:显示一个数字(8*16点阵)
           column:数字起始列(0-30) (240/8=30)
           lin: 数字起始行(0-7)     (128/16=8)
        szcode: 数字代码(自定义的) 
注:超出范围的将直接写到RAM中,可以实现卷屏效果
********************************************************************************/ 
void ShowSZ16x16(unsigned char column,unsigned char lin,unsigned char szcode) 
{ unsigned char temp1; 
     unsigned int StartAddr; 
     unsigned char i=0;
     unsigned int * temp;
     //temp=&Hz[];
     StartAddr=16*lin*LineChar+ column;        //定位起始行
     for(i=1;i<16;i++) 
     { 
       WriteCmd3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), AddrSet); 
       temp1=Sz[szcode][i];
       WriteCmd2(temp1, DataWAddrNV);             // 右半部 显示地址不变
       StartAddr=StartAddr + LineChar;            // 换到下一行
     } 
} 
_ScreenSash()
{unsigned char x;
WriteCmd3(0xa2, 0x0f, AddrSet); 
	for(x=0;x<26;x++)
	{
	WriteCmd2(0xff, DataWAddrI);
	}
WriteCmd3(0x62,0x00, AddrSet); 
	for(x=0;x<26;x++)
	{
	WriteCmd2(0xff, DataWAddrI);
	}
	WriteCmd3(0x01,0x1, AddrSet); 
	WriteCmd2(0xff, DataWAddrNV);
	WriteCmd3(0x1c,0x1, AddrSet); 
	WriteCmd2(0xff, DataWAddrNV);
	WriteCmd3(0x01,0xf, AddrSet); 
	WriteCmd2(0xff, DataWAddrNV);
	WriteCmd3(0x1c,0xf, AddrSet); 
	WriteCmd2(0xff, DataWAddrNV);
	for(x=0;x<5;x++)
      {
        draw_dot(15,x+3,1);
        draw_dot(224,x+3,1);
        draw_dot(15,x+121,1);
        draw_dot(224,x+121,1);
       }
    for(x=8;x<121;x++)
      {
        draw_dot(7,x,1);
        draw_dot(231,x,1);
      }      
}

_ScreenStart()
{unsigned char x;
_ScreenSash();     
 for(x=0;x<10;x++)
 {
   ShowHZ16x16(x*2+5,0x1,x);
 }
 for(x=0;x<5;x++)
 {
   ShowHZ16x16(x*2+9,0x3,x+10);
 }
 for(x=0;x<6;x++)
 {
   ShowHZ16x16(x*2+9,0x5,x+15);
 }
 for(x=30;x<210;x++)
      {
        draw_dot(x,70,1);
        draw_dot(x,71,1);
        draw_dot(x,72,1);
        draw_dot(x,73,1);
        draw_dot(x,74,1);
        draw_dot(x,75,1);
        delay1(50);
      }    
        
}
_ScreenMenu()
{unsigned char x;
ClearScreen(0x2000);
_ScreenSash();
 for(x=0;x<3;x++)
 {
   ShowHZ16x16(x*2+12,1,x+21);
 }
  for(x=0;x<2;x++)
 {
   ShowHZ16x16(x*2+13,2,x+24);
 }
 ShowHZ16x16(13,3,26);
 ShowHZ16x16(15,3,25);
 for(x=0;x<2;x++)
 {
   ShowHZ16x16(x*2+13,4,x+27);
 }
  for(x=0;x<2;x++)
 {
   ShowHZ16x16(x*2+13,5,x+29);
 }
	for(x=100;x<140;x++)
      {
        draw_dot(x,0x1f,1);
        draw_dot(x,0x2f,1);
        draw_dot(x,0x3f,1);
        draw_dot(x,0x4f,1);
        draw_dot(x,0x5f,1);
      }   
	for(x=0x1f;x<0x60;x++)
      {
        draw_dot(100,x,1);
        draw_dot(139,x,1);
      }   
  for(x=0;x<2;x++)
 {
   ShowHZ16x16(x*2+4,6,x+31);
 }
 ShowHZ16x16(13,6,33);
 ShowHZ16x16(15,6,32);
   for(x=0;x<2;x++)
 {
   ShowHZ16x16(x*2+22,6,x+34);
 }
 ShowHZ16x16(10,2,95);
}
_Sc_cz(unsigned char y)
{unsigned char x;
  for(x=0;x<2;x++)
 {
   ShowHZ16x16(x*2+2,y+1,x+41);
 }
 ShowHZ16x16(6,y+1,38);
 ShowHZ16x16(8,y+1,43);
 ShowHZ16x16(10,y+1,10);
 for(x=0;x<2;x++)
 {
   ShowHZ16x16(x*2+14,y+1,x+44);
 }
 ShowHZ16x16(2,y+3,43);
 ShowHZ16x16(4,y+3,10);
 for(x=0;x<2;x++)
 {
   ShowHZ16x16(x*2+7,y+3,x+46);
 }
 ShowHZ16x16(13,y+3,48);
 ShowHZ16x16(15,y+3,10);
 for(x=0;x<2;x++)
 {
   ShowHZ16x16(x*2+20,y+3,x+49);
 }
}
_ScreenJL(unsigned char num)
{unsigned char x;
unsigned int setpress;
switch(num)
{
case 0: setpress=20000;break;
case 1: setpress=15000;break;
case 2: setpress=10000;break;
default:setpress=20000;
}
ClearScreen(0x2000);

⌨️ 快捷键说明

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