Receiving procedure:
# Include <reg52.h>
# Include <intrins. h>
# Include <string. h>
Unsigned char num;
Sbit rs = P2 ^ 0;
Sbit RW = P2 ^ 1;
Sbit en = P2 ^ 2;
Void delayms (ms int)
{
Char I;
While (MS --)
{
For (I = 0; I <120; I ++ );
}
}
Char read_ LCD _state ()
{
Char state;
Rs = 0; RW = 1; en = 1; delayms (1 );
State = P0;
En = 0; delayms (1 );
Return state;
}
Void LCD _busy_wait ()
{
While (read_ LCD _state () & 0x80) = 0x80 );
Delayms (5 );
}
Void write_ LCD _data (char dat)
{
LCD _busy_wait ();
Rs = 1; RW = 0; en = 0; p0 = dat; en = 1; delayms (1); en = 0;
}
Void write_ LCD _command (char cmd)
{
LCD _busy_wait ();
Rs = 0; RW = 0; en = 0; p0 = cmd; en = 1; delayms (1); en = 0;
}
Void init_ LCD ()
{
Write_ LCD _command (0x38 );
Delayms (1 );
Write_ LCD _command (0x01 );
Delayms (1 );
Write_ LCD _command (0x06 );
Delayms (1 );
Write_ LCD _command (0x0c );
Delayms (1 );
}
Void set_ LCD _pos (char P)
{
Write_ LCD _command (p | 0x80 );
}
Void display_ LCD _string (char P, char * s)
{
Char I;
Set_ LCD _pos (P );
For (I = 0; I <16; I ++)
{
Write_ LCD _data (s [I]);
Delayms (1 );
}
}
Void main ()
{
Tmod = 0x20;
Th1 = 0x0f3;
TL1 = 0x0f3;
Scon = 0x50;
Pcon = 0x00;
Tr1 = 1;
Ea = 1;
Es = 1;
Init_ LCD ();
While (1)
{
Display_ LCD _string (0x00, & num );
}
}
Void intrr () interrupt 4
{
Ri = 0;
While (Ri = 0)
{
;
}
Num = sbuf;
}
Program:
# Include <reg52.h>
# Include <intrins. h>
# Include <string. h>
# Define scanport p3
// # Define lcdport P0
Sbit rs = P2 ^ 0;
Sbit RW = P2 ^ 1;
Sbit E = P2 ^ 2;
Void delayms ()
{
Int I;
For (I = 0; I <1000; I ++ );
}
Char writelcddata (char dat)
{
Rs = 1; RW = 0; E = 0; p0 = dat; E = 1; delayms (); E = 0;
Return dat;
}
Void writelcdcommand (char cmd)
{
Rs = 0; RW = 0; E = 0; p0 = cmd; E = 1; delayms (); E = 0;
}
Unsigned char linescan [4] = {0xef, 0xdf, 0xbf, 0x7f}; // The scanning voltage of the column line, which is divided into column 1, 2, 3, and 4.
// It is a low level, and others are a high level.
Unsigned char uckeyscan ()
{
Unsigned char temp = 0; // The scan status is temporarily saved.
Unsigned char ROW = 0, line = 0; // row number, column number.
For (line = 0; line <4; line ++) // column Scan
{
Scanport = linescan [Line]; // output scan potential.
Temp = scanport & 0x0f; // input scanning potential, and shielded 4-digit High.
If (temp! = 0x0f)
{// Determines whether a key is pressed for this column.
Switch (temp)
{
Case 0x0e: ROW = 10; break; // If yes, the row number is determined.
Case 0x0d: ROW = 20; break;
Case 0x0b: ROW = 30; break;
Case 0x07: ROW = 40; break;
Default: ROW = 50; break;
}
Break;
}
}
// <Before scanning, the initial status >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Scanport = 0x0f; // restore the P2 Port
Return row + LINE + 1; // return the key encoding. The format is 2-digit, the high is the row number, and the low is the column number.
}
Void showonechar (unsigned char chartemp)
{
Switch (chartemp)
{
Case '': writelcddata (0x20); break;
Case '! ': Writelcddata (0x21); break;
Case '"': writelcddata (0x22); break;
Case '#': writelcddata (0x23); break;
Case '$': writelcddata (0x24); break;
Case '%': writelcddata (0x25); break;
Case '&': writelcddata (0x26); break;
Case '>': writelcddata (0x27); break;
Case '(': writelcddata (0x28); break;
Case ')': writelcddata (0x29); break;
Case '*': writelcddata (0x2a); break;
Case '+': writelcddata (0x2b); break;
Case '-': writelcddata (0x2d); break;
Case '.': writelcddata (0x2e); break;
Case '/': writelcddata (0x2f); break;
Case '=': writelcddata (0x3d); break;
Case '<': writelcddata (0x3e); break;
Case '? ': Writelcddata (0x3f); break;
Case '^': writelcddata (0x5e); break;
Case ': writelcddata (0x3a); break;
Case '0': writelcddata (0x30); break;
Case '1': writelcddata (0x31); break;
Case '2': writelcddata (0x32); break;
Case '3': writelcddata (0x33); break;
Case '4': writelcddata (0x34); break;
Case '5': writelcddata (0x35); break;
Case '6': writelcddata (0x36); break;
Case '7': writelcddata (0x37); break;
Case '8': writelcddata (0x38); break;
Case '9': writelcddata (0x39); break;
Case 'A': writelcddata (0x41); break;
Case 'B': writelcddata (0x42); break;
Case 'C': writelcddata (0x43); break;
Case 'D': writelcddata (0x44); break;
Case 'E': writelcddata (0x45); break;
Case 'F': writelcddata (0x46); break;
Case 'G': writelcddata (0x47); break;
Case 'H': writelcddata (0x48); break;
Case 'I': writelcddata (0x49); break;
Case 'J': writelcddata (0x4a); break;
Case 'K': writelcddata (0x4b); break;
Case 'l': writelcddata (0x4c); break;
Case 'M': writelcddata (0x4d); break;
Case 'N': writelcddata (0x4e); break;
Case 'O': writelcddata (0x4f); break;
Case 'p': writelcddata (0x50); break;
Case 'q': writelcddata (0x51); break;
Case 'r': writelcddata (0x52); break;
Case's ': writelcddata (0x53); break;
Case 'T': writelcddata (0x54); break;
Case 'U': writelcddata (0x55); break;
Case 'V': writelcddata (0x56); break;
Case 'W': writelcddata (0x57); break;
Case 'X': writelcddata (0x58); break;
Case 'y': writelcddata (0x59); break;
Case 'Z': writelcddata (0x5a); break;
Case 'A': writelcddata (0x61); break;
Case 'B': writelcddata (0x62); break;
Case 'C': writelcddata (0x63); break;
Case 'D': writelcddata (0x64); break;
Case 'E': writelcddata (0x65); break;
Case 'F': writelcddata (0x66); break;
Case 'G': writelcddata (0x67); break;
Case 'H': writelcddata (0x68); break;
Case 'I': writelcddata (0x69); break;
Case 'J': writelcddata (0x6a); break;
Case 'K': writelcddata (0x6b); break;
Case 'l': writelcddata (0x6c); break;
Case 'M': writelcddata (0x6d); break;
Case 'N': writelcddata (0x6e); break;
Case 'O': writelcddata (0x6f); break;
Case 'p': writelcddata (0x70); break;
Case 'q': writelcddata (0x71); break;
Case 'r': writelcddata (0x72); break;
Case's ': writelcddata (0x73); break;
Case 'T': writelcddata (0x74); break;
Case 'U': writelcddata (0x75); break;
Case 'V': writelcddata (0x76); break;
Case 'W': writelcddata (0x77); break;
Case 'X': writelcddata (0x78); break;
Case 'y': writelcddata (0x79); break;
Case 'Z': writelcddata (0x7a); break;
Default: break;
}
}
Void showchar (unsigned char char1 [])
{
Unsigned char count;
For (COUNT = 0; count ++)
{
Showonechar (char1 [count]);
If (char1 [count + 1] = '/0 ')
Break;
}
}
Void keyprocess (unsigned char keycode)
{
Writelcdcommand (0xc7 );
Switch (keycode)
{
Case 11: showonechar ('7'); break; // '7'
Case 12: showonechar ('8'); break; // '8'
Case 13: showonechar ('9'); break; // '9'
Case 21: showonechar ('4'); break; // '4'
Case 22: showonechar ('5'); break; // '5'
Case 23: showonechar ('6'); break; // '6'
Case 31: showonechar ('1'); break; // '1'
Case 32: showonechar ('2'); break; // '2'
Case 33: showonechar ('3'); break; // '3'
Case 42: showonechar ('0'); break; // '0'
Case 14: showonechar ('/'); break ;//'/'
Case 24: showonechar ('*'); break ;//'*'
Case 34: showonechar ('-'); break ;//'-'
Case 44: showonechar ('+'); break; // '+'
Case 43: showonechar ('='); break; // '='
Case 41: showonechar ('C'); break; // 'on/C'
Default: break;
}
}
Char lcdbusystatus ()
{
Char status;
Rs = 0; RW = 1; E = 1;
P0 = status;
Delayms ();
E = 0;
Return status;
}
Void lcdbusywait ()
{
While (lcdbusystatus () & 0x80 = 0x80 );
Delayms ();
}
Void setlcdpos (char P)
{
Writelcdcommand (p | 0x80 );
}
Void writelcdstring (char P, char * s)
{
Int I;
Setlcdpos (P );
For (I = 0; I <10; I ++)
{
Writelcddata (s [I]);
}
}
Void lcdinit ()
{
Writelcdcommand (0x38 );
Delayms ();
Writelcdcommand (0x01 );
Delayms ();
Writelcdcommand (0x06 );
Delayms ();
Writelcdcommand (0x0c );
Delayms ();
}
Void main ()
{
Unsigned char count;
Lcdinit ();
Scanport = 0x0f;
While (1)
{
If (scanport! = 0x0f)
{
For (COUNT = 0; count <200; count ++ );
If (scanport! = 0x0f)
Keyprocess (uckeyscan ());
}
}
}
There is a circuit diagram in the photo. If it is a 51 single-chip microcomputer, then I know how to get it. My Keyboard Scan program will be sent to the slave machine through the serial port after scanning, I scanned the keyboard from lm1602 on the machine, but there was a problem with my serial port. I don't know whether it was a sending problem or a receiving problem or both of them had a problem. I asked for help because I was not deeply touched, hope you can get help.
Secondly, I want to discuss the effectiveness and Stability of the 51 single-chip microcomputer. Thank you. How can we achieve this. my qq76211822, MCU technology group: 42088422, also hope to help me solve the problem. grateful