|
在做一个关于门禁的项目的时候发现LCD1602点不亮,因为自己的做的板子和开发板不一样P0处是倒着接的,所以用了一个逆序函数,但还是不行。原函数(不存在逆序函数)的可以在开发板上显示。不存在接触不良问题,电位10K和4.7k都试过了。请大家帮我看看程序有没有问题,谢谢啦。
单片机源程序如下:
- /*********************************************************************************
- * 【外部晶振】: 11.0592mhz
- * 【主控芯片】: STC89C52
- * 【编译环境】: Keil μVisio3
- * 【程序功能】: LCD1602显示
- * 【使用说明】: 正确接上LCD1602液晶并调节好对比度
- * 说明:免费开源,不提供源代码分析.
- **********************************************************************************/
- #include <reg52.h>
- /*=================================================
- *自定义数据类型
- =================================================*/
- typedef unsigned char uchar;
- typedef unsigned int uint;
- #define LCD1602_DB P0 //LCD1602数据总线
- <font color="#ff0000">sbit LCD1602_RS = P2^5; //RS端
- sbit LCD1602_RW = P2^6; //RW端
- sbit LCD1602_EN = P2^7; //EN端</font>
- //sbit DU = P2^6;//
- //sbit WE = P2^7;//数码管位选段选用于关闭数码管显示
- unsigned char swapbit(unsigned char udata) //<font color="#ff0000">逆位显示</font>
- {
- unsigned char ii,tmp=0;
- for(ii=0;ii<8;ii++)
- {
- tmp<<=1;
- if(udata&0x01)
- {
- tmp|=0x01;
- }
- udata>>=1;
- }
- return tmp;
- }
- /*=================================================
- *函数名称:Read_Busy
- *函数功能:判断1602液晶忙,并等待
- =================================================*/
- void Read_Busy()
- {
- uchar busy;
- LCD1602_DB = 0xff;//复位数据总线
- LCD1602_RS = 0; //拉低RS
- LCD1602_RW = 1; //拉高RW读
- do
- {
- LCD1602_EN = 1;//使能EN
- busy = swapbit(LCD1602_DB);//读回数据
- LCD1602_EN = 0; //拉低使能以便于下一次产生上升沿
- }while(busy); //判断状态字BIT7位是否为1,为1则表示忙,程序等待
- }
- /*=================================================
- *函数名称:LCD1602_Write_Cmd
- *函数功能:写LCD1602命令
- *调用:Read_Busy();
- *输入:cmd:要写的命令
- =================================================*/
- void LCD1602_Write_Cmd(uchar cmd)
- {
- Read_Busy(); //判断忙,忙则等待
- LCD1602_RS = 0;
- LCD1602_RW = 0; //拉低RS、RW操作时序情况1602课件下中文使用说明基本操作时序章节
- LCD1602_DB = swapbit(cmd);//写入命令
- LCD1602_EN = 1; //拉高使能端 数据被传输到LCD1602内
- LCD1602_EN = 0; //拉低使能以便于下一次产生上升沿
- }
- /*=================================================
- *函数名称:LCD1602_Write_Dat
- *函数功能:写LCD1602数据
- *调用:Read_Busy();
- *输入:dat:需要写入的数据
- =================================================*/
- void LCD1602_Write_Dat(uchar dat)
- {
- Read_Busy();
- LCD1602_RS = 1;
- LCD1602_RW = 0;
- LCD1602_DB = swapbit(dat);
- LCD1602_EN = 1;
- LCD1602_EN = 0;
- }
- /*=================================================
- *函数名称:LCD1602_Dis_OneChar
- *函数功能:在指定位置显示一个字符
- *调用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();
- *输入:x:要显示的横坐标取值0-40,y:要显示的行坐标取值0-1(0为第一行,1为第二行)
- dat:需要显示的数据以ASCLL形式显示
- =================================================*/
- /*
- void LCD1602_Dis_OneChar(uchar x, uchar y,uchar dat)
- {
- if(y) x |= 0x40;
- x |= 0x80;
- LCD1602_Write_Cmd(x);
- LCD1602_Write_Dat(dat);
- }
- */
- /*=================================================
- *函数名称:LCD1602_Dis_Str
- *函数功能:在指定位置显示字符串
- *调用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();
- *输入:x:要显示的横坐标取值0-40,y:要显示的行坐标取值0-1(0为第一行,1为第二行)
- *str:需要显示的字符串
- =================================================*/
- void LCD1602_Dis_Str(uchar x, uchar y, uchar *str)
- {
- if(y) x |= 0x40;
- x |= 0x80;
- LCD1602_Write_Cmd(x);
- while(*str != '\0')
- {
- LCD1602_Write_Dat(*str++);
- }
- }
- /*=================================================
- *函数名称:Init_LCD1602
- *函数功能:1602初始化
- *调用: LCD1602_Write_Cmd();
- =================================================*/
- void Init_LCD1602()
- {
- LCD1602_Write_Cmd(0x38); //设置16*2显示,5*7点阵,8位数据接口
- LCD1602_Write_Cmd(0x0c); //开显示
- LCD1602_Write_Cmd(0x06); //读写一字节后地址指针加1
- LCD1602_Write_Cmd(0x01); //清除显示
- }
- void main()
- {
- // int n;
- uchar TestStr[] = {"welcome!"};
- uchar str[] = {"LCD1602 display"};
- //DU = 0;
- //WE = 0;//关闭数码管显示
- Init_LCD1602();//1602初始化
- LCD1602_Dis_Str(0, 0, &TestStr[0]); //显示字符串
- LCD1602_Dis_Str(0, 1, &str[0]); //显示字符串
- // LCD1602_Dis_OneChar(15, 1, 0xff); //显示一个黑方格 请查表
- while(1);
- }
复制代码
|
|