当前位置: 首页 > article >正文

【笔记------LCD1602 SCM1602H-P9-Ver1.2】------ 4位数据驱动

  角落里翻出来一块1602液晶屏,型号是SCM1602H-P9-Ver1.2,可能是普中开发板带的,不过是9针的:

引脚定义
Pin1Vss
Pin2Vdd
Pin3R/S
Pin4EN
Pin5D4
Pin6D5
Pin7D6
Pin8D7
Pin9BK

  点亮程序供参考。
  lcd1602.h :

#ifndef _lcd1602_h
#define _lcd1602_h#include "../inc/header.h"#define LCD_1602_4b 0
#define LCD_1602_8b 1
#define LCD_MODE LCD_1602_4b#define LCD_D4 P10
#define LCD_D5 P11
#define LCD_D6 P12
#define LCD_D7 P13
#define LCD_RS P14 //cmd/dat-1/0
#define LCD_EN P15void Lcd1602_Init(void);
void Lcd1602_WriteString(unsigned char x, unsigned char y, unsigned char len, unsigned char *str);void Lcd1602_Test(void);
#endif

  lcd1602.c :

#include "../inc/lcd1602.h"//如果没有使用读忙信号,必须通过延时保证写入完成,软件延时参数,测试使用stc15系列,35mhz,
//速度快的要适当调大延时,慢的可以把延时调小一点
#define DELAY_TIME_1602_WRITE 80/* --------------------------------------------------------------------------*/
/*** @Synopsis 软件延时 ** @Param t:延时参数*/
/* --------------------------------------------------------------------------*/
void Delay_1602(unsigned int t)
{while(t --);
}/* --------------------------------------------------------------------------*/
/*** @Synopsis  数据有效电平跳变*/
/* --------------------------------------------------------------------------*/
void Lcd1602_ENABLE(void)
{LCD_EN = 0;_nop_();_nop_();_nop_();
}/* --------------------------------------------------------------------------*/
/*** @Synopsis  数据无效电平跳变*/
/* --------------------------------------------------------------------------*/
void Lcd1602_DISENABLE(void)
{LCD_EN = 1;
}/* --------------------------------------------------------------------------*/
/*** @Synopsis  写一个字节数据** @Param dat*/
/* --------------------------------------------------------------------------*/
void Lcd1602_WriteByte_Dat(unsigned char dat)
{LCD_EN = 0;_nop_();LCD_RS = 1;Lcd1602_DISENABLE();_nop_();
#if LCD_MODE == LCD_1602_4bLCD_D7 = dat & 0x80;LCD_D6 = dat & 0x40;LCD_D5 = dat & 0x20;LCD_D4 = dat & 0x10;Lcd1602_ENABLE();Lcd1602_DISENABLE();LCD_D7 = dat & 0x08;LCD_D6 = dat & 0x04;LCD_D5 = dat & 0x02;LCD_D4 = dat & 0x01;Lcd1602_ENABLE();
#endif
//8bits数据总线
#if LCD_MODE == LCD_1602_8b
#endifDelay_1602(DELAY_TIME_1602_WRITE);
}/* --------------------------------------------------------------------------*/
/*** @Synopsis  写一个字节命令** @Param cmd*/
/* --------------------------------------------------------------------------*/
void Lcd1602_WriteByte_Cmd(unsigned char cmd)
{LCD_EN = 0;_nop_();LCD_RS = 0;Lcd1602_DISENABLE();_nop_();
#if LCD_MODE == LCD_1602_4bLCD_D7 = cmd & 0x80;LCD_D6 = cmd & 0x40;LCD_D5 = cmd & 0x20;LCD_D4 = cmd & 0x10;Lcd1602_ENABLE();Lcd1602_DISENABLE();LCD_D7 = cmd & 0x08;LCD_D6 = cmd & 0x04;LCD_D5 = cmd & 0x02;LCD_D4 = cmd & 0x01;Lcd1602_ENABLE();
#endif//8bits数据总线
#if LCD_MODE == LCD_1602_8b
#endifDelay_1602(DELAY_TIME_1602_WRITE);
}/* --------------------------------------------------------------------------*/
/*** @Synopsis  写字符串,只支持1602液晶自带的ascii字符** @Param x: 横坐标,0开始* @Param y: 纵坐标,0开始* @Param len: 数据长度* @Param str: 字符串指针*/
/* --------------------------------------------------------------------------*/
void Lcd1602_WriteString(unsigned char x, unsigned char y, unsigned char len, unsigned char *str)
{if(y == 0){Lcd1602_WriteByte_Cmd(0x80 + x);while(len --){Lcd1602_WriteByte_Dat(*(str++));}}else if(y == 1){Lcd1602_WriteByte_Cmd(0x80 + 0x40 + x);while(len --){Lcd1602_WriteByte_Dat(*(str++));}}
}/* --------------------------------------------------------------------------*/
/*** @Synopsis  1602液晶初始化*/
/* --------------------------------------------------------------------------*/
void Lcd1602_Init(void)
{P1M0 = 0x00;P1M1 = 0x00;LCD_RS = 0;LCD_EN = 0;LCD_D4 = 0;LCD_D5 = 0;LCD_D6 = 0;LCD_D7 = 0;Delay_1602(500);Lcd1602_WriteByte_Cmd(0x28); //设置4线驱动Delay_1602(500);Lcd1602_WriteByte_Cmd(0x0f); //开显示,配置光标Delay_1602(500);
}/* --------------------------------------------------------------------------*/
/*** @Synopsis  测试函数*/
/* --------------------------------------------------------------------------*/
void Lcd1602_Test(void)
{Lcd1602_WriteByte_Cmd(0x83);Lcd1602_WriteByte_Dat(0x30);Lcd1602_WriteByte_Dat(0x31);Lcd1602_WriteByte_Dat(0x32);Lcd1602_WriteByte_Dat(0x33);Lcd1602_WriteByte_Dat(0x34);Lcd1602_WriteByte_Dat(0x35);Lcd1602_WriteByte_Dat(0x36);Lcd1602_WriteByte_Dat(0x37);Lcd1602_WriteByte_Dat(0x38);Lcd1602_WriteByte_Dat(0x39);Lcd1602_WriteByte_Dat(0x30);Lcd1602_WriteByte_Cmd(0xc1);Lcd1602_WriteByte_Dat(0x31);Lcd1602_WriteByte_Dat(0x32);Lcd1602_WriteByte_Dat(0x33);Lcd1602_WriteByte_Dat(0x34);Lcd1602_WriteString(7, 1, 3, "ABC");
}

  main.c :
  头文件header.h只是把用到的头文件都包含了进去,比如stc15.h、intrins.h,不再列出

