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

📄 test.c

📁 LM3033液晶测试程序
💻 C
字号:
//-------------------------------------------------
// Shenzhen TOPWAY Technology Co.,Ltd.
// LCD Module:		  LM8053
// Display Size:      160x80
// Driver/Controller: RA8803
// Interface:         8080 mode
// by:                Kenny
// Date:			  2006-10-20
// System;            STC89C516RD+ (11.0592MHz)
//-------------------------------------------------

#include <REGX52.H>

extern void _nop_ (void);

sbit     RS     = P2^0 ;
sbit     RW     = P2^1 ;
sbit     ECLK   = P2^2 ;
sbit     RST    = P2^3 ;
sbit     BUSY   = P0^7 ;

#define LCDBUS    P0

#define Clr_RS  RS = 0
#define Set_RS  RS = 1
#define Clr_RW  RW = 0
#define Set_RW  RW = 1
#define Clr_E   ECLK = 0
#define Set_E   ECLK = 1
#define Clr_RST   RST = 0
#define Set_RST   RST = 1
#define SetText()    SdCmd(0x30)
#define SetGraphic() SdCmd(0x36)
#define ClrLCD()     SdCmd(0x01)

#define Fosc 22118400
#define MyTH0  - ((Fosc / 12 * 5 / 1000) / 0x100)
#define MyTL0  - ((Fosc / 12 * 5 / 1000) % 0x100)

unsigned char data Counter ;
unsigned char data DispCnt , i ;
float k ;
float k1 ;

void Timer0_Init ( void ) ;
void Hline(unsigned char y,unsigned char x0,unsigned char x1) ;
void Vline(unsigned char x,unsigned char y0,unsigned char y1) ;
unsigned int ReadData (void) ;
void Rectangle (unsigned char x0,unsigned char y0,
     unsigned char x1 , unsigned char y1) ;
void XLine (unsigned char x0 , unsigned char y0 ,
            unsigned char x1 , unsigned char y1 ) ;
void Pixel (unsigned char x , unsigned char y ) ;
void NegDispChn (unsigned char x0 , unsigned char y0 , unsigned char Flag) ;
void NegDispAsc (unsigned char x0 , unsigned char y0 , unsigned char Flag) ;
void NegDispHBar (unsigned char y0 , unsigned char Flag) ;

unsigned char code MyDateStr[ ] = __DATE2__ ;
unsigned char code MyTimeStr[ ] = __TIME__ ;
unsigned int code HDotCode[16] =
{
 0xffff , 0x7fff , 0x3fff , 0x1fff ,
 0x0fff , 0x07ff , 0x03ff , 0x01ff ,
 0x00ff , 0x007f , 0x003f , 0x001f ,
 0x000f , 0x0007 , 0x0003 , 0x0001
} ;
unsigned int code VDotCode[16] =
{
 0x8000 , 0x4000 , 0x2000 , 0x1000 ,
 0x0800 , 0x0400 , 0x0200 , 0x0100 ,
 0x0080 , 0x0040 , 0x0020 , 0x0010 ,
 0x0008 , 0x0004 , 0x0002 , 0x0001
} ;
unsigned char code Font1 [32] =
{
 0x00,0x00,0x07,0xE0,0x08,0x10,0x10,0x08,0x20,0x04,0x48,0x12,0x9C,0x39,0x9C,0x39,
 0x88,0x11,0x80,0x01,0x80,0x01,0x48,0x12,0x26,0x64,0x11,0x88,0x08,0x10,0x07,0xE0
} ;

//-----------------------------------
// dispaly data 
//-----------------------------------
//unsigned char code bitmap [128*64/8] =

unsigned char code bitmap [] =
{ 1 } ;

//-----------------------------------
// Delay Routine
//-----------------------------------
void delayms(unsigned char m)        // 12MHz Xtal, close to ms value
{
 Counter = 0x00 ;
 while (Counter < m) _nop_ () ;
}
//-----------------------------------
// IO Routine
//-----------------------------------
void SdCmd(unsigned char Command)   //send command
{
 Clr_RS ;
 Set_E ;
 BUSY = 1 ;
 Counter = 0 ;
 while ((BUSY) && (Counter < 20))_nop_ () ;
 Clr_RW ;
 LCDBUS = Command ;
 Clr_E ;
 Set_RW ;
}
void SdData(unsigned char DData)    //send display data
{
 Clr_RS ;
 Set_E ;
 BUSY = 1 ;
 Counter = 0 ;
 while ((BUSY) && (Counter < 20))_nop_ () ;
 Set_RS ;
 Clr_RW ;
 LCDBUS = DData ;
 Clr_E ;
 Set_RW ;
}
void LcdInit (void)
{
 SdCmd(0x30) ;
 SdCmd(0x30) ;
 ClrLCD ( ) ;
 SdCmd(0x0c) ;
 SdCmd(0x06) ;
}

void HzkDis ( unsigned char code *s)
{
 while (*s > 0)
 {
  SdData(*s) ;
  s ++ ;
 }
}
void ClrLCDImage (void)
{
	unsigned char x, y ;
 unsigned int j ;
 j = 0x0 ;
 for (y = 0 ; y < 64 ; y ++)
 {
  SdCmd(y%32+0x80);
  SdCmd(0x80+(y/32)*8);
  for (x = 0 ; x < 8 ; x ++)
  {
   SdData(0x00);
   SdData(0x00);
  }
 }
}

//-----------------------------------
// Write a Screen
//-----------------------------------
void WriteGraphicScreen(unsigned char *GDData)
{
	unsigned char x, y ;
 unsigned int j ;
 j = 0x0 ;
 for (y = 0 ; y < 64 ; y ++)
 {
  SdCmd(y%32+0x80);
  SdCmd(0x80+(y/32)*8);
  for (x = 0 ; x < 8 ; x ++)
  {
   SdData(GDData[j++]);
   SdData(GDData[j++]);
  }
 }
}

/* 时钟0中断服务程序 5 mS */
void timer0_int ( void ) interrupt TF0_VECTOR 
{
 TH0 = MyTH0 ;
 TL0 = MyTL0 ;
 Counter ++ ;
}


//-----------------------------------
// Main Program
//-----------------------------------
void main()
{

 Timer0_Init ( ) ;
	EA = 1 ;
 RST = 0 ;
	delayms(5);           // 100 mS
 RST = 1 ;
	delayms(5);           // 100 mS
 LcdInit ( ) ;
 SetText () ;
 SdCmd(0x0f) ; 
 ClrLCD ( ) ;

// SetGraphic () ;
// ClrLCD ( ) ;
  
/* 字定义字符*/
 SdCmd(0x30) ;
 SdCmd(0x40) ;
 SdCmd(0x36) ;
 SdCmd(0x02) ;
 DispCnt = 0x00 ;
 for (i = 0 ; i < 16 ; i ++)
 {
  SdData(Font1[ DispCnt ++]);
  SdData(Font1[ DispCnt ++]);
 }
 DispCnt = 0x00 ;

  SetGraphic () ;
  ClrLCDImage ( ) ;
  SetText () ;
  ClrLCD ( ) ;
 
	while(1)
	{
//  SetGraphic () ;
//  ClrLCD ( ) ;
//  WriteGraphicScreen(bitmap) ;

/*
  SetGraphic () ;
  Hline(0x03,2,13);

  Hline(0x03,33,45);

  Hline(0x25,1,96);

  Vline(0x11,12,23) ;

  Vline(12,8,50) ;
  Vline(1,3,23) ;

  Rectangle (35,15,100,28) ;
  Rectangle (26,19,83,33) ;
  Rectangle (43,23,110,35) ;

  
  Pixel (1 , 63 ) ;

  XLine (127,48,0,0) ;
  XLine (127,16,0,0) ;
  XLine (10,63,0,0) ;

  XLine (0,16,127,0) ;
  XLine (64,63,127,0) ;
  XLine (115,63,127,0) ;

  delayms(200);
  delayms(200);
//  ClrLCD ( ) ;
  delayms(200);
  SetText () ;
//  ClrLCD ( ) ;
*/



  SdCmd(0x80);
  HzkDis("    龙腾蓝天") ;
  NegDispChn (3 , 0 , 0x01) ;
  SdCmd(0x90);
  HzkDis("Beijing LTLT") ;
  SdData(0x00) ;
  SdData(0x00) ;

  NegDispAsc (3 , 1 , 0x01) ;

  NegDispAsc (4 , 2 , 0x01) ;

  SdCmd(0x88);
  HzkDis("Counter = ") ;
  i = DispCnt ;
  SdData((i/100)+0x30) ;
  i %= 100 ;
  SdData((i/10)+0x30) ;
  i %= 10 ;
  SdData(i+0x30) ;
  SdCmd(0x98);
  HzkDis(MyDateStr) ;
  HzkDis(MyTimeStr) ;
  delayms(200);
  NegDispHBar (3 , 1) ;
  delayms(200);
  delayms(200);
  delayms(200);
  NegDispHBar (3 , 0) ;

  delayms(200);
  DispCnt ++ ;
  while (1) ;
	}
}
/*
 * init Timer0
 * Timer0/Count0=16Bit Timer,Timer1/Count1= 8 Bit Auto-Reload
 * 2 mS
 */

