# Include <reg52.h>
# Include <intrins. h>
# Include <math. h>
// ------------ Define the interface -------------//
Sbit rs = P2 ^ 2;
Sbit RW = P2 ^ 3;
Sbit E = P2 ^ 4;
Sbit PSB = P2 ^ 5; // H = parallel port; L = "Serial Port ";
# Define LCD _bus P0
// P0 connect to LCM
# Define uchar unsigned char
# Define first_addr 0
// Define the character/start position of the Chinese Character Display
/* ------------------ Check the busy position -----------------------------*/
Void chk_busy ()
{
Rs = 0;
RW = 1;
E = 1;
LCD _bus = 0xff;
While (LCD _bus & 0x80) = 0x80 );
E = 0;
}
/* ---------------- Latency subroutine -----------------------------*/
Void delay (unsigned int T)
{
Unsigned int I, J;
For (I = 0; I <t; I ++)
For (j = 0; j <10; j ++ );
}
/* ---------------- Write the command to LCD ------------------------------*/
Void write_com (unsigned char encoding code)
{
Chk_busy ();
Rs = 0;
RW = 0;
E = 1;
LCD _bus = response code;
Delay (5 );
// ------------------ Add the appropriate latency when writing data
E = 0;
Delay (5 );
}
/* ------------------- Write data to LCD ----------------------------*/
Void write_data (unsigned char dispdata)
{
Chk_busy ();
Rs = 1;
RW = 0;
E = 1;
LCD _bus = dispdata;
Delay (5 );
// ------------------ Add the appropriate latency when writing data
E = 0;
Delay (5 );
}
/* ---------------- Initialize the LCD screen --------------------------*/
Void lcdreset ()
{
PSB = 1;
Delay (2000 );
Write_com (0x30 );
Delay (10 );
// Select the Basic Instruction Set
Write_com (0x30 );
// Select an 8-Bit Data Stream
Delay (5 );
Write_com (0x0c );
// Open display (no cursor or reversed)
Delay (10 );
Write_com (0x01 );
// Clear the display and set the address pointer to 00 h
Delay (500 );
Write_com (0x06 );
// Specify the moving direction of the cursor and the shift of the specified display when reading and writing data.
Delay (0 );
}
/* ------------------ Display string --------------------------*/
Void hzkdis (unsigned char Code * s)
{
While (* s> 0)
{
Write_data (* s );
S ++;
Delay (50 );
}
}
/* ------------------ Display on the first screen --------------------------*/
Void Ceshi ()
{
Write_com (0x01 );
// Clear the display and set the address pointer to 00 h
Delay (5 );
Write_com (0x80 );
// The first line (if the address is: 80 h, that is, the first position of the first line of the LCD)
Hzkdis ("Nanjing University of Posts and Telecommunications ");
Write_com (0x90 );
// The second line (if the address is: 90 H, that is, the first position of the second line of the LCD)
Hzkdis ("Communication and Information Engineering ");
Write_com (0x88 );
// Line 3 (if the address is 88 h, that is, the first position of the second line of the LCD)
Hzkdis ("Electronic Information Engineering ");
Write_com (0x98 );
// Line 4 (if the address is: 98 H, that is, the first position of the second line of the LCD)
Hzkdis ("Zheng Haibo test program ");
}
// ------------------ Clear the entire gdram space ----------------------------
Void clrgdram ()
{
Unsigned char X, Y;
For (y = 0; y <64; y ++)
For (x = 0; x <16; X ++)
{
Write_com (0x34 );
Write_com (Y + 0x80 );
// Line address
Write_com (x + 0x80 );
// Column address
Write_com (0x30 );
Write_data (0x00 );
Write_data (0x00 );
}
}
//------------------------------------------------------------
Void clrscreen ()
{
Write_com (0x01 );
Delay (10 );
}
Unsigned char readbyte (void)
{
Unsigned char byreturnvalue;
Chk_busy ();
LCD _bus = 0xff;
Rs = 1;
RW = 1;
E = 0;
E = 1;
Byreturnvalue = LCD _bus;
E = 0;
Return byreturnvalue;
}
/* Add a painting subroutine.
Function: draws a vertex at the coordinate (x, y ).
Parameter meaning
X: the abscissa of the 12864 screen, ranging from 0 to 128 (left to right)
Y: The ordinate of 12864, ranging from 0 to 64 (from top to bottom)
When color is set to 1, it indicates a black spot.
*/
Void drawpoint (unsigned char X, unsigned char y, unsigned char color)
{
Unsigned char row, tier, tier_bit;
Unsigned char readoldh, readoldl;
Write_com (0x34 );
Write_com (0x36 );
Tier = x> 4;
Tier_bit = x & 0x0f;
If (Y <32)
{
Row = y;
}
Else
{
Row = Y-32;
Tier + = 8;
}
Write_com (row + 0x80 );
Write_com (Tier + 0x80 );
Readbyte ();
Readoldh = readbyte ();
Readoldl = readbyte ();
Write_com (row + 0x80 );
Write_com (Tier + 0x80 );
If (tier_bit <8)
{
Switch (color)
{
Case 0:
Readoldh & = (~ (0x01 <(7-tier_bit )));
Break;
Case 1:
Readoldh | = (0x01 <(7-tier_bit ));
Break;
Case 2:
Readoldh ^ = (0x01 <(7-tier_bit ));
Break;
Default:
Break;
}
Write_data (readoldh );
Write_data (readoldl );
}
Else
{
Switch (color)
{
Case 0:
Readoldl & = (~ (0x01 <(15-tier_bit )));
Break;
Case 1:
Readoldl | = (0x01 <(15-tier_bit ));
Break;
Case 2:
Readoldl ^ = (0x01 <(15-tier_bit ));
Break;
Default:
Break;
}
Write_data (readoldh );
Write_data (readoldl );
}
Write_com (0x30 );
}
Void main (void)
{
Uchar I, j, color = 1, t = 0;
RW = 0;
Lcdreset ();
Ceshi ();
Clrgdram ();
Delay (2000 );
Clrscreen ();
While (1)
{
For (I = 0; I <128; I ++)
{
J = 32-32 * sin (2 * I * 3.14/(64 + T ));
Drawpoint (I, j, color );
}
// T + = 4;
Delay (5000 );
}
While (1 );
}