买了一个1602液晶屏想显示点东西玩 但是接上怎么都不现实 用的程序是 郭天祥的那个,我就把里面的 RW RS和EN改了一下
但是总是失败 一直是方块
我得 数据是接的P1 然后 RS是P3.4 RW 3.5 EN 3.6
2.jpg (167.88 KB, 下载次数: 0)
下载附件
2012-9-5 17:13 上传
线没有问题 开始用的杜邦线 后来直接焊接的 都不行 求教各位大神
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code table[]="I LIKE MCU!";
- uchar code table1[]="WWW.TXMCU.COM";
- sbit lcden=P3^6;
- sbit lcdrw=P3^5;
- sbit lcdrs=P3^4;
- uchar num;
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void write_com(uchar com)
- {
- lcdrs=0;
- P0=com;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void write_data(uchar date)
- {
- lcdrs=1;
- P0=date;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void init()
- {
- lcdrw=0;
- lcden=0;
- write_com(0x38);
- write_com(0x0e);
- write_com(0x06);
- write_com(0x01);
- write_com(0x80+0x10);
- }
- void main()
- {
- init();
- for(num=0;num<11;num++)
- {
- write_data(table[num]);
- delay(20);
- }
- // write_com(1);
- write_com(0x80+0x53);
- for(num=0;num<13;num++)
- {
- write_data(table1[num]);
- delay(20);
- }
- for(num=0;num<16;num++)
- {
- write_com(0x18);
- delay(20);
- }
- while(1);
- }
复制代码
#include "lcd1602.h"
#include "..mainext_reg.h"
#include "..mainport.h"
#include <intrins.h>
#define NOP() { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_();}
#define _nop_() {;}
/*****************LCD初始化设定****************/
void lcd_init()
{
uchar i;
mDisplay_count=0;
lcd_wcmd(0x38); //设置LCD为16X2显示,5X7点阵,八位数据接口00111000
for (i=0;i<125;i++){NOP();NOP();}
lcd_wcmd(0x38);
for (i=0;i<125;i++){NOP();}
lcd_wcmd(0x0c); //LCD开显示及光标设置(光标不闪烁,不显示"-")
for (i=0;i<125;i++){NOP();}
lcd_wcmd(0x06); //LCD显示光标移动设置(光标地址指针加1,整屏显示不移动)
for (i=0;i<125;i++){NOP();}
lcd_wcmd(0x01); //清除LCD的显示内容
for (i=0;i<125;i++){NOP();}
}
void LCD_Update()
{
if(mDisplay_count)
{
mDisplay_count--;
return;
}
LCD_DisPosCode();
mDisplay_count = 5;
}
void LCD_DisPosCode()
{
dis_buf1[0]='1';
dis_buf1[1]='2';
dis_buf1[2]='3';
dis_buf1[3]='4';
dis_buf1[4]=' ';
dis_buf1[5]=32;
dis_buf1[6]=53;
dis_buf1[7]=13;
dis_buf1[8]=23;
dis_buf1[9]=' ';
dis_buf1[10]=' ';
dis_buf1[11]=' ';
dis_buf1[12]=' ';
dis_buf1[13]=5+48;
dis_buf1[14]=6+48;
dis_buf1[15]=' ';
dis_buf2[0]=' ';
dis_buf2[1]=' ';
dis_buf2[2]=8+48;
dis_buf2[3]=8+48;
dis_buf2[4]=8+48;
dis_buf2[5]=9+48;
dis_buf2[6]=9+48;
dis_buf2[7]=' ';
dis_buf2[8]='F';
dis_buf2[9]='C';
dis_buf2[10]=1+48;
dis_buf2[11]=1+48;
dis_buf2[12]=1+48;
dis_buf2[13]=1+48;
dis_buf2[14]='A';
dis_buf2[15]=' ';
pro_display();
}
/**********************LCD显示处理程序********************/
void pro_display()
{ uchar i;
lcd_pos(0x00); //第一行
for (i=0;i<=15;i++)
{lcd_wdat(dis_buf1);}
lcd_pos(0x40);//第二行
for (i=0;i<=15;i++)
{lcd_wdat(dis_buf2);}
}
/**************检测LCD忙**********************/
bit lcd_busy()
{ uint i,j;
bit result;
RS = 0;
RW = 1;
EN = 1;
i = 30;
while(i>0) i--;
j=P2;
result =j & 0x80; //D7=1为忙碌,D7=0为空闲
EN = 0;
return result;
}
/**************写入指令到LCD**********************/
void lcd_wcmd(uchar cmd)
{
if(lcd_busy()){return;}; //当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写指令
RS = 0; //RS=0,即是选择1602LCD的指令寄存器
RW = 0; //低电平为写操作
EN = 0;
NOP();
P2 = cmd; //送命令到P0口,即送一个字节的数据到LCD1602的指令寄存器中
NOP();
EN = 0;
EN = 1; //ep即使能端,由高电平跳变到低电平时,执行命令
NOP();
EN = 0;
}
/****************写入数据到LCD*******************/
void lcd_wdat(char dat)
{
while(lcd_busy()); //当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写数据
RS = 1;
RW = 0;
EN = 0;
P2 = dat;
NOP();
EN = 1; //ep即使能端,由高电平跳变到低电平时,执行命令
EN = 1;
EN = 0;
NOP();
}
//LCD数据指针位置程序
void lcd_pos(char pos)
{
lcd_wcmd(pos|0x80); //数据指针=80+地址码(00H~27H,40H~67H)
}
你用这个参考下看看,这个我是用STC12C5A48S2通过的
一周热门 更多>