单片机练习 - 带中文字库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);
}


效果图:
posted @ 2007-03-29 23:17 MK2 阅读(1893) 评论(9)  编辑 收藏 所属分类: S 单片机/SCM/MCU/PLC

  回复  引用    
#1楼 2007-08-16 09:27 | 路人 [未注册用户]
datasheet怎么下载不了啊
  回复  引用    
#2楼 2007-08-30 17:44 | godhand [未注册用户]
请问一下这个lcd怎么和单片机连接~? 具体点
  回复  引用    
#3楼 2007-09-04 20:00 | 艾 [未注册用户]
哪位大哥能提供JM12864M的接线图啊!

谢谢!
  回复  引用    
#4楼 2008-01-10 22:53 | chaibou [未注册用户]
designing a system using AT89S52 microcontroller
  回复  引用    
#5楼 2008-03-27 11:23 | yaoxing [未注册用户]
交个朋友吧,我也研究单片机呢~而且我们用的开发板是一样的,我现在开始做LINUX下的设备驱动了,相互交流~QQ252501870
  回复  引用    
#6楼 2008-04-21 02:04 | Kadri Chaibou [未注册用户]
Hi! I'm using JM12864LCD; but I'm some problems to program it in serial mode. Could anybody help me to do so. I would be very grateful if you can find me a way.
  回复  引用    
#7楼 2008-04-21 02:06 | Kadri Chaibou [未注册用户]
Hi! I'm using JM12864LCD; but I'm having some problems to program it in serial mode. Could anybody help me to do so? I would be very grateful if you can find me a way.

  回复  引用    
#8楼 2008-08-14 19:19 | 袁蛤 [未注册用户]
--引用--------------------------------------------------
godhand: 请问一下这个lcd怎么和单片机连接~? 具体点
--------------------------------------------------------

  回复  引用    
#9楼 2008-08-15 15:34 | 风超 [未注册用户]
请问你能否做一个可以显示图片的

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  博客园首页

  新闻频道

  社区

  小组

  博问

  网摘

  闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-01-10 23:41 编辑过
成果网帮您增加网站收入


相关链接: