以下为并行方式的范例程序: // 液晶模块型号: DV12864G-11 或(G-11),不带字库 // 接口方式:并行接口,6800 时序 // 驱动 IC 是:ST7565R // 本程序所带的 8x16 点阵及 5x8 点阵的 ASCII 码字符的数据都是从 DV-GB2312 型号字库 IC 里读出来的国标的。 / #include
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,"0:;<=>?"); //括号里的参数分别为(页地址,列地址,要显示的字符) 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(); } }

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178332.html原文链接:https://javaforall.net
