楼主给你点意见:
1、你的硬件连接有问题,单片机的各模块是否能正常工作?
2、你找的程序是否正确完整?烧录是否异常?
3、你找的程序是否和你自己连接的硬件匹配?
什么都不贴出来,这种问题难!还是自己检查下,也能真正的学点东西
这个问题并不难,如果你对单片机有点了解的话,看一下1602的说明书就会明白。
下面我给你一个参考程序
#include <reg52h>
#include <intrinsh>
#define uchar unsigned char
#define uint unsigned int
sbit E=P2^7; //1602使能引脚
sbit RW=P2^6; //1602读写引脚,读为高,写位低
sbit RS=P2^5; //1602数据命令选择引脚,数据为高,指令为低
uchar num;
//延时函数,延时del1ms
void delay(int del)
{
int x,y;
for(x=0;x<del;x++)
for(y=0;y<110;y++);
}
//写命令
void write_com(uchar com)
{
P0=com;
RS=0;
RW=0;
E=0;
delay(5);
E=1;
delay(5);
}
//写数据
void write_data(uchar date)
{
P0=date;
RS=1;
RW=0;
E=0;
delay(5);
E=1;
delay(5);
}
/
1602初始化函数
/
void init()
{
write_com(0x01);
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
}
/
名称 : L1602_string(uchar hang,uchar lie,uchar p)
功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
L1602_string(1,5,"ab cd ef;")
输入 : 行,列,需要输入1602的数据
输出 : 无
/
void write_string(uchar hang,uchar lie,uchar p)
{
uchar a;
if(hang == 1) a = 0x80+0x10;
if(hang == 2) a = 0xc0+0x10;
a = a + lie - 1;
write_com(a);
while(1)
{
if(p == '\0') break;
write_data(p);
delay(20);
p++;
}
}
/
主函数
/
void main()
{
uint i;
init();
write_string(1,1,"NAME:MIKE "); //照此输入你想写的数据,注意不得长于16个字符
write_string(2,1,"NUMBER:023");//照此输入你想写的数据,注意不得长于16个字符
for(i=0;i<16;i++)
{
write_com(0x18);
delay(1000); //移动速度调节
}
while(1);
}
程序中是由右向左逐个显示。1602连线如图。
如果不明白程序的意思,推荐一个视频学习。
>
看第十一讲。
设置步骤如下
1、先插接好LCD1602液晶,插接到LCD1602排针上(位于数码管上方16个孔的排母)
插接方向:插接完成后液晶屏幕处于开发板内(盖住数码管)
一定要把排针全部插入16P排母,插接是注意不能错位。
如果排针有歪斜,用户可以用手慢慢的掰正即可,不会断掉或影响使用,因为排针受外力很容易歪斜,但韧性好。
2、打开开发板电源,烧入配套LCD1602显示的程序。
3、如果没有显示字符,或者出现全黑的方格和字迹不清晰,可以找一个合适的工具,有螺丝刀最好,调节16P排母左边的“液晶对比度电位器”顺时针慢慢调节,直到显示清楚,顺时针调节增加对比度,逆时针减小对比度。
你可以使用电脑的串口,或是并口,来跟1602连接。
当然,中间可能需要一些TTL讯号准位的IC,来做沟通与连接。
并口,可使用IO378H位址。
你可以搜索百度文库。。。
基于PC打印口的IO接口扩展
打印口分析及应用扩展
应该不是判断忙碌或者不只是判断忙碌,这个语句应该是送了一串命令进去
//HD44780 LCD DRIVER
#include <AT89X52H>
#include <ctypeh>
//LCD Commands
#define LCD_CLS 1 //Clears entire display and sets DDRAM address 0
#define LCD_HOME 2 //Sets DDRAM address 0 in address counter
#define LCD_SETMODE 4 //Sets cursor move direction and specifies display shift
#define LCD_SETVISIBLE 8 //Sets entire display (D) on/off,cursor on/off (C), and blinking of cursor position character (B)
#define LCD_SHIFT 16 //Moves cursor and shifts display without changing DDRAM contents
#define LCD_SETFUNCTION 32 //Sets interface data length (DL), number of display lines (N), and character font (F)
#define LCD_SETCGADDR 64 //Sets CGRAM addressCGRAM data is sent and received after this setting
#define LCD_SETDDADDR 128 //Sets DDRAM address DDRAM data is sent and received after this setting
#define TURE 1
#define FORSE 0
#define TMH 0xf8 //delay timeh 2ms
#define TML 0xCD //delay timel
//------------------------------------------
#define MAX_DISPLAY_CHAR 2
//-----------------------------------------
unsigned char code text[6]="hellow";
static unsigned char data counter,a;
void wcchar(unsigned char d); //write a command char
void wdchar(unsigned char i); //write a data char
char wtbusy(); //wait busy sign
void clrscr(void); //clear screen
void initime0(void); //initial time0
void delay(unsigned char i); //delay
//-------------------------------
unsigned char crc8(unsigned char pData,unsigned char count);
unsigned char pData[]={0x33,0x12,0x34,0x56,0x78,0x33,0x12,0x23,0x45,0x56};
unsigned char data crc;
static char outputbuffer[MAX_DISPLAY_CHAR];
char calc_decascii(char num);
//-------------------------------
void ISR_Timer0(void) interrupt 1
{
TL0=TML;
TH0=TMH;
counter--;
}
void ISR_Int0(void) interrupt 0
{
wdchar(text[a++]); //display "hellow"
if (a>=6)
{a=0;wdchar(' ');}
}
//main program display "hellow"
main(void)
{
unsigned char data k;
initime0();
wcchar(0x38); //initial lcd
wcchar(LCD_SETVISIBLE+6); //set lcd visible
clrscr(); //clear lcd
while(1)
{
crc8(&pData,10);
calc_decascii(crc);
wdchar (outputbuffer[1]);
wdchar (outputbuffer[2]);
wdchar (' ');
for(k=0;k<=6;k++)
{
// wdchar(text[k]); //display "hellow"
P1_2=0;
delay(55); //delay
P1_2=1;
delay(55); //delay
}
}
}
//sub function || display a char
void wdchar(unsigned char i) //write a char
{
unsigned char xdata j;
P1_0=1;
P1_1=0;
j=0x8000;
j=i;
while (wtbusy())
{}
}
void wcchar(unsigned char d) //write a command char
{
unsigned char xdata j;
P1_0=0;
P1_1=0;
j=0x8000;
j=d;
while (wtbusy())
{}
}
char wtbusy() //wait busy sign
{
unsigned char xdata j;
P1_0=0;
P1_1=1;
j=0x8000;
if(j&0x80)
{
return TURE;
}
else
{
return FORSE;
}
}
//clear screen
void clrscr()
{
wcchar(LCD_CLS);
}
//initial time0
void initime0()
{
TL0=TML;
TH0=TMH;
TR0=TURE;
IE=0x93; //Enable T0 and Serial Port
}
//sub function time delay
void delay(unsigned char i)
{
counter=i;
while (counter)
{}
}
unsigned char crc8(unsigned char pData,unsigned char count)
{
// unsigned char crc;
crc = 0;
while (count-- > 0)
{
crc ^= pData++;
}
return crc;
}
char calc_decascii(char num)
// A rather messy function to convert a floating
// point number into an ASCII string
{ long data temp = num;
char data arrayptr = &outputbuffer[MAX_DISPLAY_CHAR];
long data divisor = 10;
long data result;
char data remainder,asciival;
int data i;
// If the result of the calculation is zero
// insert a zero in the buffer and finish
if (!temp)
{ arrayptr = 48;
goto done;
}
// Handle Negative Numbers
if (temp < 0)
{ outputbuffer[0] = '-';
temp -= 2temp;
}
for (i=0 ; i < sizeof(outputbuffer) ; i++)
{ remainder = temp % divisor;
result = temp / divisor;
// If we run off the end of the number insert a space into
// the buffer
if ((!remainder) && (!result))
{ arrayptr = ' ';}
// We're in business - store the digit offsetting
// by 48 decimal to account for the ascii value
else
{ asciival = remainder + 48;
arrayptr = asciival;
}
temp /= 10;
// Save a place for a negative sign
if (arrayptr != &outputbuffer[1]) arrayptr--;
}
done: return outputbuffer;
}
以上就是关于你好!我的51单片机接1602液晶显示器,为什么程序下进去液晶显示器不显示全部的内容,包括:你好!我的51单片机接1602液晶显示器,为什么程序下进去液晶显示器不显示、有关单片机1602液晶显示汉字并且右移的题目,急急急!!!!、1602与单片机的编程接口设置等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)