|

楼主 |
发表于 2017-7-27 20:13:11
|
显示全部楼层
是初学者还是老鸟
我先前没有51的基础,我一看STM32不行就学51了。
求助一个问题,STC15F2K60S2驱动LCD1602模块,就是不好使。
我的硬件没问题,接线没有错
但是我听说单片机管脚有被复用的可能,是不是改一下IO口就可以。。
我找了半天也想不出用那个IO口。。
还有一种说法是STC增强系列的处理速度太快,延时需要加长。我C语言还不太会,看不出哪里是延时,我贴个程序看看吧。。
#include <reg51.h>
#define LCD1602_DB P0
sbit LCD1602_RS = P1^0;
sbit LCD1602_RW = P1^1;
sbit LCD1602_E = P1^2;
void InitLcd1602();
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
void main()
{
unsigned char str[] = "2017 07 21";
InitLcd1602();
LcdShowStr(2, 0, str);
LcdShowStr(0, 1, "welcome 2017");
while (1);
}
/**********等待液晶准备好**********/
void LcdWaitReady()
{
unsigned char sta;
LCD1602_DB = 0xFF;
LCD1602_RS = 0;
LCD1602_RW = 1;
do {
LCD1602_E =1;
sta = LCD1602_DB;//读取状态字
LCD1602_E = 0;
} while(sta & 0x80);//bit7等于1表示液晶正忙,重复检测直到其等于0为止
}
/*向LCD1602液晶写入一字节命令,cmd-待写入命令值*/
void LcdWriteCmd(unsigned char cmd)
{
LcdWaitReady();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
LCD1602_E = 1;
LCD1602_E = 0;
}
/*向LCD1602液晶写入一字节数据,dat-待写入数据值*/
void LcdWriteDat(unsigned char dat)
{
LcdWaitReady();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
LCD1602_E = 1;
LCD1602_E = 0;
}
/*设置显示RAM起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标*/
void LcdSetCursor(unsigned char x,unsigned char y)
{
unsigned char addr;
if(y==0) //由输入的屏幕坐标计算显示RAM的地址
addr = 0x00 + x; //第一行字符地址从0x00起始
else
addr = 0x40 + x; //第二行字符地址从0x40起始
LcdWriteCmd(addr | 0x80); //设置RAM地址
}
/*在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针*/
void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str)
{
LcdSetCursor(x, y); //设置起始地址
while (*str != '\0') //连续写入字符串数据,直到检测到结束符
{
LcdWriteDat(*str++); //先取str指向的数据,然后str自动加1
}
}
/******初始化1602液晶******/
void InitLcd1602()
{
LcdWriteCmd(0x38); //16*2显示,5*7点阵,8位数据接口
LcdWriteCmd(0x0c); //显示器开,光标关闭
LcdWriteCmd(0x06); //文字不动,地址自动+1
LcdWriteCmd(0x01); //清屏
}
请问这么多函数,是按顺序从上到下一个个执行吗?为啥初始化放在最后呢。。
先谢!!
|
|