以下为并行方式的范例程序:
// 液晶模块型号: 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();
}
}
12864驱动例程
最新推荐文章于 2024-02-24 22:52:53 发布