void Timer0_Init ( void )
{ 
 TMOD = 0x20 | 0x01	;
 TH0 = MyTH0 ; TL0 = MyTL0 ;
 T2CON = 0x00 ;
 TR0 = 1 ;
 ET0 = 1 ;
 LCDBUS  = 0xff;         // pull up data bus
 Counter = 0x00 ;
}
void Hline(unsigned char y,unsigned char x0,unsigned char x1)
{
 unsigned char x ;
 unsigned char i , j ;
 unsigned int u ;
 if (y > 63) return ;
 if (x0 > 127) return ;
 if (x1 > 127) return ;
 if (x0 >= x1) return ;
 if ((x0/16) == (x1/16)) /* 长度小于16点,在同一个字内 */
 {
  SdCmd(y%32+0x80);
  SdCmd(0x80+(y/32)*8+x0/16);
  u = HDotCode[x0%16] ;
  u &= ~HDotCode[x1%16] ;
  u |= ReadData ( ) ;
  SdCmd(y%32+0x80);
  SdCmd(0x80+(y/32)*8+x0/16);
  SdData(u / 0x100) ;
  SdData(u % 0x100) ;
  return ;
 }
 if ((x0%16) != 0)    // 部分点在第一个字中
 {
  SdCmd(y%32+0x80);
  SdCmd(0x80+(y/32)*8+x0/16);
  u = HDotCode[x0%16] ;
  u |= ReadData ( ) ;
  SdCmd(y%32+0x80);
  SdCmd(0x80+(y/32)*8+x0/16);
  SdData(u / 0x100) ;
  SdData(u % 0x100) ;
 }
 if ((x0/16) != (x1/16)) // 中间有几个字是需要全部设置1的
 {
  i = x1 / 16 ;
  x = x0 / 16 ;
  if ((x0%10) != 0) x ++ ;
  SdCmd(y%32+0x80);
  SdCmd(0x80+(y/32)*8+x);
  for (j = x ; j < i ; j ++)
  {
   SdData(0xff) ;
   SdData(0xff) ;
  }
 }
 if ((x1%16) != 0)   // 部分点在最后一个字中
 {
  SdCmd(y%32+0x80);
  SdCmd(0x80+(y/32)*8+x1/16);
  u = ~HDotCode[x1%16] ;
  u |= ReadData ( ) ;
  SdCmd(y%32+0x80);
  SdCmd(0x80+(y/32)*8+x1/16);
  SdData(u / 0x100) ;
  SdData(u % 0x100) ;
 }
}
void Vline(unsigned char x,unsigned char y0,unsigned char y1)
{
 unsigned char i ;
 unsigned int u ;
 if (x > 127) return ;
 if (y0 > 63) return ;
 if (y1 > 63) return ;
 if (y0 >= y1) return ;
 for (i = y0 ; i <= y1 ; i ++)
 {
  SdCmd(i%32+0x80);
  SdCmd(0x80+(i/32)*8+x/16);
  u = ReadData () ;
  u |= (VDotCode[x%16]) ;
  SdCmd(i%32+0x80);
  SdCmd(0x80+(i/32)*8+x/16);
  SdData(u / 0x100) ;
  SdData(u % 0x100) ;
 }
}
unsigned int ReadData (void)
{
 unsigned int u ;
 Clr_RS ;
 Set_RW ;
 Set_E ;
 BUSY = 1 ;
 Counter = 0 ;
 while ((BUSY) && (Counter < 20))_nop_ () ;
 LCDBUS = 0xff ;
 Set_RS ;
 _nop_ () ; _nop_ () ; _nop_ () ;
 Clr_E ;
 _nop_ () ; _nop_ () ; _nop_ () ;
 _nop_ () ; _nop_ () ; _nop_ () ;
 Set_E ;
 _nop_ () ; _nop_ () ; _nop_ () ;
 _nop_ () ; _nop_ () ; _nop_ () ;
 u = LCDBUS ;
 u *= 0x100 ;
 Clr_E ;
 _nop_ () ; _nop_ () ; _nop_ () ;
 _nop_ () ; _nop_ () ; _nop_ () ;
 Set_E ;
 _nop_ () ; _nop_ () ; _nop_ () ;
 _nop_ () ; _nop_ () ; _nop_ () ;
 u += LCDBUS ;
 Clr_E ;
 _nop_ () ; _nop_ () ; _nop_ () ;
 _nop_ () ; _nop_ () ; _nop_ () ;
 Set_E ;
 return u ;
}
void Rectangle (unsigned char x0,unsigned char y0,
          unsigned char x1 , unsigned char y1)
{
 Hline(y0,x0,x1) ;
 Hline(y1,x0,x1) ;
 Vline(x0,y0,y1) ;
 Vline(x1,y0,y1) ;
}

