標(biāo)題:
單片機(jī)LCD12864顯示波形源程序
[打印本頁]
作者:
2983606955
時間:
2020-9-20 10:23
標(biāo)題:
單片機(jī)LCD12864顯示波形源程序
12864顯示波形可顯示 正弦波 余弦波 方波 三角波 鋸齒波
單片機(jī)源程序如下:
#include <reg52.h>
#include <intrins.h>
#include <math.h>
//------------定義接口-------------//
sbit RS=P2^6 ;
sbit RW=P2^5 ;
sbit E=P2^7;
sbit PSB= P1^0; //H=并口; L="串口";
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
#define Lcd_Bus P0
// P0 接 LCM
#define uchar unsigned char
#define FIRST_ADDR 0
//定義字符/漢字顯示起始位置
/*------------------檢查忙位-----------------------------*/
void chk_busy()
{
RS=0 ;
RW=1 ;
E=1 ;
Lcd_Bus=0xff ;
while((Lcd_Bus&0x80)==0x80);
E=0 ;
}
/*------------------延時子程序-----------------------------*/
void delay(unsigned int t)
{
unsigned int i,j ;
for(i=0;i<t;i++)
for(j=0;j<10;j++);
}
/*------------------寫命令到LCD------------------------------*/
void write_com(unsigned char cmdcode)
{
chk_busy();
RS=0 ;
RW=0 ;
E=1 ;
Lcd_Bus=cmdcode ;
delay(5);
//------------------在數(shù)據(jù)寫入的時候加入適當(dāng)?shù)难訒r
E=0 ;
delay(5);
}
/*-------------------寫數(shù)據(jù)到LCD----------------------------*/
void write_data(unsigned char Dispdata)
{
chk_busy();
RS=1 ;
RW=0 ;
E=1 ;
Lcd_Bus=Dispdata ;
delay(5);
//------------------在數(shù)據(jù)寫入的時候加入適當(dāng)?shù)难訒r
E=0 ;
delay(5);
}
/*------------------初始化LCD屏--------------------------*/
void lcdreset()
{
PSB = 1;
delay(2000);
write_com(0x30);
delay(10);
//選擇基本指令集
write_com(0x30);
//選擇8bit數(shù)據(jù)流
delay(5);
write_com(0x0c);
//開顯示(無游標(biāo)、不反白)
delay(10);
write_com(0x01);
//清除顯示,并且設(shè)定地址指針為00H
delay(500);
write_com(0x06);
//指定在資料的讀取及寫入時,設(shè)定游標(biāo)的移動方向及指定顯示的移位
delay(0);
}
/*------------------顯示字符串--------------------------*/
void hzkdis(unsigned char code*s)
{
while(*s>0)
{
write_data(*s);
s++;
delay(50);
}
}
/*------------------首屏顯示--------------------------*/
void ceshi()
{
write_com(0x01);
//清除顯示,并且設(shè)定地址指針為00H
delay(5);
write_com(0x80);
//第一行(如果是地址是:80H,即LCD的第一行的第一個位置顯示)
hzkdis("蕪湖職業(yè)技術(shù)學(xué)院");
write_com(0x90);
//第二行(如果是地址是:90H,即LCD的第二行的第一個位置顯示)
hzkdis("信息工程學(xué)院");
write_com(0x88);
//第三行(如果是地址是:88H,即LCD的第二行的第一個位置顯示)
hzkdis("電子信息工程");
write_com(0x98);
//第四行(如果是地址是:98H,即LCD的第二行的第一個位置顯示)
hzkdis("李胡兵測試程序");
}
//------------------清整個GDRAM空間----------------------------
void clrgdram()
{
unsigned char x,y ;
for(y=0;y<64;y++)
for(x=0;x<16;x++)
{
write_com(0x34);
write_com(y+0x80);
//行地址
write_com(x+0x80);
//列地址
write_com(0x30);
write_data(0x00);
write_data(0x00);
}
}
//------------------------------------------------------------
void clrscreen()
{
write_com(0x01);
delay(10);
}
unsigned char ReadByte(void)
{
unsigned char byReturnValue ;
chk_busy();
Lcd_Bus=0xff ;
RS=1 ;
RW=1 ;
E=0 ;
E=1 ;
byReturnValue=Lcd_Bus ;
E=0 ;
return byReturnValue ;
}
/*增加畫點(diǎn)子程序
函數(shù)功能:在坐標(biāo)為(x,y)點(diǎn)畫一個點(diǎn)
參數(shù)意義
X:12864屏幕的橫坐標(biāo),范圍是0到128(從左到右)
Y:12864的縱坐標(biāo),范圍是0到64(從上到下)
Color:為1的時候表示為黑點(diǎn)
*/
void DrawPoint(unsigned char X,unsigned char Y,unsigned char Color)
{
unsigned char Row,Tier,Tier_bit ;
unsigned char ReadOldH,ReadOldL ;
write_com(0x34);
write_com(0x36);
Tier=X>>4 ;
Tier_bit=X&0x0f ;
if(Y<32)
{
Row=Y ;
}
else
{
Row=Y-32 ;
Tier+=8 ;
}
write_com(Row+0x80);
write_com(Tier+0x80);
ReadByte();
ReadOldH=ReadByte();
ReadOldL=ReadByte();
write_com(Row+0x80);
write_com(Tier+0x80);
if(Tier_bit<8)
{
switch(Color)
{
case 0 :
ReadOldH&=(~(0x01<<(7-Tier_bit)));
break ;
case 1 :
ReadOldH|=(0x01<<(7-Tier_bit));
break ;
case 2 :
ReadOldH^=(0x01<<(7-Tier_bit));
break ;
default :
break ;
}
write_data(ReadOldH);
write_data(ReadOldL);
}
else
{
switch(Color)
{
case 0 :
ReadOldL&=(~(0x01<<(15-Tier_bit)));
break ;
case 1 :
ReadOldL|=(0x01<<(15-Tier_bit));
break ;
case 2 :
ReadOldL^=(0x01<<(15-Tier_bit));
break ;
default :
break ;
}
write_data(ReadOldH);
write_data(ReadOldL);
}
write_com(0x30);
}
void main(void)
{
uchar i,j,colour=1,T=0;
RW=0 ;
lcdreset();
ceshi();
clrgdram();
delay(20);
clrscreen();
while(1)
{
if(!k1)
{
for(i=0;i<128;i++)
{
j=32-32*sin(2*i*3.14/(64+T));
DrawPoint(i,j,colour);
}
delay(5);
}
if(!k1)
{
for(j=0;j<64;j++)
{
i=64;
DrawPoint(i,j,colour);
}
for(i=0;i<128;i++)
{
j=32;
DrawPoint(i,j,colour);
}
delay(5000);
}
if(!k2)
{
for(i=0;i<128;i++)
{
j=32-32*sin(2*i*3.14/(64+T/2));
DrawPoint(i,j,colour);
}
}
}
while(1);
}
復(fù)制代碼
hex文件51hei提供下載:
12864顯示波形.zip
(41.42 KB, 下載次數(shù): 30)
2020-9-20 10:23 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
51hei團(tuán)團(tuán)
時間:
2020-9-20 22:13
能分享下原理圖嗎?
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1