发表于
2008-5-1 9:27:17
今天五一节,大家是不是出去旅游去了,我今天没有事情,也没有出去游玩,传些原创资料给大家参考!
记得我刚开始用含字库12864液晶时,找一找现成的C程序吧,可惜没有找到,后来干脆自己写一个吧。现在公开给大家参考,可能不是最好的,但我用着很好用!
/*
***************************************************************************
* (C) Copyright 2007,单片机初学者园地
* All Rights reserved.
*项目名称:
*本文件名称:LCD12864.c
* 完成作者 : 单片机初学者 QQ:50501160 ahai0306@sina.com
* 当前版本 : V1.0
* 完成日期 : 2006年9月9日
* 描 述 :
* 此程序实现,完成液晶ST7920的驱动程序
*
* 我的博客:http://blog.ednchina.com/ahai0306/
* 开发板介绍:http://blog.ednchina.com/ahai0306/84416/message.aspx
* 淘宝网店铺地址:http://shop35284066.taobao.com/
* 我的论坛:http://dianzi.5d6d.com/?fromuser=mcu_51
****************************************************************************
*/
#include "Lcd12864.h"
#include <INTRINS.H> //调用头文件
/******本段为硬件I/O口定义********/
sbit EN="P3"^4;
sbit RW="P3"^3;
sbit RS="P3"^2;
sbit Lcd_RST=P3^1;
#define NOP _nop_(); _nop_()
//延时函数
void delay(uint16 data i)
{
while(i--);
}
//检测液晶忙状态函数
uint8 CheckBusy(void)
{
uint8 a;
RS=0;
RW=1;
NOP;
EN=1;
NOP;
P2=0xff;
a=P2;
EN=0;
if(a&0x80)
return OK;
else
return NOK;
}
//向液晶发送命令
void SendLcdCommand (uint8 command)
{
NOP;NOP;
// delay(500);
while(CheckBusy());
RS=0;
RW=0;
P2=command;
EN=1;
NOP;NOP;
EN=0;
}
//向液晶发送数据
void SendLcdData (uint8 dat)
{
NOP;NOP;
while(CheckBusy());
// delay(500);
RS=1;
RW=0;
P2=dat;
EN=1;
NOP;NOP;
EN=0;
}
//液晶初始化
void LCD_init(void)
{
Lcd_RST = 0;
delay(5000);
Lcd_RST = 1;
delay(500);
SendLcdCommand(0x34); //扩充指令操作
SendLcdCommand(0x30); //基本指令操作
SendLcdCommand(0x01); //清除显示
SendLcdCommand(0x06); //指定在资料写入或读取时,光标的移动方向
SendLcdCommand(0x0c); //开显示,关光标,不闪烁
}
//清屏
void Clear_display(void)
{
SendLcdCommand(0x01); //清除显示
}
//从第几行,第几列显示字符串(汉字),x代表行,y代表列
void Disp_lcd( uint8 x, uint8 y, uint8 *chinese )
{
uint8 xtemp;;
switch(x)
{
case 0: xtemp="0x80"+y; break;
case 1: xtemp="0x90"+y; break;
case 2: xtemp="0x88"+y; break;
case 3: xtemp="0x98"+y; break;
default:break;
}
// xtemp== x%2*0x10 + x/2*0x08 + y + 0x80; 地址公式
SendLcdCommand(xtemp);
do
{
SendLcdData(*chinese);
chinese++;
}while(*chinese!=0);
}
