×
单片机 > 单片机程序设计 > 详情

stc89c51单片机和lcd12864显示sin函数图像

发布时间:2021-12-20 发布时间:
|

制作出来的实物图如下:

这是图像


单片机源程序如下:

#include

#include

#include


#define uint unsigned int

#define uchar unsigned char


#define pi 3.1419526

uchar f=16;

uchar u=8;


sbit RS=P2^6;

sbit RW=P2^5;

sbit PSB=P3^2; //lcd串行还是并行选择端

sbit RST=P3^4; //lcd的复位端口

sbit EN=P2^7;



/*延时*/

void delay(uint x)

{

uint y;

for(;x>0;x--)

for(y=110;y>0;y--);

}



/*写入指令*/

void write_com(uchar com)

{


RS=0;

RW=0;

EN=0;

P0=com;

delay(1);

EN=1;

delay(3);

EN=0;

}


/*写入数据*/

void write_data(uchar num)

{


RS=1;

RW=0;

EN=0;

P0=num;

delay(1);

EN=1;

delay(3);

EN=0;

}


/*读取数据*/

uchar Read_data()

{

uchar read;

RS=1;

RW=1;

EN=0;

delay(1);

EN=1;

delay(2);

read=P0;

EN=0;

delay(5);

return read;

}


/*画图清屏*/

void clear_lcd()

{

uchar i,j;

write_com(0x34); //扩充指令集动作

for(i=0;i<32;i++)

{

write_com(0x80+i);

write_com(0x80);

for(j=0;j<32;j++)

{

write_data(0x00);

}

}

write_com(0x36); //扩充指令集动作

write_com(0x30); //基本指令集动作


}


/***********画点函数**************/

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 ) ;

Read_data() ;

ReadOldH = Read_data() ;

ReadOldL = Read_data() ;

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 lcd_init()

{

PSB=1;

RST=1;

write_com(0x30);

delay(1);

write_com(0x3e);

delay(1);

write_com(0x0c);

delay(1);

write_com(0x01);

delay(1);

}


//画水平直线

void Draw_xlabel_line(uchar x0,uchar x1,uchar y,uchar color)

{

uchar temp;

if(x0>x1)

{

temp=x1;

x1=x0;

x0=temp;

}

for(;x0<=x1;x0++)

DrawPoint(x0,y,color);

}


//画垂直直线

void Draw_row_line(uchar x,uchar y0,uchar y1,uchar color)

{

uchar temp;

if(y0>y1)

{

temp=y1;

y1=y0;

y0=temp;

}

for(;y0<=y1;y0++)

DrawPoint(x,y0,color);

}


void sin_display()

{

uchar i,j;

lcd_init();

clear_lcd();

//画y轴箭头

DrawPoint(1,1,1);

DrawPoint(3,1,1);

DrawPoint(0,2,1);

DrawPoint(4,2,1);

Draw_row_line(2,0,60,1); //画Y轴直线


DrawPoint(126,60,1);

DrawPoint(126,62,1);

DrawPoint(125,59,1);

DrawPoint(125,63,1);

Draw_xlabel_line(2,127,61,1); //画X轴直线


for(i=3;i<127;i++)//画sin函数,

{

j=u*sin(pi*i/f)+30;

DrawPoint(i,j,1);

}

}


void main()

{


sin_display();

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机制作超级流水灯