51單片機控制的12864顯示,有文字,圖片,動態(tài)圖片,以及PROTUES仿真等非常全面
以上壓縮包所有內(nèi)容下載:
LCD12864.zip
(13.61 MB, 下載次數(shù): 235)
2016-4-10 21:15 上傳
點擊文件名下載附件
部分程序預(yù)覽:
- /***
- 程序:LCD12864顯示圖形
- 內(nèi)容:在12864上顯示正弦曲線——按鍵可調(diào)頻率和幅度
- 學(xué)習板:HOT-51
- 軟件:keil uVision3
- 液晶:QY12864HZ1
- 作者:大海橡樹
- 整理日期:2010-12-08
- 修改:無
- 備注:有什么錯誤的地方,歡迎網(wǎng)友們到空間留言
- O(∩_∩)O~
- *****/
- #include<AT89X52.h>
- #include<math.h>
- #include"ZB.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define LCD_databus P0 //LCD數(shù)據(jù)總線連接P0口
- sbit RS=P2^5;
- sbit RW=P2^6;
- sbit EN=P2^7;//LCD12864三個控制位
- sbit DQ=P2^3;//DS18B20數(shù)據(jù)線
- sbit KEY1=P3^2;
- sbit KEY2=P3^3;
- sbit KEY3=P3^4;
- uchar key_value;
- uchar HZ1[]="周期";
- uchar HZ2[]="幅度";
- void delay(uint i) //延時函數(shù)
- {
- while(--i);
- }
- void Read_busy() //LCD12864忙檢測
- {
- RS=0;
- RW=1;
- EN=1;
- LCD_databus=0xFF;
- while(LCD_databus & 0x80); //判斷最高位,1---busy,0---Nobusy
- EN=0;
- }
- void write_LCD_command(uchar value)//寫指令
- {
- RS=0;
- RW=0;
- EN=1;
- LCD_databus=value;
- delay(7);
- EN=0;
- }
- void write_LCD_data(uchar value)//寫數(shù)據(jù)
- {
- RS=1;
- RW=0;
- EN=1;
- LCD_databus=value;
- delay(7);
- EN=0;
- }
- void init_LCD() //初始化LCD
- {
- write_LCD_command(0x30); //8位數(shù),基本指令
- delay(100);
- write_LCD_command(0x30);
- delay(37);
- write_LCD_command(0x0C); //開顯示,不顯示光標,光標不閃爍
- delay(100);
- write_LCD_command(0x01); //清屏指令
- delay(100);
- write_LCD_command(0x06); //沒寫入數(shù)據(jù),地址指針加1
- }
- void Clear_GDRAM() //清楚GDRAM
- {
- uchar x,y;
- for(y=0;y<64;y++)
- {
- for(x=0;x<16;x++)
- {
- write_LCD_command(0x34);
- write_LCD_command(y+0x80); //先送垂直地址
- write_LCD_command(x+0x80); //后送水平地址
- write_LCD_command(0x30); //基本指令
- write_LCD_data(0x00); //寫入數(shù)據(jù)0
- write_LCD_data(0x00);
- }
- }
- }
- uchar ReadByte() //讀LCD
- {
- uchar Read_value;
- Read_busy();
- RS=1;
- RW=1;
- EN=0;
- EN=1;
- Read_value=LCD_databus;
- EN=0;
-
- return Read_value;
- }
- void display_BMP(uchar *address)//顯示圖片
- {
- uchar i,j;
- for(i=16;i<32;i++)
- {
- write_LCD_command(0x80+i); //先送垂直地址
- write_LCD_command(0x80); //再送水平地址
- for(j=0;j<16;j++)
- {
- write_LCD_data(*address);//寫入數(shù)據(jù)
- address++;
- }
- }
-
- for(i=0;i<32;i++)
- {
- write_LCD_command(0x80+i);//先送垂直地址
- write_LCD_command(0x88); //再送水平地址
- for(j=0;j<16;j++)
- {
- write_LCD_data(*address);
- address++;
- }
- }
-
- }
- void Draw_dots(uchar x,uchar y,uchar color)
- {
- uchar ROW,xlabel,xlabel_bit;
- uchar Read_H,Read_L; //讀LCD中的數(shù)據(jù)
- write_LCD_command(0x34); //擴充指令
- write_LCD_command(0x36); //打開繪圖指令
- xlabel=x>>4; //取16*16首地址
- xlabel_bit=x & 0x0F; //計算該點在16位數(shù)據(jù)的第幾位
- if(y<32) //如果是上半屏,上下半屏y都是0--31
- {
- ROW=y;
- }
- else //顯示的是下半屏
- {
- ROW=y-32;
- xlabel+=8; //規(guī)定顯示在下半屏
- }
- write_LCD_command(ROW+0x80); //送入垂直地址
- write_LCD_command(xlabel+0x80);//再送入水平地址
- ReadByte(); //讀取當前GDRAM數(shù)據(jù)前腰進行一次空讀,接下來就可以讀出數(shù)據(jù)了
- Read_H=ReadByte(); //讀高8位
- Read_L=ReadByte(); //讀低8位
-
- write_LCD_command(ROW+0x80); //送入垂直地址
- write_LCD_command(xlabel+0x80); //再送入水平地址
-
- if(xlabel_bit<8)
- {
- switch(color)
- {
- case 0:Read_H &= (~(0x01<<(7-xlabel_bit)));//若變白
- break;
- case 1:Read_H |= (0x01<<(7-xlabel_bit));//若涂黑
- break;
- case 2:Read_H ^= (0x01<<(7-xlabel_bit));//若反轉(zhuǎn)
- break;
- default:break;
- }
- write_LCD_data(Read_H);//將數(shù)據(jù)寫入GDRAM
- write_LCD_data(Read_L);//先寫高位,再寫低位(地址指針順序)
- }
- else
- {
- switch(color)//color設(shè)置
- {
- case 0: Read_L &= (~(0x01<<(15-xlabel_bit)));//若變白
- break;
- case 1: Read_L |= (0x01<<(15-xlabel_bit));//若涂黑
- break;
- case 2: Read_L ^= (0x01<<(15-xlabel_bit));//若反轉(zhuǎn)
- break;
- default:break;
- }
- write_LCD_data(Read_H);
- write_LCD_data(Read_L);//寫入數(shù)據(jù)
- }
-
- write_LCD_command(0x30);//回到普通模式
- }
- void main()
- {
- uchar i,j;
- uchar num;
- uchar w=10,A=6;
- init_LCD();
- Clear_GDRAM();
- write_LCD_command(0x36);
- display_BMP(ZB);
- while(1)
- {
- write_LCD_command(0x30);
- write_LCD_command(0x80);
- write_LCD_data('T');
- write_LCD_data(':');
- write_LCD_data(2*w/100+0x30);
- write_LCD_data(2*w%100/10+0x30);
- write_LCD_data(2*w%10+0x30);
- write_LCD_command(0x83);
- write_LCD_data('A');
- write_LCD_data(':');
- write_LCD_data(A/10+0x30);
- write_LCD_data(A%10+0x30);
- write_LCD_command(0x36);
- for(i=13;i<128;i++)
- {
- j=35-A*sin((i-13)*3.14/w);
- Draw_dots(i,j,1);
- delay(400);
- }
- /**********以下為按鍵掃描函數(shù)**************/
- if(KEY1==0) //模式鍵按下
- {
- delay(2000);
- if(KEY1==0)
- {
- while(!KEY1);
- key_value++;
- if(key_value>2)
- key_value=0;
- }
- }
- if(key_value==1) //若選擇的是周期模式
- {
- write_LCD_command(0x30);
- write_LCD_command(0x86);
- for(num=0;num<4;num++)
- {
- write_LCD_data(HZ1[num]); //顯示"周期"漢字
- }
- if(KEY2==0) //加鍵按下時
- {
- delay(1500);
- if(KEY2==0)
- {
- while(!KEY2);
- w=w+5; //w加
- if(w==65)
- w=10;
- Clear_GDRAM();
- write_LCD_command(0x36);//重新顯示圖形
- display_BMP(ZB);
- }
- }
- if(KEY3==0)
- {
- delay(2000);
- if(KEY3==0)
- {
- while(!KEY3);
- if(w>=10)
- w=w-5;
- Clear_GDRAM();
- write_LCD_command(0x36);
- display_BMP(ZB); //重新顯示圖形
- }
- }
- }
- if(key_value==2) //若選擇的是幅度模式
- {
- write_LCD_command(0x30);
- write_LCD_command(0x86);
- for(num=0;num<4;num++)
- {
- write_LCD_data(HZ2[num]);
- }
- if(KEY2==0)
- {
- delay(1500);
- if(KEY2==0)
- {
- while(!KEY2);
- A=A+2;
- if(A==22)
- A=8;
- Clear_GDRAM();
- write_LCD_command(0x36);
- display_BMP(ZB);
- }
- }
- if(KEY3==0)
- {
- delay(2000);
- if(KEY3==0)
- {
- while(!KEY3);
- if(A>=6)
- A=A-2;
- Clear_GDRAM();
- write_LCD_command(0x36);
- display_BMP(ZB);
- }
- }
- }
- }
- }
復(fù)制代碼
|