#include "LCD1602.h" /*************************************************** * 大量宏定义,便于代码移植和阅读 ***************************************************/ #define LCD1602_LINE1 0 #define LCD1602_LINE2 1 #define LCD1602_LINE1_HEAD 0x80 #define LCD1602_LINE2_HEAD 0xC0 #define LCD1602_DATA_MODE 0x38 #define LCD1602_OPEN_SCREEN 0x0C #define LCD1602_DISP_ADDRESS 0x80 #define LCD1602_RS_PIN 0 #define LCD1602_RW_PIN 1 #define LCD1602_EN_PIN 2 #define LCD1602_RS(x) {if((x))P0_DOUT|= 1UL<<LCD1602_RS_PIN;else P0_DOUT&=~(1UL<<LCD1602_RS_PIN);}//RS引脚控制 #define LCD1602_RW(x) {if((x))P0_DOUT|= 1UL<<LCD1602_RW_PIN;else P0_DOUT&=~(1UL<<LCD1602_RW_PIN);}//RW引脚控制 #define LCD1602_EN(x) {if((x))P0_DOUT|= 1UL<<LCD1602_EN_PIN;else P0_DOUT&=~(1UL<<LCD1602_EN_PIN);}//EN引脚控制 #define LCD1602_PORT(x) LS164Send((x)) //发送数据 /******************************************** *函数名称:LCD1602WriteByte *输 入:ucByte 要写入的字节 *输 出:无 *说 明:LCD1602 写字节 ********************************************/ VOID LCD1602WriteByte(UINT8 ucByte) { LCD1602_PORT(ucByte); LCD1602_RS(HIGH); LCD1602_RW(LOW); LCD1602_EN(LOW); Delayus(5000); LCD1602_EN(HIGH); } /******************************************** *函数名称:LCD1602WriteCommand *输 入:ucCmd 要写入的命令 *输 出:无 *说 明:LCD1602 写命令 ********************************************/ VOID LCD1602WriteCommand(UINT8 ucCmd) { LCD1602_PORT(ucCmd); LCD1602_RS(LOW); LCD1602_RW(LOW); LCD1602_EN(LOW); Delayus(5000); LCD1602_EN(HIGH); } /******************************************** *函数名称:LCD1602SetXY *输 入:x 横坐标 y 纵坐标 *输 出:无 *说 明:LCD1602 设置坐标 ********************************************/ VOID LCD1602SetXY(UINT8 x,UINT8 y) { UINT8 address; if(y == LCD1602_LINE1) { address=LCD1602_LINE1_HEAD+x; } else { address=LCD1602_LINE2_HEAD+x; } LCD1602WriteCommand(address); } /******************************************** *函数名称:LCD1602PrintfString *输 入:x 横坐标 y 纵坐标 s字符串 *输 出:无 *说 明:LCD1602 打印字符串 ********************************************/ VOID LCD1602PrintfString(UINT8 x, UINT8 y, UINT8 *s) { LCD1602SetXY(x,y); //设置显示坐标 while(s && *s) { LCD1602WriteByte(*s); //显示逐个字符 s++; } } /******************************************** *函数名称:LCD1602ClearScreen *输 入:无 *输 出:无 *说 明:LCD1602 清屏 ********************************************/ VOID LCD1602ClearScreen(VOID) { LCD1602WriteCommand(0x01); Delayus(5000); } /******************************************** *函数名称:LCD1602Init *输 入:无 *输 出:无 *说 明:LCD1602 初始化 ********************************************/ VOID LCD1602Init(VOID) { P0_PMD &= ~(3UL<<(LCD1602_RS_PIN<<1)); P0_PMD &= ~(3UL<<(LCD1602_RW_PIN <<1)); P0_PMD &= ~(3UL<<(LCD1602_EN_PIN <<1)); P0_PMD |= 1UL<<(LCD1602_RS_PIN<<1); P0_PMD |= 1UL<<(LCD1602_RW_PIN <<1); P0_PMD |= 1UL<<(LCD1602_EN_PIN <<1); LCD1602ClearScreen(); LCD1602WriteCommand(LCD1602_DATA_MODE); //显示模式设置,设置16x2显示,5x7点阵, //8位数据接口 LCD1602WriteCommand(LCD1602_OPEN_SCREEN); //开显示 LCD1602WriteCommand(LCD1602_DISP_ADDRESS);//起始显示地址 LCD1602ClearScreen(); } /**************************************** *函数名称:main *输 入:无 *输 出:无 *功 能:函数主体 ******************************************/ INT32 main(VOID) { // Un_Lock_Reg(); //ISP下载时保护FLASH存储器 PROTECT_REG ( PWRCON |= XTL12M_EN; //默认时钟源为外部晶振 while((CLKSTATUS & XTL12M_STB) == 0); //等待12MHz时钟稳定 CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //设置外部晶振为系统时钟 LS164Init(); //74LS164初始化 LCD1602Init(); //LCD1602初始化 ) LCD1602PrintfString(0,LCD1602_LINE1,"Hello World!"); //打印第一行 LCD1602PrintfString(0,LCD1602_LINE2,"I Love You!"); //打印第二行 while(1); }
举报
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
人才类勋章
发帖类勋章
等级类勋章
时间类勋章
40
370
4
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号