程序说明CA12864K(ST7920)内核的点阵型LCD12864子程序
开始日期:2010-08-16
完成日期:2010-08-16
修改日期:
作者:蔡亚辉
引脚图
|-----------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|GND VCC V0 RS(CS) R/W(SID) E(CLK) DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 PSB NC RESET VOUT BLA(5V) BLK(0V) |
|-----------------------------------------------------------------------------------------------------|
PSB H-并行,L-串行
注:(1)单片机:AT89S52晶振Fosc:11.0592MHz编程软件:Keil uVision2;
(2)显示芯片:CA12864K 控制器:ST7920
(3)LCM的接口方式:并行方式,PSB接高;
(4)液晶复位端 悬空 上电清屏时要延时
(5)每次清屏时要延时 否则会在第一位出现乱码
(6)每次读/写LCD操作之前,应首先检测忙标志BF,确认BF=0后,访问过程才能进行;
(7)绘图显示的步骤
1 关闭绘图显示功能
2 先将垂直的坐标(Y)写入绘图RAM地址
3 再将水平的位元组坐标(X)写入绘图RAM地址
4 将D15-D8写入RAM中
5 将D7-D0写入到RAM中
6 打开绘图显示功能
(8)对于屏幕上面任意一个点,如果我们想要点亮它,必须先读出此点的状态,然后再修改该点,最后送出去,即 读----修改----写
******************************************************************/
//-----------------------------------------------------------------
// 头文件包含
//-----------------------------------------------------------------
#include<at89x52.h>
#include<lcd12864.h>
//-----------------------------------------------------------------
// 数据类型宏定义
//-----------------------------------------------------------------
#define uchar unsigned char
#define uint unsigned int
//-----------------------------------------------------------------
// 片内常量(内RAM)
//-----------------------------------------------------------------
//为加速逻辑运算而设置的掩码表,这是以牺牲空间而换取时间的办法
//code uint MaskTab[]={0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,
//0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000};
//-----------------------------------------------------------------
// 初始化程序区
//-----------------------------------------------------------------
//-----------------------------------------------------------------
// void LCD12864_Init(void)
//-----------------------------------------------------------------
//
// 函数功能: LCD12864初始化
// 入口参数: 无
// 返回参数: 无
// 全局变量: 无
// 调用模块: void LCD12864_WriteCom(uchar cmd);Delay_100us(uint);
// 注意事项: 在向液晶写完命令后,必须适当延时;
//-----------------------------------------------------------------
void LCD12864_Init(void)
{
Delay_100us(1500); //上电复位
LCD12864_WriteCom(FUN_MODE); //选择基本指令集
Delay_100us(100); //延时10ms(7.5ms以上)
LCD12864_WriteCom(FUN_MODE); //选择8bit数据流
Delay_100us(100); //延时10ms(7.5ms以上)
LCD12864_WriteCom(CLEAR_SCREEN); //清屏指令:清屏且AC值为00H
Delay_100us(100); //延时10ms(7.5ms以上)
LCD12864_WriteCom(DISPLAY_ON); //显示开
Delay_100us(2); //延时2us
LCD12864_WriteCom(CURSE_ADD); //设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)
Delay_100us(2); //延时2us
}
//-----------------------------------------------------------------
// 功能程序区
//-----------------------------------------------------------------
//-----------------------------------------------------------------
// void LCD12864_Busy(void)
//-----------------------------------------------------------------
//
// 函数功能: LCD12864忙检测
// 入口参数: 无
// 返回参数: 无
// 全局变量: 无
// 调用模块: 无
// 注意事项:
//-----------------------------------------------------------------
void LCD12864_Busy(void)
{
LCD12864_DIN=0xff; //读单片机端口先写1
LCD12864_RS=0; //选中命令寄存器
LCD12864_RW=1; //E为H时,数据读到DB7-DB0(RW=H)
LCD12864_E=1; //高电平使能
while((LCD12864_DIN&0x80)==0x80);
LCD12864_E=0; //禁止
}
//-------------------------------------------------------------