标题:
帮忙看看lcd显示程序有什么错误,lcd不显示字符 求帮助
[打印本页]
作者:
迟早要开荤
时间:
2019-4-8 17:57
标题:
帮忙看看lcd显示程序有什么错误,lcd不显示字符 求帮助
#include <reg52.h>
#include <intrins.h>
#include "main.h"
#define uchar unsigned char
#define uint unsigned int
/*LCD12864 端口定义*/
#define LCD_data P0 //数据口
sbit LCD_RS = P2^5; //寄存器选择输入
sbit LCD_RW = P2^6; //液晶读/写控制
sbit LCD_EN = P2^7; //液晶使能控制
sbit LCM_RST = P3^2;
//sbit LCD_PSB = P0^4; //串/并方式控制,部分液晶不需要
uchar code dis0[]=" IC卡门禁系统 ";
uchar code dis1[]="1.IC卡输入 ";
uchar code dis2[]="2.密码输入:8位 ";
uchar code dis3[]="3.IC卡登记 ";
uchar code dis4[]="4.密码设置:8位 ";
uchar code dis5[]="成功 ";
uchar code dis6[]="失败 ";
void delay(int ms) //延时xms
{
while(ms--)
{
uchar i;
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void delayNOP() //延时4us
{ _nop_(); _nop_(); _nop_(); _nop_();}
/*******************************************************************/
/* */
/*因为引脚的定义DB0..DB7是从P1.7...P1.0排列的 */
/*所以顺序需要调换一下 */
/* */
/*******************************************************************/
INT8U swapbit(INT8U udata)
{
INT8U ii,tmp=0;
for(ii=0;ii<8;ii++)
{
tmp<<=1;
if(udata&0x01)
{
tmp|=0x01;
}
udata>>=1;
}
return tmp;
}
/*******************************************************************/
/* */
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
/* */
/*******************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(LCD_data&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/* */
/*******************************************************************/
void write_cmd(unsigned char WCLCM,BuysC)
{
unsigned int K=20000;
while(lcd_busy() && K--); //预防没插LCD时候停在这
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
LCD_data = swapbit(WCLCM);
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/* */
/*******************************************************************/
void lcd_wdat(unsigned char WDLCM)
{
unsigned int K=20000;
while(lcd_busy() && K--); //预防没插LCD时候停在这
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
LCD_data= swapbit(WDLCM);
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/* LCD初始化设定 */
/* */
/*******************************************************************/
void lcd_init()
{
// LCD_PSB = 1; //并口方式 ,部分液晶不需要
// LCM_RST =0;
write_cmd(0x36); //扩充指令操作
delay(5);
write_cmd(0x30); //基本指令操
delay(5);
write_cmd(0x0C); //显示开,关光标
delay(5);
write_cmd(0x01); //清除LCD的显示内容
delay(5);
}
/*********************************************************/
/* */
/* 设定显示位置 */
/* */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y ;
write_cmd(pos); //显示地址
}
/*********************************************************/
/* */
/* 显示主程序 */
/* */
/*********************************************************/
void display_all()
{
uchar i;
lcd_pos(0,0); //第一行显示数字0~9
i = 0;
while(dis0[i] != '\0')
{
lcd_wdat(dis0[i]); //显示字母
i++;
}
lcd_pos(1,0); //第二行显示字母
i = 0;
while(dis1[i] != '\0')
{
lcd_wdat(dis1[i]); //显示字母
i++;
}
lcd_pos(2,0); //第三行显示文字
i = 0;
while(dis2[i] != '\0')
{
lcd_wdat(dis2[i]);
i++;
}
lcd_pos(3,0); //第四行显示广工无线电社
i = 0;
while(dis3[i] != '\0')
{
lcd_wdat(dis3[i]);
i++;
}
}
/*********************************************************/
/* */
/* 特定字符显示主程序 */
/*
C:
0=" IC卡点台灯 ";
1="1.读卡中.... ";
2="2.登记.... ";
3="成功 ";
4="失败 ";
/*********************************************************/
void display(uchar a,uchar b,uchar c)
{
uchar i;
lcd_pos(a,b); //第一行显示数字0~9
i = 0;
switch(c)
{
case 0:
while(dis0[i] != '\0')
{
lcd_wdat(dis0[i]); //显示字母
i++;
}
break;
case 1:
while(dis1[i] != '\0')
{
lcd_wdat(dis1[i]); //显示字母
i++;
}
break;
case 2:
while(dis2[i] != '\0')
{
lcd_wdat(dis2[i]); //显示字母
i++;
}
break;
case 3:
while(dis3[i] != '\0')
{
lcd_wdat(dis3[i]); //显示字母
i++;
}
break;
case 4:
while(dis4[i] != '\0')
{
lcd_wdat(dis4[i]); //显示字母
i++;
}
break;
case 5:
while(dis5[i] != '\0')
{
lcd_wdat(dis5[i]); //显示字母
i++;
}
break;
case 6:
while(dis6[i] != '\0')
{
lcd_wdat(dis6[i]); //显示字母
i++;
}
break;
default :break;
}
}
/*********************************************************/
/* */
/* 一般字符显示主程序 */
/*
*p:内容
c:个数
/*********************************************************/
void display2(uchar a,uchar b,uchar *p,uchar num)
{
uchar i;
lcd_pos(a,b); //第一行显示数字0~9
for(i=0;i<num;i++)
lcd_wdat(p[i]); //显示字母
}
/********************
清除某一行
*********************/
void display_clear_line(uchar a)
{
uchar i;
lcd_pos(a,0);
for(i=0;i<16;i++)
lcd_wdat(' ');
复制代码
作者:
linlincm
时间:
2019-12-10 10:23
请问你解决了吗,我也遇到一样的问题。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1