?? mdp.c
字號:
/***********************************************************************/
/*顯示模塊的應用,LCD12864并行接法畫波形程序
/*LCD12864點陣高電平亮,低電平暗
/*LCD12864在X軸方向分有上下各8個區(一個屏幕上共有16個區)
/*上半部分有00~07區;下半部分有08~0F區
/*每個區X軸向上有16個點陣;Y軸向上有32個點陣
/*LCD12864寫點陣每個區都是先對前面的8個點陣進行操作,再對后8個點陣操作
/* 創作時間 2008.7.31
/************************************************************************/
#include<reg52.h>
#include<intrins.h>
#include<math.h> //調用sin()函數
#define uint unsigned int
#define uchar unsigned char
/************變量定義**************/
uint i,j;
uchar temp,x,y;
/********* LCD12864邊線圖***********/
sbit RS=P2^5; //數據\命令選擇
sbit RW=P2^6; //讀\寫選擇
sbit E=P2^7; //使能
/*************************/
/* 延遲子函數
/*************************/
void delay(uint ms)
{
for(i=0;i<ms;i++)
for(j=0;j<110;j++);
}
/********************************/
/* LCD12864子函數
/********************************/
//============LCDbegin==========/
/*******檢查LCD忙位********/
void check_busy()
{
RS=0; //命令選擇
RW=1;
E=1;
P0=0xff;
while((P0&0x80)==0x80); //確定讀忙標志位BF為0
E=0;
}
/********LCD寫命令子函數*********/
void write_com(uchar com)
{
check_busy(); //檢忙
RS=0;
RW=0;
E=1;
P0=com;
delay(2);
E=0;
delay(2);
}
/**********LCD寫數據子函數**********/
void write_data(uchar dat)
{
check_busy();
RS=1;
RW=0;
E=1;
P0=dat;
delay(2);
E=0;
delay(2);
}
/********LCD寫字符串子函數**********/
void write_str(uchar add,uchar *str)
{
write_com(add);
while(*str!='\0')
{
write_data(*str++);
delay(2);
}
}
/********LCD初始化子函數********/
void init_LCD()
{
write_com(0x30); //選擇基本指令集 選擇8bit數據流
write_com(0x02); //地址歸位
write_com(0x0c); //開顯示(無游標、不反白)
write_com(0x06); //指定在資料的讀取及寫入時,設定游標的移動方向及指定顯示的移位
write_com(0x01); //清除顯示,并且設定地址指針為00H
delay(5);
}
/**************顯示坐標(x-y軸)*******************/
void display_XY_line()
{
for(x=0;x<16;x++) //16個區
for(y=0;y<32;y++) //每個區有32行
{
if(x<8&&y==31) //在前八個區的第32行畫一條橫線---x軸
{
write_com(0x36); //擴充指令集,開繪圖功能
write_com(0x80+y); //行地址
write_com(0x80+x); //列地址
write_com(0x30); //改變“RE”位元,基本指令集,以下為寫數據
//連續對一個區寫入兩個數據,第一個語句是對前面的8個點寫,第二語句是對后面的8個點寫
write_data(0xff); //前8個點
write_data(0xff); //后8個點
}
else if(x==0||x==8) //在第零和第八區畫一條豎線---y軸
{
write_com(0x36); //擴充指令集,開繪圖功能
write_com(0x80+y); //行地址
write_com(0x80+x); //列地址
write_com(0x30); //改變“RE”位元,基本指令集,以下為寫數據
//連續對一個區寫入兩個數據,第一個語句是對前面的8個點寫,第二語句是對后面的8個點寫
write_data(0x80); //前8個點
write_data(0x00); //后8個點
}
else //在除去x軸和y軸的其它個位置寫0(即無顯示)
{
write_com(0x36); //擴充指令集,開繪圖功能
write_com(0x80+y); //行地址
write_com(0x80+x); //列地址
write_com(0x30); //改變“RE”位元,基本指令集
//連續對一個區寫入兩個數據,第一個語句是對前面的8個點寫,第二語句是對后面的8個點寫
write_data(0x00); //前8個點
write_data(0x00); //后8個點
}
}
write_com(0x34); //擴充指令,關繪圖功能
write_com(0x36); //擴充指令,開繪圖功能
}
void display_fangbo_line()
{
for(x=0;x<16;x++) //16個區
for(y=0;y<32;y++) //每個區有32行
{
if(x<8&&y==31)
{
write_com(0x36); //擴充指令集,開繪圖功能
write_com(0x80+y); //行地址
write_com(0x80+x); //列地址
write_com(0x30); //改變“RE”位元,基本指令集,以下為寫數據
write_data(0xff); //前8個點
write_data(0xff); //后8個點
}
else if(x>=0&&x<2&&y==0)
{
write_com(0x36); //擴充指令集,開繪圖功能
write_com(0x80+y); //行地址
write_com(0x80+x); //列地址
write_com(0x30); //改變“RE”位元,基本指令集,以下為寫數據
write_data(0xff); //前8個點
write_data(0xff); //后8個點
}
else if(1<x&&x<4&&y==31)
{
write_com(0x36); //擴充指令集,開繪圖功能
write_com(0x80+y); //行地址
write_com(0x80+x); //列地址
write_com(0x30); //改變“RE”位元,基本指令集,以下為寫數據
write_data(0xff); //前8個點
write_data(0xff); //后8個點
}
else if(3<x&&x<6&&y==0)
{
write_com(0x36); //擴充指令集,開繪圖功能
write_com(0x80+y); //行地址
write_com(0x80+x); //列地址
write_com(0x30); //改變“RE”位元,基本指令集,以下為寫數據
write_data(0xff); //前8個點
write_data(0xff); //后8個點
}
else if(5<x&&x<8&&y==31)
{
write_com(0x36);
write_com(0x80+y);
write_com(0x80+x);
write_com(0x30);
write_data(0xff);
write_data(0xff);
}
else if(9<x&&x<12&&y==31)
{
write_com(0x36);
write_com(0x80+y);
write_com(0x80+x);
write_com(0x30);
write_data(0xff);
write_data(0xff);
}
else if(13<x&&x<16&&y==31)
{
write_com(0x36); //擴充指令集,開繪圖功能
write_com(0x80+y); //行地址
write_com(0x80+x);
write_com(0x30);
write_data(0xff);
write_data(0xff);
}
else if(x==0||x==8||x==2||x==10||x==4||x==12||x==6||x==14)
{
write_com(0x36);
write_com(0x80+y);
write_com(0x80+x);
write_com(0x30);
write_data(0x80);
write_data(0x00);
}
else if(x==7||x==15)
{
write_com(0x36);
write_com(0x80+y);
write_com(0x80+x);
write_com(0x30);
write_data(0x00);
write_data(0x01);
}
else //在除去x軸和y軸的其它個位置寫0(即無顯示)
{
write_com(0x36);
write_com(0x80+y); //行地址
write_com(0x80+x); //列地址
write_com(0x30);
write_data(0x00);
write_data(0x00);
}
}
write_com(0x34); //擴充指令,關繪圖功能
write_com(0x36); //擴充指令,開繪圖功能
}
/*------------------整屏寫入數據:全亮,或者豎條-----------------------------*/
void lcdfill(unsigned char disdata)
{ unsigned char x,y;
for(y=0;y<32;y++)
for(x=0;x<16;x++)
{ write_com(0x36);
write_com(y+0x80); //行地址
write_com(x+0x80); //列地址
write_com(0x30);
write_data(disdata);
write_data(disdata);
}
write_com(0x34);
write_com(0x36);
}
/*************************/
/*主函數
/*************************/
void main(void)
{
init_LCD();
write_com(0x01);
delay(5);
write_str(0x80,"fangbo display") ;
write_str(0x90,"made by qjw222") ;
delay(5000);
write_com(0x01);
lcdfill(0xff);
display_XY_line();
display_fangbo_line();
while(1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -