登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

求助:我的1602LCD显示怎么是16个黑的方块

作者:yifenqian 栏目:单片机
求助:我的1602LCD显示怎么是16个黑的方块
程序是下载别人的:用的是总线方式:
那位大侠还有1602的总线方式程序没?给我发一份好么?
yifenqian@tom.com
zhou__heng@16.com
/*===========================================================================

            KS0070(44780) 16x2 字符液晶屏驱动演示程序总线方式         晓奇
=============================================================================
连接线图:    LCM-------51     LCM-------51     LCM--------51
            DB0-----P0.0     DB4-----P0.4     RW-------P2.0
            DB1-----P0.1     DB5-----P0.5     RS-------P2.1
            DB2-----P0.2     DB6-----P0.6     E--------P2.7 =>74LS00+wr+rd
            DB3-----P0.3     DB7-----P0.7     VLCD接1K2电阻到GND

[注]:AT89C51的晶振频率为12MHZ
============================================================================*/
//#pragma src                                // 产生汇编文件
#include <reg51.h>
#include<intrins.h>

//========= 变量类型标识的宏定义,大家都喜欢这么做 ==============
#define    UCHAR unsigned CHAR
#define Uint unsigned int

// ================= LCM1602A端口地址定义 =======================
CHAR xdata Lcd1602CmdPort  _at_ 0x7cff;        //E=1 RS=0 RW=0
CHAR xdata Lcd1602WdataPort  _at_ 0x7eff;    //E =1 RS=1 RW=0
CHAR xdata Lcd1602StatusPort  _at_ 0x7dff;    //CS=1 RS=0 RW=1

#define Busy    0x80                         // 忙判别位


code CHAR exampl[]="For an example.     - By xiaoqi\n";

void Delay400Ms(void);
void Delay5Ms(void);
void LcdWriteData( CHAR dataW );
void LcdWriteCommand( UCHAR CMD,UCHAR AttribC );
void LcdReset( void );
void DISPLAY( UCHAR dd );
void DispOneChar(UCHAR x,UCHAR y,UCHAR Wdata);
void ePutstr(UCHAR x,UCHAR y, UCHAR code *ptr);

//================ 随便写几句测试主程序 ================
void main(void)
{
    UCHAR TEMP;
    
    Delay400Ms();                /*启动时必须的延时,等待lcm进入工作状态*/

    LcdReset();                    /* 这也是必需的....初始化*/
    TEMP = 32;
    ePutstr(0,0,exampl);        /*上面一行显示一个预定字符串*/

    Delay400Ms();                /* 保留显示内容*/
    Delay400Ms();
    Delay400Ms();
    Delay400Ms();
    Delay400Ms();
    Delay400Ms();
    Delay400Ms();
    Delay400Ms();

    while(1)
    {
        TEMP &= 0x7f;            /* 只显示ASCII字符*/
        if (TEMP<32)TEMP=32;    /*屏蔽控制字符,不予显示*/
        DISPLAY( TEMP++ );    
        Delay400Ms();
    }
}

/*=======================================================
显示字符串
=======================================================*/
void ePutstr(UCHAR x,UCHAR y, UCHAR code *ptr) {
UCHAR i,l=0;
    while (ptr[l] >31){l++;};
    for (i=0;i<l;i++) {
        DispOneChar(x++,y,ptr[i]);
        if ( x == 16 ){
            x = 0; y ^= 1;
        }
    }
}

/*=======================================================
演示一行连续字符串,配合上位程序演示移动字串
=======================================================*/
void DISPLAY( UCHAR dd ) {

UCHAR i;
    
    for (i=0;i<16;i++) {

        DispOneChar(i,1,dd++);
        
        dd &= 0x7f;
        if (dd<32) dd=32;
    }
}

/*=======================================================
显示光标定位
=======================================================*/
void LocateXY( CHAR posx,CHAR posy) {

UCHAR TEMP;

    TEMP = posx & 0xf;
    posy &= 0x1;
    if ( posy )TEMP |= 0x40;
    TEMP |= 0x80;
    LcdWriteCommand(TEMP,0);
}

/*=======================================================
按指定位置显示数出一个字符
=======================================================*/
void DispOneChar(UCHAR x,UCHAR y,UCHAR Wdata) {

    LocateXY( x, y );                // 定位显示地址
    LcdWriteData( Wdata );            // 写字符
}

/*=======================================================
初始化程序, 必须按照产品资料介绍的初始化过程进行
=======================================================*/
void LcdReset( void ) {

       LcdWriteCommand( 0x38, 0);            /* 显示模式设置(不检测忙信号)*/
        Delay5Ms();
    LcdWriteCommand( 0x38, 0);            /* 共三次*/
        Delay5Ms();
    LcdWriteCommand( 0x38, 0);
        Delay5Ms();

    LcdWriteCommand( 0x38, 1);            /*显示模式设置(以后均检测忙信号)*/
    LcdWriteCommand( 0x08, 1);            /*显示关闭*/
       LcdWriteCommand( 0x01, 1);           &nbs
2楼: >>参与讨论
etiller
楼主有没有1602的资料给一份
尤其是关于字符对应的字段的说明那部分?

3楼: >>参与讨论
yxhyxh
仔细看看你的初始化程序是否正确。
 
4楼: >>参与讨论
yifenqian
你的邮箱那?
 
5楼: >>参与讨论
bcaiyo
我刚在用一个三星的S6A0069
我刚在用一个三星的S6A0069的,不过我只用了4位数据线。端口少啊。你最好看一下初始化的程序,有的指令处理时间长一点,看一下忙标志位呀,我感觉还是比较好用的

参与讨论
昵称:
讨论内容:
 
 
相关帖子
c51高手,请来看看!!
为什么程序跳出中断后总自动复位???
请教,关于T0计数器的问题?
求Lab Tool 48 驱动!
c51编译后调用指令变为跳转指令了.
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号