|
最近配合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)
2015-3-11 21:35 上傳
點擊文件名下載附件
|
評分
-
查看全部評分
|