|
最近配合proteus仿真,搞了一个小试验程序,功能是,通过 改变主程序里的d,x,y三个变量组合可以在ampire12864液晶上的任意可显示的地方显示任意字符或汉字。通过这个小东西可以很好的理解这类液晶的显示原理,可以很直观的操作其行和列,页和列 左右屏控制。感觉挺好玩,贡上来。请大神斧正。程序使用的是字符库,如要显示汉字,请自行修改参数。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- /***********************************lcd.c****************************************/
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define DB P2
- uchar d,x,y;
- sbit Reset = P0^0; //复位
- sbit RS = P0^3; //指令数据选择
- sbit E = P0^1; //指令数据控制
- sbit CS1 = P0^5; //左屏幕选择,低电平有效
- sbit CS2 = P0^4; //右屏幕选择
- sbit RW = P0^2; //读写控制
- uchar *ZF; //数据指针,ZF为首地址
- const uchar code ZF_tab[] =
- {
- 0xF8,0xFC,0x04,0xC4,0x24,0xFC,0xF8,0x00, // -0-
- 0x07,0x0F,0x09,0x08,0x08,0x0F,0x07,0x00,
- 0x00,0x10,0x18,0xFC,0xFC,0x00,0x00,0x00, // -1-
- 0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,
- …………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
- 0x00,0x04,0x04,0xBC,0xF8,0x40,0x40,0x00, // -}-
- 0x00,0x08,0x08,0x0F,0x07,0x00,0x00,0x00,
-
- };
-
- void delay(uint time) //延时
- {
- while(time --);
- }
- void writedata(uchar dat) //写数据
- {
- delay(5);
- E = 1; RS = 1; RW = 0;
- P2 = dat;
- E = 0;
- }
- void writecmd(uchar cmd) //写地址/命令
- {
- delay(5);
- E = 1; RW = 0; RS = 0;
- P2 = cmd;
- E = 0;
- }
- void SetOnOff(uchar onoff) //1-开显示 0-关
- {
- if(onoff == 1) writecmd(0x3f);
- if(onoff == 0) writecmd(0x3e);
- }
- void setPM(uchar PM) //选择屏幕( 0-左屏,1-右屏,2-全屏 )
- {
- switch(PM)
- {
- case 0 : CS1 = 0; CS2 = 1; break;
- case 1 : CS1 = 1; CS2 = 0; break;
- default : CS1 = 0; CS2 = 0;
- }
- }
- void set_x( x) //x -> 0 : 7 页
- {
- x = x&0x07|0xb8;
- writecmd(x);
- }
-
- void set_y( y) //y -> 0 :63 列
- {
- y = y & 0x3f|0x40;
- writecmd(y);
- }
- void chearPM(uchar PM) //清屏(0-清左屏,1-清右屏,2-清全屏 )
- {
- uchar i,j;
- setPM(PM);
- for(i = 0;i < 8;i++)
- {
- set_x(i); //从第0到第7页
- set_y(0); //从第0列开始
- for(j = 0;j < 64; j++) //在PM=2的情况下左右半屏同时全写0.
- writedata(0x00);
- }
- }
- void InitLcd() //LCD初始化
- {
- Reset = 0; delay(2);Reset = 1; delay(2);//软件复位
- //SetOnOff(0); //关屏幕
- chearPM(2); //清屏
- }
- void showZF( x, y, uchar *ZF) //显示一个字符
- {
- uchar i;
- set_x(x); set_y(y); //设置页地址,设置咧地址
- for(i = 0;i < 8;i ++) writedata(*(ZF++)); // 写字符的上半部分
- set_x(x + 1);set_y(y);
- for(i = 0;i < 8;i ++) writedata(*(ZF++)); // 写字符的下半部分
-
- }
- /*******************************************************************************/
- /********************************main.c***********************************************/
-
- void effect (d, x, y)
- {
- uchar i,h,s;
- if(y<57 )
- {
- setPM(0); //开左屏
- s=(64-y)/8; //计算可以完整显示几个字符,
- ZF =(ZF_tab+(d-1)*16); //计算从第几个字符开始。
- for(i =0;i <s; i++) //循环取字符。
- {
- showZF(x,y ,ZF);
- y += 8; //y加8跳过一个字符的宽度,
- ZF +=16; // ZF加16跳过一个字符的高度
- }
- }
-
- if(y>63 )
- {
- setPM(1); //开右屏
- h=y-64; //计算离开右屏第1列的列值h,h范围0-63
- s=(128-y)/8; // 计算右屏可以完整显示几个字符,
- ZF =( ZF_tab+(d-1)*16);
- for(i =0;i <s; i++)
- {
- showZF(x,h ,ZF); h += 8;ZF +=16;
- }
- }
- }
- void main()
- {
- InitLcd();
- while(1)
- { uchar i;
- d=28; // d:从字库中第几个字开始显示 正常再字库的字节数内取值1到若干个,1是第一个,2是第2个
- x=6; //x;在第几行显示,由于屏幕分8页,字符高度占两页。正常取0-6.x=6就已经是第7页了,
- //余下第8页是为了第6、7页能显示完整字符。
- y=32; // y:从哪一列开始显示 正常取0-120.余下的8列,是为了显示完整字符。大于120终止取字循环。
- effect(d,x,y);
- setPM(2);
- for(i=0;i<3;i++) //闪烁几下 也可不用该程序段
- {
- SetOnOff(1); delay(30000) ;
- SetOnOff(0); delay(30000);
- SetOnOff(1);
- }
- //while(1) ;
- }
- }
复制代码
所有资料51hei提供下载:
在ampire12864液晶的任意可显示的地方显示任意字符或汉字C程序 proteus仿真.rar
(78.07 KB, 下载次数: 287)
|
评分
-
查看全部评分
|