12864驱动例程

以下为并行方式的范例程序:
// 液晶模块型号: DV12864G-11 或(G-11),不带字库
// 接口方式:并行接口,6800 时序
// 驱动 IC 是:ST7565R
// 本程序所带的 8x16 点阵及 5x8 点阵的 ASCII 码字符的数据都是从 DV-GB2312 型号字库 IC 里读出来的国标的。 /
#include <reg51.H>
sbit lcd_cs1 =P3^4; //接口定义,CS:片选
sbit lcd_reset =P3^5; //接口定义,RESET:复位
sbit lcd_rs =P3^3; //接口定义,RS:命令/数据寄存器选择。也叫"A0",或“CD”
sbit lcd_e =P3^0; //接口定义,E:读写使能信号
sbit lcd_rw =P2^1; //接口定义,R/W:读/写
sbit key =P2^0; //按键接口,P2.0 口与 GND 之间接一个按键
//另外 P1.0~1.7 对应 DB0~DB7
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar code ascii_table_8x16[95][16];
uchar code ascii_table_5x8[95][5];
uchar code cheng1[];
uchar code gong1[];
uchar code zhuang1[];
uchar code tai1[];
uchar code shi1[];
uchar code yong1[];
uchar code bmp_12864_1[];
uchar code bmp_12864_2[];
uchar code bmp_12864_3[];
uchar code bmp_12864_4[];
uchar code bmp_12864_5[];
//延时
void delay(int i)
{
	int j,k;
	for(j=0;j<i;j++)
	for(k=0;k<110;k++);
}
//短延时
void delay_us(int i)
{
	int j,k;
	for(j=0;j<i;j++)
	for(k=0;k<1;k++);
}
//等待按键:当有按键按下时,单片机会检测到一个低电平
void waitkey()
{
	repeat: if(key==1) goto repeat;
	else delay(2000);
}
//传一个字节的命令到液晶屏驱动 IC
void transfer_command(int data1)
{
	lcd_cs1=0; //片选=0,选中此 IC
	lcd_rs=0; //RS=0:表示以下传输的一个字节是命令
	lcd_e=0; //E:读写使能
	lcd_rw=0; //RW=0:写
	P1=data1;
	lcd_e=1;
	delay_us(2);
	lcd_cs1=1; //传完数据后片选=1, 防止意外选中此 IC, 对抗干扰有好处
	lcd_e=0;
}
//传一个字节的数据到液晶屏驱动 IC
void transfer_data(int data1)
{
	lcd_cs1=0; //片选=0,选中此 IC
	lcd_rs=1; //RS=1:表示以下传输的一个字节是要显示的点阵数据
	lcd_e=0; //E:读写使能
	lcd_rw=0; //RW=0:写
	P1=data1;
	lcd_e=1;
	delay_us(2);
	lcd_cs1=1; //传完数据后片选=1, 防止意外选中此 IC, 对抗干扰有好处
	lcd_e=0;
}

