当前位置:
文档之家› 12864各种画图程序(带字库)
12864各种画图程序(带字库)
//***************有反白显示功能的打点函数**********************************************************
//参数:color=1,该点填充1;color=0,该点填充白色0;
//*************************************************************************************************
default : break;
}
i = y+i;//确定列号
write_com(i);
}
//********************************************************
//显示字符函数
//********************************************************
#define EXTEND_SET 0x34
#define DRAW_ON0x36
#define DRAW_OFF 0x34
//*************端口定义
sbit LCD_RS = P0^0;
sbit LCD_RW = P0^1;
sbit LCD_EN = P0^2;
//************变量定义
//3、用取模软件取的图形或汉字必须是逐行取的,因为本函数是在液晶上逐行打点的
/*********************************************************************************************************************************************************************/
uchar read_dat(void)
{
uchar temp;
P2 = 0XFF;//释放数据线
LCD_RS = 1;//数据
LCD_RW = 1;//读模式
LCD_EN = 1; //E为高电平进行读数据或指令
delay(1);
temp = P2;
LCD_EN = 0;
return temp;
}
//uchar dis1[10];
//****************短延时
void delay(uint k)
{
uint i;
uchar j;
for(i = 0; i < k ;i ++)
for(j = 0; j < 10 ;j ++);
}
//***********ms级延时函数
/*void delay_1ms(uint x)
write_dat(GDRAM_lbit);//显示GDRAM区低8位数据
}
else
{
write_dat(GDRAM_hbit);
if(color==1)
write_dat(GDRAM_lbit|(0x01<<(15-x_byte)));//置位GDRAM区高8位数据中相应的点
else
write_dat(GDRAM_lbit&(~(0x01<<(15-x_byte))));//清除GDRAM区高8位数据中相应的点
GDRAM_hbit= read_dat();//读取当前显示高8位数据
GDRAM_lbit= read_dat();//读取当前显示低8位数据
delay(1);
write_com(0x80+y_byte);//设定行地址(y坐标)
write_com(0x80+x_Dyte+8*y_Dyte);//设定列地址(x坐标),并通过8*y_Dyte选定上下屏
delay(1);
if(x_byte<8)//判断其在高8位,还是在低8位
{
if(color==1)
{
write_dat(GDRAM_hbit|(0x01<<(7-x_byte)));//置位GDRAM区高8位数据中相应的点
}
else
write_dat(GDRAM_hbit&(~(0x01<<(7-x_byte))));//清除GDRAM区高8位数据中相应的点
delay(1);
if(i == 0) //写x坐标
{
write_com(0x80);
delay(1);
}
else //写下半屏
{
write_com(0x88);
delay(1);
}
for(k = 0; k < 16; k ++)//写一整行数据
{
write_dat(0x00);//写高字节
write_dat(0x00);//写低字节
//********************************************************
//设置光标(地址)函数
//参数说明:x---为行号,y为列号
//********************************************************
void set_cursor(unsigned char x, unsigned char y)
delay(5);
LCD_EN = 0;
}
//********12864写数据函数
void write_dat(uchar dat)
{
LCD_RS = 1;
LCD_RW = 0;
P2 = dat;
delay(5);
LCD_EN = 1;
delay(5);
LCD_EN = 0;
}
//****************从LCD中读数据
uchar i , j , k;
write_com(EXTEND_SET);//扩展指令集,8位数据传输
write_com(DRAW_OFF);//绘图显示关闭
for(i = 0; i < 2; i ++)//分上下两屏写
{
for(j = 0; j < 32; j ++)
{
write_com(0x80 + j);//写y坐标
y_byte=y&0x1f;//计算在0~31当中的哪一行
write_com(0x80+y_byte);//设定行地址(y坐标),即是垂直地址
write_com(0x80+x_Dyte+8*y_Dyte);//设定列地址(x坐标),并通过8*y_Dyte选定上下屏,即是水平地址
read_dat();//预读取数据
void GUI_Point(unsigned char x,unsigned char y,unsigned char color)
{
unsigned char x_Dyte,x_byte;//定义列地址的字节位,及在字节中的哪1位
unsigned char y_Dyte,y_byte;//定义为上下两个屏(取值为0,1),行地址(取值为0~31)
{
uint i,j;
for(j = 0;j < x; j++)
for(i = 0;i < 110; i++);
} */
//***********12864写指令函数
void write_com(uchar cmd)
{
LCD_RS = 0;
LCD_RW = 0;
P2 = cmd;
delay(5);
LCD_EN = 1;
y_ping = y / 32;//确定在上半屏还是下半屏,0代表上半屏,1代表下半屏
y_bit = y % 32;//& 0x1f;//确定在第几行
write_com(0X80 + y_bit);//先写垂直地址(最高位必须)
write_com(0x80 + x_byte + 8 * y_ping);//水平坐标,下半屏坐标起始地址为0x88,(+8*y_ping)就是用来确定上半屏还是下半屏
#include<reg51.h>
#include<intrins.h>//内含-NOP-函数
#include<stdlib.h>//内含rand()函数
#define uchar unsigned char
#define uint unsigned int
//**********宏定义所需指令
#define BASIC_SET 0x30
//程序说明:本程序为12864(st7920)驱动程序,只实现了最简单的显示功能
//端口设置:RS、RW、EN分别为P0口的0、1、2,数据口为P2口
//注意:1、要想在液晶屏上同时显示自定义字库和绘图必须先显示自定义字库
// 2、本程序所有函数均有用且正确,由于我的keil未破解不能编译,所以将其注释了
unsigned char GDRAM_hbit,GDRAM_lbit;
write_com(0x36);//扩展指令命令
/***X,Y坐标互换,即普通的X,Y坐标***/
x_Dyte=x/16;//计算在16个字节中的哪一个
x_byte=x&0x0f;//计算在该字节中的哪一位
y_Dyte=y/32;//0为上半屏,1为下半屏
{
unsigned char i;
switch(x)//确定行号
{
case 0x00: i=0x80; break;//第一行