参照各位前辈的代码写了个1602的显示,接了个电位调对比度。 /*---------------------------------------------------------------------------------------------------------*/
//实现功能: LCD1602显示
//创建时间: 2012/09/24
//修改时间:
//创建人员: Mr.Moon
/*---------------------------------------------------------------------------------------------------------*/
#include <stdio.h>
#include "NUC1xx.h"
#include "Driver\DrvGPIO.h"
#include "Driver\DrvSYS.h"
/******宏定义LCD1602 RS RW EN 管脚************/
#define LCD_RS E_GPC,15 //LCD1602的RS
#define LCD_EN E_GPC,7 //LCD1602的EN
#define LCD_RW E_GPC,6 //LCD1602的WR
/******宏定义LCD1602 RS RW EN 高低电平************/
#define L_LCD_RS DrvGPIO_ClrBit(LCD_RS) //RS=0
#define H_LCD_RS DrvGPIO_SetBit(LCD_RS) //RS=1
#define L_LCD_EN DrvGPIO_ClrBit(LCD_EN) //EN=0
#define H_LCD_EN DrvGPIO_SetBit(LCD_EN) //EN=1
#define L_LCD_RW DrvGPIO_ClrBit(LCD_RW) //RW=0
#define H_LCD_RW DrvGPIO_SetBit(LCD_RW) //RW=1
int8_t table1[]={"bbs.21ic.com"};
int8_t table2[]={"Mr.Moon"};
/************************************************************************************
** Function name: Init_GPIO
** Descriptions: GPIO初始
** input parameters: none
** output parameters: none
** Returned value: none
*************************************************************************************/
void Init_GPIO(void)
{
/* D0~D7----PA0-PA7 */
DrvGPIO_Open( E_GPA, 2, E_IO_OUTPUT );
DrvGPIO_Open( E_GPA, 3, E_IO_OUTPUT );
DrvGPIO_Open( E_GPA, 4, E_IO_OUTPUT );
DrvGPIO_Open( E_GPA, 5,E_IO_OUTPUT);
DrvGPIO_Open( E_GPA, 6, E_IO_OUTPUT);
DrvGPIO_Open( E_GPA, 7, E_IO_OUTPUT );
DrvGPIO_Open( E_GPA, 8, E_IO_OUTPUT );
DrvGPIO_Open( E_GPA, 9, E_IO_OUTPUT );
DrvGPIO_Open( E_GPC, 15, E_IO_OUTPUT); //RS
DrvGPIO_Open( E_GPC, 6, E_IO_OUTPUT); //RW
DrvGPIO_Open( E_GPC, 7, E_IO_OUTPUT ); //EN
}
/************************************************************************************
** Function name: Init_System
** Descriptions: 系统设置
** input parameters: none
** output parameters: none
** Returned value: none
*************************************************************************************/
void Init_System(void)
{
UNLOCKREG();
DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1); //SYSCLK->WRCON.XTL12M_EN = 1;
DrvSYS_Delay(5000);
LOCKREG();
}
/************************************************************************************
** Function name: write_com
** Descriptions: LCD1602写指令
** input parameters: com
** output parameters: none
** Returned value: none
*************************************************************************************/
void write_com(uint8_t com)
{
L_LCD_RS;
DrvGPIO_SetPortBits(E_GPA,com<<2);
H_LCD_EN;
DrvSYS_Delay(2000); //延时200ns建立数据,根据LCD1602手册来确定延时时间
L_LCD_EN;
}
/************************************************************************************
** Function name: write_data
** Descriptions: LCD1602写数据
** input parameters: dat
** output parameters: none
** Returned value: none
*************************************************************************************/
void write_data(uint8_t dat)
{
H_LCD_RS;
DrvGPIO_SetPortBits(E_GPA,dat<<2);
H_LCD_EN;
DrvSYS_Delay(2000); //延时200ns建立数据,根据LCD1602手册来确定延时时间
L_LCD_EN;
}
/************************************************************************************
** Function name: write_bit_data
** Descriptions: LCD1602写字符串
** input parameters: table字符串指针 y=1第一行 y=2第二行 x第几位
** output parameters: none
** Returned value: none
*************************************************************************************/
void write_bit_data(int8_t *table,uint8_t y,uint8_t x)
{
uint8_t b=0;
if(y==1){write_com(0x80+x);} //第一行
if(y==2){write_com(0x80+0x40+x);}//第二行
while(table!= '\0') //判断字符串是不是最后一位
{
write_data(table); //显示字符
b++;
}
}
/************************************************************************************
** Function name: Init_LCD
** Descriptions: LCD1602初始
** input parameters: none
** output parameters: none
** Returned value: none
*************************************************************************************/
void Init_LCD(void)
{
L_LCD_RW;
write_com(0x01); // 只写数据 所以RW拉低
write_com(0x38);
write_com(0x38); //一定要写两次0x38;否则只显示第一行
write_com(0x0f); //开显示,显示光标,光标闪烁
write_com(0x06);//当写一个字符后地址指针+1;且光标加1,当写一个字符整屏不移动
}
/************************************************************************************
** Function name: int main
** Descriptions: 主函数
** input parameters: none
** output parameters: none
** Returned value: none
*************************************************************************************/
int main (void)
{
Init_System();
Init_GPIO();
Init_LCD();
DrvGPIO_ClrBit(E_GPE,5); //接LCD1602 VSSPin,需要强制输出0,做GND用
DrvGPIO_Open(E_GPC,14,E_IO_QUASI); //对比度调节,我焊的个电位来调对比度,
write_bit_data(table1,1,2);
write_bit_data(table2,2,4);
while(1);
}
|