#include "../inc/header.h"void main(void)
{Lcd1602_Init();Lcd1602_Test();while (1) {}
}

注意:

  • 这款液晶没有读信号,只能写,要通过适当延时来保证写完成,否则会导致丢失和乱码
  • 液晶驱动可以参考HD4478U
  • EN下降沿数据写入,BK是液晶背光,接电源负极

测试例程可以运行:
测试照片

http://www.lryc.cn/news/2421132.html

相关文章:

  • 电脑出现无法访问您试图使用的功能所在的网络位置怎么办?(清除软件卸载残留)
  • JSP详解,看这一篇就够了(含示例)
  • DNS欺骗劫持与防御策略
  • 鸿蒙生死印作用,逆天邪神:鸿蒙生死印应该有个BUG能力,两位梵天老祖身上有提示...
  • 常见滤波算法(Python版本)
  • Vue3 -- 基于Websocket实现简易聊天室
  • 清除移动硬盘中jwgkvsq.vmx病毒
  • 什么是工业微型计算机,工业用微型计算机第一讲.ppt
  • C语言之网络编程(服务器和客户端)
  • HTML入门及其概念简析
  • SQL:select case 用法详解 带例子 图解说明 sqlserver2000
  • springboot的多模块开发
  • 开源网上商城程序(简介国内外开源网店系统)
  • 破解硬盘还原卡与还原精灵
  • 云南省增值税发票综合平台(修订版)----发票抵扣勾选教程---
  • 注册表无法修改解决
  • Android之MediaPlayer详解
  • Keil5-MDK 使用编译步骤及异常与修改(生成axf文件和bin文件)
  • 参观中关村软件园二期小记
  • 怎么完全卸载赛门铁克_赛门铁克(sep)卸载方法
  • Xcode5.1离线下载安装及使用iOS5模拟器进行开发调试的方法
  • Win2003安装简录
  • KindEditor编辑器 用法
  • 红雪iOS6.1.3不完美越狱教程
  • 魔域mysql下载_魔域3.2无敌版之富甲天下下载_魔域3.2无敌版下载_快吧单机游戏...
  • Linux小知识---关于socket的一些知识点
  • 网维服务器加硬盘,网维大师官网-帮助
  • 裸奔浏览器_谁动了我的浏览器主页?“技术霸凌”带来糟心事
  • WPA2破解教程(详细步骤)
  • 雷军,早已财富自由的人,依然在努力!