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

单片机练习 - 带中文字库12864LCD显示程序

DataSheet: JM12864M.rar

I/O接口与LCD引脚的连接详见源代码注释.

12864源代码
//带中文字库的12864LCD显示程序
#include <reg52.H>
#include 
<intrins.H>

#define uchar unsigned char
#define uint unsigned int

sbit dula 
= P2^6;
sbit wela 
= P2^7;
//SCM12864-05端口定义
#define LCD_DATA P0 //数据口
sbit RS 
= P3^5//并行的指令/数据选择信号, H数据, L命令
sbit RW = P3^6//并行读写选择信号, H读, L写
sbit E = P3^4//并行使能端, H有效, L无效
sbit PSB = P3^7//并/串接口选择, H并,L串
sbit RET = P3^3//复位, L有效

uchar code datas1[] 
= {"广东工业大学"};
uchar code datas2[] 
= {"自动化学院2004级"};
uchar code datas3[] 
= {"网络工程 (4)班"};
uchar code datas4[] 
= {"fengmk2@gmail.com"};

//延时约2us
void delayUs()
{
    _nop_();_nop_();
}

//延时 a * 1ms
void delayMs(uint a)
{
    
uint i, j;
    
for(i = a; i > 0; i--)
        
for(j = 100; j > 0; j--);
}


//检测LCD是否处于忙状态, 若忙返回1, 空闲返回0
bit checkBusy()
{
    bit busy;
    RS 
= 0;
    RW 
= 1;
    E 
= 1;
    delayUs();
    busy 
= (bit)(LCD_DATA&0x80);
    E 
= 0;
    
return busy;
}


//等待LCD到空闲
void wait()
{
    
while(checkBusy());
}


//写命令
void writeCmd(uchar cmd)
{
    wait();
    RS 
= 0;
    RW 
= 0;
    E 
= 0;
    delayUs();
    LCD_DATA 
= cmd;
    delayUs();
    E 
= 1;
    delayUs();
    E 
= 0;
}


//写数据
void writeData(uchar dat)
{
    wait();
    RS 
= 1;
    RW 
= 0;
    E 
= 0;
    delayUs();
    LCD_DATA 
= dat;
    delayUs();
    E 
= 1;
    delayUs();
    E 
= 0;
}


//初始化LCD
void init()
{
    PSB 
= 1//并口方式
    writeCmd(0x30); //基本指令, 扩充指令为34H
    delayMs(10);
    writeCmd(
0x0c); //显示开, 关光标
    delayMs(10);
    writeCmd(
0x01); //清屏
    delayMs(10);
}


void setPosition(uchar x, uchar y)
{
    uchar p;
    
switch(x%4)
    
{
        
case 0: p = 0x80break//第一行开始地址
        case 1: p = 0x90break//第二行
        case 2: p = 0x88break//第三行
        case 3: p = 0x98break//第四行
    }

    p 
+= y;
    writeCmd(p);
}


void writeString(uchar * str)
{
    uchar i 
= 0;
    
while(str[i] != '\0')
    
{
        writeData(str[i
++]);
    }

}


/**//***************************LCD12864***************************************/

void main()
{
    
//先关闭数码管, 使两个锁存器锁存, 因开了数码管, USB电压驱动不够, 将无法使LCD正常工作
    dula = wela = 0;
    init();
    setPosition(
00);
    writeString(datas1);
    setPosition(
10);
    writeString(datas2);
    setPosition(
20);
    writeString(datas3);
    setPosition(
30);
    writeString(datas4);
    
while(1);
}


效果图:

相关文章:

  • 一种支持html中table排序的跨平台实现
  • Ajax 缓存
  • 单一语言
  • SiteMesh参考
  • 准备买个智能手机
  • 预加载图片问题 in ASP .NET
  • 软件开发C#中ref和out的使用小结
  • 封装的变化之不断变化的需求
  • ***利用Ms05002溢出找“肉鸡
  • 如何利用局域网来实现VLAN的实例
  • 关于windows 2003 权限划分
  • asp的站内搜索功能
  • html地址栏传值问题
  • 经典东北话集锦2
  • 汪中求讲座免费在线学习 免费下载
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • 2018一半小结一波
  • Elasticsearch 参考指南(升级前重新索引)
  • jquery cookie
  • js继承的实现方法
  • JS数组方法汇总
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • 安卓应用性能调试和优化经验分享
  • 动态魔术使用DBMS_SQL
  • 前端面试之闭包
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 思考 CSS 架构
  • 网络应用优化——时延与带宽
  • 源码安装memcached和php memcache扩展
  • 阿里云ACE认证之理解CDN技术
  • 通过调用文摘列表API获取文摘
  • ​马来语翻译中文去哪比较好?
  • "无招胜有招"nbsp;史上最全的互…
  • #预处理和函数的对比以及条件编译
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (python)数据结构---字典
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • .Mobi域名介绍
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET 回调、接口回调、 委托
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • @EnableConfigurationProperties注解使用
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [Android]使用Android打包Unity工程
  • [BetterExplained]书写是为了更好的思考(转载)
  • [bzoj 3534][Sdoi2014] 重建
  • [C/C++]数据结构 深入挖掘环形链表问题