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