LCD1602.rar
(44.21 KB, 下载次数: 45)
这个是ISIS图
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
//50US秒延时
sbit rs=P2^4;
sbit rw=P2^5;
sbit e=P2^6;
uchar table1[]="kkkk";
uchar table2[]="1234";
void delay_50us(x)//延时
{
uchar j;
for(;x>0;x--);
for(j=19;j>0;j--);
}
void xie_com(uchar com)//开启写
{
e=0;
rs=0;
rw=0;
P0=com;
delay_50us(10);
e=1;
delay_50us(20);
e=0;
}
void xie_data(uchar dat)//写数据
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_50us(10);
e=1;
delay_50us(20);
e=0;
}
void init(void)//初始化函数
{
delay_50us(300);
xie_com(0x38);
delay_50us(100);
xie_com(0x38);
delay_50us(100);
xie_com(0x38);
xie_com(0x38);
xie_com(0x08);
xie_com(0x01);
xie_com(0x06);
xie_com(0x0c);
}
main()
{
uchar j;
init();//初始化
xie_com(0x80);//第1行起始位子
for(j=0;j<16;j++)
{
xie_data(table1[j]);
delay_50us(10);
}
xie_com(0x80+0x40);//第2行起始位子
for(j=0;j<16;j++)
{
xie_data(table2[j]);
delay_50us(10);
}
while(1);
}
发现LCD1602没显示数据!
你这代码有问题。没必要什么都去延时个几毫秒的,延时那么多干嘛。你这个设置显示坐标有问题,你每次写入数据前都把要写入的坐标地址发送一次。
- #include<lcd1602.h>
- #include<reg52.h>
- #include<delay.h>
- #include<intrins.h>
- sbit RS=P2^0;
- sbit RW=P2^1;
- sbit EN=P2^2;
- #define RS_CLR RS=0
- #define RS_SET RS=1
- #define RW_SET RW=1
- #define RW_CLR RW=0
- #define EN_SET EN=1
- #define EN_CLR EN=0
- #define DataPort P1
- bit LCD1602_CheckBusy()
- {
- DataPort=0xff;
- RS_CLR;
- RW_SET;
- _nop_();
- EN_SET;
- return (bit)(DataPort&0x80);
- EN_CLR;
- }
- void LCD1602_WriteByte(UINT8 byte)
- {
- //UINT8 i;
- while(LCD1602_CheckBusy())
- ;
- EN_SET;
- RS_SET;
- RW_CLR;
- DataPort=byte;
- _nop_();
- EN_CLR;
- }
- void LCD1602_WriteCommand(UINT8 command)
- {
- while(LCD1602_CheckBusy())
- ;
- EN_SET;
- RS_CLR;
- RW_CLR;
- DataPort=command;
- _nop_();
- EN_CLR;
- }
- void LCD1602_ClearScreen()
- {
- LCD1602_WriteCommand(0x01);
- DelayMs(10);
- }
- void LCD1602_SetXY(UINT8 x,UINT8 y)
- {
- if(y==0)
- LCD1602_WriteCommand(0x80+x);
- if(y==1)
- LCD1602_WriteCommand(0xc0+x);
- }
- void LCD1602_WriteString(UINT8 x,UINT8 y,UINT8 *s)
- {
- while(*s)
- {
- LCD1602_SetXY(x,y);
- LCD1602_WriteByte(*s);
- s++;
- x++;
- }
- }
- void LCD1602_WriteChar(UINT8 x,UINT8 y,UINT8 ch)
- {
- LCD1602_SetXY(x,y);
- LCD1602_WriteByte(ch);
- }
- void LCD1602_Init(void)
- {
- LCD1602_WriteCommand(0x38);
- DelayMs(5);
- LCD1602_WriteCommand(0x0f);
- //LCD1602_WriteCommand(0x06);
- //LCD1602_WriteCommand(0x09);
- LCD1602_WriteCommand(0x0c);
- }
复制代码这是我1602的驱动,你看下,那个Cheack_Busy()是判忙函数,可以不用,我用164转并口驱动1602的时候没写这个函数,没关系,其他的都是必要的。评分
查看全部评分
新人嘛~初学呢,感谢你的帮助
不是说他简单没人回复,而是说这个程序没有一点注释 其实首先应该自己经过努力 然后将问题描述清楚, 这样不是更好么 个人谬论 谬论
一周热门 更多>