//LCD 模块初始化
void initial_lcd()
{
	lcd_reset=0; //低电平复位
	delay(200);
	lcd_reset=1; //复位完毕
	delay(20);
	transfer_command(0xe2); //软复位
	delay(50);
	transfer_command(0x2c); //升压步聚 1:打开升压
	delay(50);
	transfer_command(0x2e); //升压步聚 2:打开升压及电压调整器
	delay(50);
	transfer_command(0x2f); //升压步聚 3:打开升压、 电压调整器、电压跟随器
	delay(50);
	transfer_command(0x24); //粗调对比度,可设置范围 0x20~0x27
	transfer_command(0x81); //微调对比度
	transfer_command(0x1A); //0x1A,微调对比度的值, 可设置范围 0x00~0x3f
	transfer_command(0xa2); //1/9 偏压比(bias)
	transfer_command(0xc8); //行扫描顺序:从上到下
	transfer_command(0xa0); //列扫描顺序:从左到右
	transfer_command(0x60); //扫描起始行:0X40 表示从第 1 行开始,0x41:第 2 行...0x60:第 33 行,由于 LCD 的走线设计,本 LCD 特殊地从 33 行开
	始扫描。
	transfer_command(0xaf); //打开显示
}
//LCD 地址设置,括号内的参数分别为(页,列)
void lcd_address(uchar page,uchar column)
{
	column=column;
	page=page-1; //我们平常说的第 1 页,其实对 IC 来说是第 0 页,所以在这里减去 1
	transfer_command(0xb0+page); //设置页地址。每页是 8 行。一个画面的 64 行被分成 8 个页。
	transfer_command(((column>>4)&0x0f)+0x10); //设置列地址的高 4 位
	transfer_command(column&0x0f); //设置列地址的低 4 位
}
//全屏清屏
void clear_screen()
{
	unsigned char i,j;
	for(i=0;i<9;i++) //液晶驱动 IC 有 65 行(分为 9 个页),只引出来 64 行(8 页),有 1 行没引出来,清屏时一并清掉。
	{
		lcd_address(1+i,1);
		for(j=0;j<132;j++) //液晶驱动 IC 有 132 列,只引出来 128 列,有 4 列没引出来,所以清屏时一并清掉。
		{
			transfer_data(0x00);//全部显示数据是 0,以此清屏。
		}
	}
}
//===显示测试画面:例如全显示,隔行显示,隔列显示,雪花显示=====
void test_display(uchar data1,uchar data2)
{
	int i,j;
	for(j=0;j<8;j++)
	{
		lcd_address(j+1,0);
		for(i=0;i<128;i++)
		{
			transfer_data(data1);
			transfer_data(data2);
		}
	}
}
//显示 128x64 点阵图像
void display_graphic_128x64(uchar page,uchar column,uchar *dp)
{
	int i,j;
	for(j=0;j<8;j++)
	{
		lcd_address(page+j,column);
		for(i=0;i<128;i++)
		{
			transfer_data(*dp);
			dp++;
		}
	}
}
//显示 32x32 点阵图像、汉字、生僻字或 32x32 点阵的其他图标
void display_graphic_32x32(uchar page,uchar column,uchar *dp)
{
	uchar i,j;
	for(j=0;j<4;j++)
	{
		lcd_address(page+j,column);
		for (i=0;i<31;i++)
		{
			transfer_data(*dp); //写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1
			dp++;
		}
	}
}
//显示 16x16 点阵图像、汉字、生僻字或 16x16 点阵的其他图标
void display_graphic_16x16(uchar page,uchar column,uchar *dp)
{
	uchar i,j;
	for(j=0;j<2;j++)
	{
		lcd_address(page+j,column);
		for (i=0;i<16;i++)
		{
			transfer_data(*dp); //写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1
			dp++;
		}
	}
}
//显示 8x16 点阵图像、ASCII, 或 8x16 点阵的自造字符、其他图标
void display_graphic_8x16(uchar page,uchar column,uchar *dp)
{
	uchar i,j;
	for(j=0;j<2;j++)
	{
		lcd_address(page+j,column);
		for (i=0;i<8;i++)
		{
			transfer_data(*dp); //写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1
			dp++;
		}
	}
}
//显示 8x16 点阵 ASCII 字符串,括号里的参数是(页, 列,数据指针)
void display_string_8x16(uint page,uint column,uchar *text)
{
	uint i=0,j,k,n;
	while(text[i]>0x00)
	{
		if((text[i]>=0x20)&&(text[i]<=0x7e))
		{
			j=text[i]-0x20;
			for(n=0;n<2;n++)
			{
				lcd_address(page+n,column);
				for(k=0;k<8;k++)
				{
					transfer_data(ascii_table_8x16[j][k+8*n]);//传完一个字节数据后,列地址会自动+1
				}
			}
			i++;
			column+=8;
		}
		else
		i++;
	}
}
//显示 5x8 点阵 ASCII 字符串,括号里的参数是(页, 列,数据指针)
void display_string_5x8(uint page,uint column,uchar *text)
{
	uint i=0,j,k;
	while(text[i]>0x00)
	{
		if((text[i]>=0x20)&&(text[i]<0x7e))
		{
			j=text[i]-0x20;
			lcd_address(page,column);
			for(k=0;k<5;k++)
			{
				transfer_data(ascii_table_5x8[j][k]);//传完一个字节数据后,列地址会自动+1
			}
			transfer_data(0x00);
			i++;
			column+=6;
		}
		else
		i++;
	}
}
void main(void)
{
	while(1)
	{
		initial_lcd(); //LCD 初始化
		//显示一些出厂电测常用画面
		clear_screen(); //全屏清屏
		test_display(0xff,0xff); //全显示
		waitkey();
		test_display(0x55,0xaa); //雪花 1
		waitkey();
		test_display(0xaa,0x55); //雪花 2
		waitkey();
		//显示一些 128x64 点阵的单色图像
		clear_screen(); //clear all dots
		display_graphic_128x64(1,1,bmp_12864_1); //显示 128x64 点阵图片
		waitkey();
		clear_screen(); //clear all dots
		display_graphic_128x64(1,1,bmp_12864_2);
		waitkey();
		clear_screen(); //全屏清屏
		display_graphic_128x64(1,1,bmp_12864_3);
		waitkey();
		clear_screen(); //全屏清屏
		display_graphic_128x64(1,1,bmp_12864_4);
		waitkey();
		clear_screen(); //全屏清屏
		display_graphic_128x64(1,1,bmp_12864_5);
		waitkey();
		//显示一些不同点阵的汉字或字符
		clear_screen(); //全屏清屏
		display_graphic_32x32(1,(1+32*1),cheng1); //在第 1 页,第 49 列显示单个汉字"成"
		display_graphic_32x32(1,(1+32*2),gong1); //在第 1 页,第 49 列显示单个汉字"功"
		display_graphic_16x16(6,1,zhuang1); //在第 5 页,第 1 列显示单个汉字"状"
		display_graphic_16x16(6,(1+16),tai1); //在第 5 页,第 17 列显示单个汉字"态"
		display_string_8x16(6,(1+16+16),":"); //在第 5 页,第 25 列显示单个字符":"
		display_graphic_16x16(6,(1+16*2+8),shi1); //在第 5 页,第 41 列显示单个汉字"使"
		display_graphic_16x16(6,(1+16*3+8),yong1); //在第 5 页,第 49 列显示单个汉字"用"
		display_string_8x16(6,89,"12:45"); //在第 5 页,第 89 列显示单个数字"0"
		waitkey();
		//显示一些字符串
		clear_screen(); //全屏清屏
		display_string_8x16(1,1," !\"#$%&'()*+,-./"); //显示 8x16 的 ASCII 码字符串
		//------括号里的参数分别为(页地址,列地址,要显示的字符),
		//------注意:为了能显示双引号("),在双引号前面加一个斜杠(\),斜杠(\)本身并不显示出来
		display_string_8x16(3,1,"0123456789:;<=>?"); //括号里的参数分别为(页地址,列地址,要显示的字符)
		display_string_8x16(5,1,"@ABCDEFGHIJKLMNO");
		display_string_8x16(7,1,"PQRSTUVWXYZ[\\]^_"); //注意:为了能显示斜杠(\),在斜杠(\)前面再加一个斜杠(\),两个斜杠(\)只显示一
		个出来
		waitkey();
		//显示一些字符串 //全屏清屏
		clear_screen();
		display_string_8x16(1,1,"`abcdefghijklmno");
		display_string_8x16(3,1,"pqrstuvwxyz{|}~ ");
		display_string_5x8(5,1," !\"#$%&'()*+,-./01234");//显示 5x8 的 ASCII 码字符串
		display_string_5x8(6,1,"56789:;<=>?@ABCDEFGHI");
		display_string_5x8(7,1,"JKLMNOPQRSTUVWXYZ[\\]^");
		display_string_5x8(8,1,"_`abcdefghijklmnopqrs");
		waitkey();
	}
}

在这里插入图片描述

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AIOT技术栈

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值