void XLine (unsigned char x0 , unsigned char y0 ,
            unsigned char x1 , unsigned char y1 )
{
 unsigned char x , y ;
 unsigned char stepbegin , stepend ;
 unsigned int u ;
 unsigned char start ;
 if (x0 == x1) return ; //垂直线
 if (y0 == y1) return ; //水平线
 
 if (y1 >= y0)
  y = y1 - y0 ;
 else
  y = y0 - y1 ;
 if (x1 >= x0)
  x = x1 - x0 ;
 else
  x = x0 - x1 ;
 if (y >= x)
 {
// y步进
  if (y1 >= y0)
  {
   k = x1 ;
   k -= x0 ;
   k1 = y1 ;
   k1 -= y0 ;
   k /= k1 ;
   stepbegin = y0 ;
   stepend   = y1 ;
   start = x0 ;
  }
  else
  {
   k = x0 ;
   k -= x1 ;
   k1 = y0 ;
   k1 -= y1 ;
   k /= k1 ;
   stepbegin = y1 ;
   stepend   = y0 ;
   start = x1 ;
  }
  for (y = stepbegin ; y <= stepend ; y ++)
  {
   k1 = (y - stepbegin) ;
   k1 *= k ;
   k1 += start ;
   k1 += 0.5 ;
   x = k1 ;
   SdCmd(y%32+0x80);
   SdCmd(0x80+(y/32)*8+x/16);
   u = ReadData () ;
   u |= (VDotCode[x%16]) ;
   SdCmd(y%32+0x80);
   SdCmd(0x80+(y/32)*8+x/16);
   SdData(u / 0x100) ;
   SdData(u % 0x100) ;
  }
 }
 else
 {
// x 步进
  if (x1 >= x0)
  {
   k = y1 ;
   k -= y0 ;
   k1 = x1 ;
   k1 -= x0 ;
   k /= k1 ;
   stepbegin = x0 ;
   stepend   = x1 ;
   start = y0 ;
  }
  else
  {
   k = y0 ;
   k -= y1 ;
   k1 = x0 ;
   k1 -= x1 ;
   k /= k1 ;
   stepbegin = x1 ;
   stepend   = x0 ;
   start = y1 ;
  }
  for (x = stepbegin ; x <= stepend ; x ++)
  {
   k1 = (x - stepbegin) ;
   k1 *= k ;
   k1 += start ;
   k1 += 0.5 ;
   y = k1 ;
   SdCmd(y%32+0x80);
   SdCmd(0x80+(y/32)*8+x/16);
   u = ReadData () ;
   u |= (VDotCode[x%16]) ;
   SdCmd(y%32+0x80);
   SdCmd(0x80+(y/32)*8+x/16);
   SdData(u / 0x100) ;
   SdData(u % 0x100) ;
  }
 }
}
void Pixel (unsigned char x , unsigned char y )
{
 unsigned int u ;
 if (x > 127) return ;
 if (y > 63 ) return ;

 SdCmd(y%32+0x80);
 SdCmd(0x80+(y/32)*8+x/16);
 u = ReadData () ;
 u |= (VDotCode[x%16]) ;
 SdCmd(y%32+0x80);
 SdCmd(0x80+(y/32)*8+x/16);
 SdData(u / 0x100) ;
 SdData(u % 0x100) ;
}
/*
 * x0 (0-7) y0 (0-3)
 */
void NegDispChn (unsigned char x0 , unsigned char y0 , unsigned char Flag)
{
 unsigned char i ;
 unsigned char x , y ;
 if (x0 > 7) return ;
 if (y0 > 3) return ;
 SetGraphic() ;
 i = y0 * 16 ;
 y = i % 32 ;
 y += 0x80 ;
 if (y0 > 1) x = x0 + 0x88 ;
 else
  x = x0 + 0x80 ;

 for (i = 0 ; i < 16 ; i ++)
 {
  SdCmd(y) ;
  SdCmd(x) ;
  if (Flag == 0x00)
  {
   SdData(0x00) ;
   SdData(0x00) ;
  }
  else
  {
   SdData(0xff) ;
   SdData(0xff) ;
  }
  y ++ ;
 }
 SetText() ;
}
/*
 * 
 */
void NegDispAsc (unsigned char x0 , unsigned char y0 , unsigned char Flag)
{
 unsigned char i ;
 unsigned char x , y ;
 unsigned int u ;
 if (x0 > 15) return ;
 if (y0 > 3) return ;
 SetGraphic() ;
 i = x0 / 2 ;
 if (y0 > 1) x = i + 0x88 ;
 else
  x = i + 0x80 ;

 i = y0 * 16 ;
 y = i % 32 ;
 y += 0x80 ;
// x = 0x80 ;
// y = 0x90 ; 
 for (i = 0 ; i < 16 ; i ++)
 {
  if (Flag ==0x00)
  {
   SdCmd(y) ;
   SdCmd(x) ;
   u = ReadData () ;
   if ((x0 & 0x01) == 0x00)
    u &=0x00ff ;
   else
    u &= 0xff00 ;
   SdCmd(y) ;
   SdCmd(x) ;
   SdData(u/0x100) ;
   SdData(u%0x100) ;
  }
  else
  {
   SdCmd(y) ;
   SdCmd(x) ;
   u = ReadData () ;
   if ((x0 & 0x01) == 0x00)
    u |=0xff00 ;
   else
    u |= 0x00ff ;
   SdCmd(y) ;
   SdCmd(x) ;
   SdData(u/0x100) ;
   SdData(u%0x100) ;
  }
  y ++ ;
 }
 SetText() ;
}
void NegDispHBar (unsigned char y0 , unsigned char Flag)
{
 unsigned char i ;
 unsigned char j ;
 unsigned char x , y ;
 if (y0 > 3) return ;
 SetGraphic() ;
 SetGraphic() ;
 i = y0 * 16 ;
 y = i % 32 ;
 y += 0x80 ;

 for (i = 0 ; i < 16 ; i ++)
 {
  if (y0 > 1) x = 0x88 ;
  else
   x = 0x80 ;
  for (j = 0 ; j < 8 ; j ++)
  {
   SdCmd(y) ;
   SdCmd(x+j) ;
   if (Flag == 0x00)
   {
    SdData(0x00) ;
    SdData(0x00) ;
   }
   else
   {
    SdData(0xff) ;
    SdData(0xff) ;
   }
  }
  y ++ ;
 }
 SetText() ;
}

//end of program

⌨️ 快捷键说明

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