📄 hd44780.c
字号:
/*显示模块,可通用于基于HD44780内控器的液晶显示器*/
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
bit bflag ;
sbit LIGHT = P0^4;
sbit E = P0^5;
sbit RW = P0^6;
sbit RS = P0^7;
sbit x5045_cs = P0^0;
sbit sclk = P0^3;
sbit din = P0^2;
sbit dout = P0^1;
uchar serial_time = 0;
uchar display[16] = {"Hi how are you"};
void send_byte ( uchar ucdata_1 ); /*发送一个字节*/
uchar receive_byte ( void ); /*接收一个字节*/
void write_std ( uchar ucstd_1 ); /*写状态寄存器*/
void write_data (uchar address_1, uchar ucdata_2);/*写一个字节数据*/
uchar read_data (uchar address_2); /*读一个字节数据*/
void x5045_wait (void); /*测试x5045是否处于写数据状态*/
void lcd_chekbusy ( void ); /*测试忙*/
void lcd_wrcmd ( unsigned char lcd_cmd ); /*写命令*/
void lcd_wrdata ( unsigned char lcd_data ); /*写数据*/
void lcd_moveto ( unsigned char position ); /*写要显示的地方*/
void lcd_init ( void ); /*初始化*/
void delay ( unsigned char x )
{
unsigned char i;
do
{
for (i=0;i<125;i++) {;}
}
while ( x-- );
}
/*发送一个字节*/
void send_byte ( uchar ucdata_1 )
{
uchar i,temp1;
temp1 = ucdata_1;
for ( i = 0; i < 8; i++ )
{ din = temp1&0x80;
sclk = 0;
sclk = 1;
temp1<<=1;
}
din = 0;
}
/*接收一个字节*/
uchar receive_byte (void)
{
uchar i,temp2=0;
for ( i = 0; i < 8; i++ )
{
temp2<<=1;
sclk = 1;
sclk = 0;
temp2|=dout;
}
return ( temp2 );
}
/*写状态寄存器*/
void write_std ( uchar ucstd_1 )
{
sclk = 0;
x5045_cs = 0;
send_byte ( 0x06 );
sclk = 0;
x5045_cs = 1;
x5045_cs = 0;
send_byte ( 0x01 );
send_byte ( ucstd_1 );
x5045_cs = 1;
x5045_wait();
}
/*写一个字节到低半数据区*/
void write_data ( uchar address_1,uchar ucdata_2 )
{
sclk = 0; /*address_1为要写字节的地址*/
x5045_cs = 0;
send_byte ( 0x06 );
sclk = 0;
x5045_cs = 1;
x5045_cs = 0;
send_byte ( 0x02 );/*若为高半数据区,则写入0x0a*/
send_byte ( address_1 );
send_byte ( ucdata_2 );
x5045_cs = 1;
x5045_wait();
}
/*读一个字节从低半数据区*/
uchar read_data ( uchar address_2 )
{
uchar temp3 = 0;
sclk = 0;
x5045_cs = 0;
send_byte ( 0x03 );/*若为高半数据区,则写入0x0b*/
send_byte ( address_2 );
temp3 = receive_byte();
x5045_cs = 1;
return ( temp3 );
}
void x5045_wait ( void )
{
uchar j = 0;
do
{
sclk = 0;
x5045_cs = 0;
send_byte ( 0x05 );
j = receive_byte();
sclk = 0;
x5045_cs = 1;
j = j&0x01;
}
while (j);
}
void lcd_chekbusy ( void )
{
unsigned char middle;
do
{
RS = 0;
RW = 1;
E = 1;
delay ( 10 );
middle = P2;
E = 0;
}
while ( (0x80&middle)==1 );
}
void lcd_wrcmd ( unsigned char lcd_cmd )
{
delay ( 1 );
lcd_chekbusy ();
RS = 0;
RW = 0;
E = 1;
P2 = lcd_cmd;
E = 0;
delay ( 1 );
}
void lcd_wrdata ( unsigned char lcd_data )
{
unsigned char temp2;
do
{
RS = 0;
RW = 1;
E = 1;
delay ( 10 );
temp2 = P2;
E = 0;
}
while ( (0x80&temp2)==1 );
RS = 1;
RW = 0;
E = 1;
P2 = lcd_data;
E = 0;
if ( temp2 == 0x07 )
lcd_wrcmd ( 0xc0 );
}
void lcd_moveto ( unsigned char position )
{
unsigned char temp1;
lcd_chekbusy ();
if ( position < 8 )
temp1 = ( position + 0x80 - 1 );
else
temp1 = ( ( position - 9 ) + 0xc0 );
lcd_wrcmd ( temp1 );
delay ( 1 );
}
void lcd_wrstr( unsigned char *p_disp_str_da )
{
unsigned char i;
lcd_wrcmd ( 0x80 );
for ( i = 0; i < 8; i++ )
{
lcd_wrdata ( *p_disp_str_da );
p_disp_str_da++;
}
lcd_wrcmd ( 0xc0 );
for ( i = 0; i < 8; i++ )
{
lcd_wrdata (*p_disp_str_da );
p_disp_str_da++;
}
}
void lcd_wrchar (unsigned char lcd_add,unsigned char lcd_data)
{
lcd_moveto ( lcd_add );
lcd_wrdata ( lcd_data );
}
void lcd_init ( void )
{
unsigned char i;
delay ( 50 );
for ( i = 0;i < 8;i++ )
{
lcd_wrcmd ( 0x30 );
delay ( 5 );
}
lcd_wrcmd ( 0x38 );
lcd_wrcmd ( 0x0c );
lcd_wrcmd ( 0x06 );
lcd_wrcmd ( 0x01 );
}
void service (void) interrupt 2
{
unsigned char code key_string1[16]={"this is K1 "},
key_string2[16]={"this is K2 "},
key_string3[16]={"this is K3 "},
key_string4[16]={"this is K4 "},
key_string5[16]={"this is K5 "};
unsigned char key,key2;
EX1 = 0;
delay (30);
//if ( P1^0==1 ) goto ret;
while ( P1^0==0)
{
P1=0xfe;
key=P1;
switch ( key )
{
case 0xfc:
lcd_wrcmd ( 0x01 );
lcd_wrstr ( key_string1 );
break;
case 0xfa:
lcd_wrcmd ( 0x01 );
lcd_wrstr ( key_string2 );
break;
case 0xf6:
lcd_wrcmd ( 0x01 );
lcd_wrstr ( key_string3 );
break;
case 0xee:
lcd_wrcmd ( 0x01 );
lcd_wrstr ( key_string4 );
break;
case 0xde:
lcd_wrcmd ( 0x01 );
lcd_wrstr ( key_string5 );
break;
}
}
EX1 = 1;
IT1 = 1;
EA = 1;
P1 = 0x01;
_nop_();
}
void serial (void) interrupt 4
{
EA = 0;
RI = 0;
if ( serial_time == 16)
serial_time = 0;
if (SBUF == 0xaa)//judge wheather is the request
{
SBUF=0xbb;
while (TI==0);//sent the ack
TI=0;
do
{
while ( RI == 0 ); RI = 0;
display[serial_time] = SBUF;//get the real date want to send
SBUF = display[serial_time];//sent back the data just received
while ( TI == 0 ); TI = 0;
while ( RI == 0 ); RI = 0;
}
while ( SBUF!=0x77 );
}
else
EA=1;
}
void init_serial ( void )
{
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
PCON = 0x00;
TR1 = 1;
SCON =0x50;
}
void main()
{
unsigned char dis_string[16] = {"this is a test "};
unsigned char i,j,k;
init_serial ();
k = 0;
P1 = 0x01;
P2 = 0xff;
lcd_init ();
lcd_moveto (1);
lcd_wrdata ('a');
lcd_wrstr ( dis_string );
P1 = 0x01;
IE = 0;
EX1 = 1;
IT1 = 1;
ES = 1;/*开串行中断*/
EA = 1;
while ( 1 )
{ write_std ( 0x30 );
lcd_wrstr (display);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -