📄 test.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 + -