本人刚学ARM,水平很菜,最近一直在调2132控制LCD1602显示。但是1602一直没字符显示。通上电,下载程序进去之后,一直就是显示一排黑点。着急!希望哪位大哥能指点!程序如下:(这个程序能在51板子上显示,我现在是把它移植到LPC2132上):<br />#include"LPC21XX.H"<br />#include"config.h"<br />#include"GPIOCTRL.H"<br />#include"LCD1602.H"<br />int main(void)<br />{<br /> INT8U Text1[]="Nice to See You!";<br /> INT8U Text2[]="QQ:34088177";<br /> GPIOx_Set(P1_25,GPIO_Mode_OUTPUT); //依次为DB0到DB7<br /> GPIOx_Set(P1_16,GPIO_Mode_OUTPUT); <br /> GPIOx_Set(P0_3,GPIO_Mode_OUTPUT); <br /> GPIOx_Set(P0_31,GPIO_Mode_OUTPUT); <br /> GPIOx_Set(P0_19,GPIO_Mode_OUTPUT); <br /> GPIOx_Set(P0_0,GPIO_Mode_OUTPUT); <br /> GPIOx_Set(P0_2,GPIO_Mode_OUTPUT); <br /> GPIOx_Set(P0_1,GPIO_Mode_OUTPUT); <br /> GPIOx_Set(LCD_RS,GPIO_Mode_OUTPUT); <br /> GPIOx_Set(LCD_RW,GPIO_Mode_OUTPUT); <br /> GPIOx_Set(LCD_EN,GPIO_Mode_OUTPUT); <br /> LCD_Init();<br /> while(1)<br /> {<br /> LCD_SetPointion(0x00); <br /> LCD_PrintString(Text1);<br /> LCD_SetPointion(0x40);<br /> LCD_PrintString(Text2);<br /> }<br />}<br /><br />LCD1602.c文件程序如下:<br />#include"LPC21XX.H"<br />#include"config.h"<br />#include"LCD1602.h"<br />#include"GPIOCTRL.h"<br /><br />static const INT32U LCD_Data_IO[8]={P1_25,P1_16,P0_3,P0_31,P0_19,P0_0,P0_2,P0_1};<br /><br />void Delayms(INT32U count) //Delayms(400)约6ms,Delayms(1000)约为15ms<br />{<br /> INT32U i,j;<br /> for(i=0;i<count;i++)<br /> for(j=0;j<200;j++);<br />} <br /><br />void Delayus(INT8U i)<br />{<br /> while(i--); <br />}<br /><br />void LCD_IO_Data(INT8U data)<br />{<br /> INT8U i;<br /> for(i=0;i<8;i++)<br /> {<br /> if((data>>i)&0x01)<br /> {<br /> GPIOx_PinSetHigh(LCD_Data_IO);<br /> } <br /> else<br /> {<br /> GPIOx_PinSetLow(LCD_Data_IO);<br /> }<br /> } <br />}<br /><br />void Delay_Check(void)<br />{<br /> do<br /> {<br /> GPIOx_Set(LCD_BUSY,GPIO_Mode_INPUT); /***把DB7设置为输入模式****/<br /> GPIOx_PinSetLow(LCD_RS);<br /> GPIOx_PinSetHigh(LCD_RW); <br /> GPIOx_PinSetLow(LCD_EN);<br /> Delayus(10);<br /> GPIOx_PinSetHigh(LCD_EN);<br /> <br /> }<br /> while(IO0PIN&LCD_BUSY); <br /> GPIOx_Set(LCD_BUSY,GPIO_Mode_OUTPUT); <br />}<br /><br /><br />void LCD_WriteCommand(INT8U cmd)<br />{<br /> GPIOx_PinSetLow(LCD_RS);<br /> GPIOx_PinSetLow(LCD_RW);<br /> GPIOx_PinSetLow(LCD_EN);<br /> Delay_Check();<br /> LCD_IO_Data(cmd);<br /> GPIOx_PinSetHigh(LCD_EN);<br />}<br /><br />void LCD_Write_Data(INT8U data)<br />{ <br /> GPIOx_PinSetHigh(LCD_RS);<br /> GPIOx_PinSetLow(LCD_RW); <br /> GPIOx_PinSetLow(LCD_EN);<br /> Delay_Check();<br /> LCD_IO_Data(data);<br /> GPIOx_PinSetHigh(LCD_EN);<br />}<br /><br />void LCD_Init(void)<br />{<br /> Delayms(100);<br /> LCD_WriteCommand(0x38); //设置显示模式:8位2行5x7点阵<br /> LCD_WriteCommand(0x08); //****关闭显示********/<br /> LCD_WriteCommand(0x01); //清屏并光标复位<br /> LCD_WriteCommand(0x06); //文字不动,光标自动右移 <br /> LCD_WriteCommand(0x0f); //显示器开、光标关、光标禁止闪烁<br /><br />}<br /><br />void LCD_SetPointion(INT8U x)<br />{<br /> LCD_WriteCommand(x|0x80);<br />}<br /><br />void LCD_PrintChar(INT8U lcd_data) //输出一个字符到LCD<br />{<br /> LCD_Write_Data(lcd_data);<br />}<br /><br />void LCD_PrintString(INT8U *lcd_string) //输出一个字符串到LCD<br />{<br /> INT8U i=0;<br /> while(lcd_string!='\0')<br /> {<br /> LCD_Write_Data(lcd_string);<br /> i++;<br /> } <br /><br />} <br />其中类似这些函数是借鉴别人的,一直都是能用,没问题<br />GPIOx_Set(LCD_RS,GPIO_Mode_OUTPUT); <br />GPIOx_PinSetHigh(LCD_Data_IO); GPIOx_PinSetLow(LCD_Data_IO);<br />其中LCD1602的DB0到DB7和2132的IO脚不是按顺序来连着的, 所以我用了一个数组把这些IO脚放在一起,在用移位来进行写数据和命令。希望哪位大哥帮我看看,小弟感激不尽! <br /><br /> |
|