用STC15w408单片机6线驱动1602液晶屏
1602的驱动最多需要11线,其中数据线需要8条。也可以采用4条数据线来驱动,只写不读的话,还可以省去RW线,这样最少只需要6线就可以驱动1602。
采用4条数据线一般是使用单片机端口的高四位,但16脚封装的STC15W408没有完整的高四位可以采用,所以就使用了低四位。
单片机程序如下:
/**
LCD1602 6线驱动显示
使用STC15W408AS , 数据口使用P1.0-P1.3 低四位
**/
#include <STC15.h>
#include <intrins.h>
#define uchar unsigned char
sbit RS = P5^5;
sbit EN = P5^4;
void Delay1us() //@11.0592MHz //STC15W408AS使用
{
_nop_();
_nop_();
_nop_();
}
void LCD_en_write()
{
EN = 1;
Delay1us();
EN = 0;
}
void Delay1ms() //@11.0592MHz //STC15W408AS使用
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
void LCD1602_Write(uchar style,uchar input) //使用STC15W408AS低四位发送数据
{
uchar temp,high;
Delay1ms();
if(style==0)
RS = 0; //命令‘0’
else
RS = 1; //命令‘1’
high = input>>4; //数据高四位移到低四位
temp= P1 & 0XF0; //清低四位
P1 = temp |( high & 0x0f); //写高四位
Delay1ms();
LCD_en_write();
temp= P1 & 0XF0; //清低四位
P1 = temp |( input & 0x0f);//写低四位
Delay1ms();
LCD_en_write();
}
void LCD_Display(uchar x, uchar y, uchar *str)
{
if(y)
LCD1602_Write(0,(0xc0+x));
else
LCD1602_Write(0,(0x80+x));
while(*str !='\0')
LCD1602_Write(1,*str++);
}
void LCD1602_initial()
{
LCD1602_Write(0,0x28); //设置16*2显示,5*7点阵,4位数据接口
Delay1ms();
LCD1602_Write(0,0x28);
Delay1ms();
LCD_en_write();
Delay1ms();
LCD1602_Write(0,0x28);
LCD1602_Write(0,0x0c); //开显示 无光标
LCD1602_Write(0,0x06); //读写一字节后地址指针加1
LCD1602_Write(0,0x01); //清屏
Delay1ms();
}
/*
void LCD1602_set_XY(uchar x,uchar y)
{
if(y)
LCD1602_Write(0,(0xc0+x));
else
LCD1602_Write(0,(0x80+x));
}
void LCD1602_write_data(uchar x,uchar y,uchar dat)
{
LCD1602_set_XY(x,y);
LCD1602_Write(1,dat);
}
*/
void main()
{ uchar TestStr[] = {"Welcome!"};
uchar str[] = {"LCD1602 display"};
LCD1602_initial();
Delay1ms();
LCD_Display(4, 0, &TestStr); //显示字符串
Delay1ms();
LCD_Display(0, 1, &str);
while(1);
}
|