|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
求助:我的1602LCD显示怎么是16个黑的方块 |
作者:yifenqian 栏目:单片机 |
程序是下载别人的:用的是总线方式: 那位大侠还有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 于 2005/7/15 8:07:00 发布:
楼主有没有1602的资料给一份 尤其是关于字符对应的字段的说明那部分? |
3楼: | >>参与讨论 |
作者: yxhyxh 于 2005/7/15 9:25:00 发布:
仔细看看你的初始化程序是否正确。 |
4楼: | >>参与讨论 |
作者: yifenqian 于 2005/7/15 19:15:00 发布:
你的邮箱那? |
5楼: | >>参与讨论 |
作者: bcaiyo 于 2005/7/15 19:48:00 发布:
我刚在用一个三星的S6A0069的 我刚在用一个三星的S6A0069的,不过我只用了4位数据线。端口少啊。你最好看一下初始化的程序,有的指令处理时间长一点,看一下忙标志位呀,我感觉还是比较好用的 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |