http://item.taobao.com/item.htm?spm=a1z09.5.0.40.m0zgCu&
id=16289846567
这里有大量与 12864液晶画点画线的相关资料,有用没
用都可以进来看看,只需要花费 0.1 元,就可以省去大量在
网上四处收集资料的时间。
12864.h//头文件
#ifndef __12864_H__
#define __12864_H__
#define uint unsigned int
#define uchar unsigned char
void delayus(uchar i);
void delayms(uint z);
void write_com(uchar com);
void write_data(uchar dat);
uchar read_data();
void LCD_init();
void Clear_GDRAM();
void Clear_Screen();
#endif
http://item.taobao.com/item.htm?spm=a1z09.5.0.40.m0zgCu&
id=16289846567
12864.c//c文件
#include
#include "12864.h"
#define uint unsigned int
#define uchar unsigned char
#define LCD_BUS P0 //LCD并口连接在 P0口
sbit RS=P3^5;
sbit RW=P3^6;
sbit E=P3^4;
sbit PSB=P3^7;
/******************************************/
//函数名称:delayus(uchar i)
//函数功能:微秒级延时
//返回值:无
/******************************************/
void delayus(uchar i)
{
uchar j;
for(j=i;j>0;j--);
}
http://item.taobao.com/item.htm?spm=a1z09.5.0.40.m0zgCu&
id=16289846567
/******************************************/
//函数名称:delayms(uchar i)
//函数功能:毫秒级延时
//返回值:无
/******************************************/
void delayms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/******************************************/
//函数名称:void check_busy()
//函数功能:检查忙标志 BF
//返回值:无
/******************************************/
void check_busy()
{
RS=0;
RW=1;
E=1;
LCD_BUS=0xff;
while((LCD_BUS&0x80)==0x80);
E=0;
}
/******************************************/
//函数名称:write_com(uchar com)
//函数功能:写指令到 LCD
//返回值:无
/******************************************/
void write_com(uchar com)
{
uchar i;
check_busy();
RS=0;
RW=0;
E=1;
LCD_BUS=com;
i++;
E=0;
i++;
}
http://item.taobao.com/item.htm?spm=a1z09.5.0.40.m0zgCu&
id=16289846567
/******************************************/
//函数名称:write_data(uchar dat)
//函数功能:写数据到 LCD
//返回值:无
/******************************************/
void write_data(uchar dat)
{
uchar i;
check_busy();
RS=1;
RW=0;
E=1;
LCD_BUS=dat;
i++;
E=0;
i++;
}
/******************************************/
//函数名称:read_data()
//函数功能:写数据到 LCD
//返回值:dat
/******************************************/
uchar read_data()
{
uchar i;
uchar temp;
check_busy();
//LCD_BUS=0xff;
RS=1;
RW=1;
E=1;
temp=LCD_BUS;
i++;
E=0;
return temp;
}
/******************************************/
//函数名称:LCD_init()
//函数功能:12864液晶的初始化
//返回值:无
/******************************************/
void LCD_init()
{
write_com(0x30);
delayus(15);
write_com(0x30);
delayus(8);
write_com(0x0c);
delayus(25);
write_com(0x01);
delayms(15);
write_com(0x06);
}
/*****************************************/
//函数名称:void Clear_GDRAM()
//函数功能:清除整个 GDRAM空间
//返回值:无
/*****************************************/
void Clear_GDRAM()
{
uchar i,j;
for(i=0;i<64;i++)
{
for(j=0;j<16;j++)
{
write_com(0x34);//使用扩充指令
write_com(i+0x80);
write_com(j+0x80);
write_com(0x30);//回到基本指令
write_data(0x00);
write_data(0x00);
}
}
}
http://item.taobao.com/item.htm?spm=a1z09.5.0.40.m0zgCu&
id=16289846567
/*****************************************/
//函数名称:void Clear_Screen()
//函数功能:清除整个液晶屏幕
//返回值:无
/*****************************************/
void Clear_Screen()
{
write_com(0x01);
delayms(10);
}
http://item.taobao.com/item.htm?spm=a1z09.5.0.40.m0zgCu&
id=16289846567
main.c//主函数
#include
#include
#include "12864.h"
#define uint unsigned int
#define uchar unsigned char
void draw_point(uchar x,uchar y,uchar colour);
void main()
{
uchar x,y;
LCD_init();
Clear_GDRAM();
Clear_Screen();
for(x=0;x<128;x++)
{
y=32-31*cos(x*3.14/28);
//余弦波显示
draw_point(x,y,1);
}
while(1);
}
/**************************************************/
//函数名称:drawpoint(uchar x,uchar y,uchar colour)
//函数功能:在任意位置画点
//返回值:无
//x表示横坐标,y表示纵坐标
/**************************************************/
void draw_point(uchar x,uchar y,uchar colour)
{
uchar row,tier; //行 row,列 tier
uchar temp_h,temp_l;//定义两个变量用来存放都回来的数据
uchar tier_bit;//取列的低 4位
write_com(0x34);//使用扩充指令
write_com(0x34);//关绘图显示
tier=x>>4;//取列的高 4位,判断在哪一大列,值为 0~7
tier_bit=x&0x0f;//取列低 4位,判断在高 8位还是在低 8位
if(y<32)//在上半屏
{
row=y;
}
else//在下半屏
{
row=y-32;
tier+=8;
}
write_com(row+0x80);//先写行地址即垂直地址纵坐标
write_com(tier+0x80);//写列地址即横坐标
read_data();//空读一次 ,读点的状态
temp_h=read_data();//高 8位
temp_l=read_data();//低 8位
write_com(row+0x80);//先写行地址即垂直地址纵坐标,修改点的状态
write_com(tier+0x80);//写列地址即横坐标
if(tier_bit<8)//高位
{
switch(colour)
{
case 0:temp_h&=(~(0x01<<(7-tier_bit))); break;//变白,复位
case 1:temp_h|=(0x01<<(7-tier_bit)); break; //变黑,置位
case 2:temp_h^=(0x01<<(7-tier_bit));break;//取反
default:break;
}
write_data(temp_h);//写高 8位,0~7在后
write_data(temp_l);//写低 8位,8~15在前
}
else//低位
{
switch(colour)
{
case 0:temp_l&=(~(0x01<<(15-tier_bit)));break;//变白
case 1:temp_l|=(0x01<<(15-tier_bit));break;//变黑
case 2:temp_l^=(0x01<<(15-tier_bit));break;//取反
default:break;
}
write_data(temp_h);//写数据,高 8位 0~7
write_data(temp_l);//写数据,低 8位 8~15
}
write_com(0x36);//开绘图显示
write_com(0x30);//回到基本指令
}
实验现象:
http://item.taobao.com/item.htm?spm=a1z09.5.0.40.m0zgCu&
id=16289846567