标题:
stc89c51单片机和lcd12864显示sin函数图像 源程序
[打印本页]
作者:
像雪一样的羊
时间:
2020-11-26 16:33
标题:
stc89c51单片机和lcd12864显示sin函数图像 源程序
这是我花了几天时间做的让stc89c51和lcd12864(带字库)的显示波形,
附件里面包含了原理图和单片机源代码。
做出来的图像坐标都很好。
源代码有注释,这是部分代码,具体的大家去下载吧;
制作出来的实物图如下:
IMG_20201126_162559.jpg
(2.92 MB, 下载次数: 51)
下载附件
这是图像
2020-11-26 16:27 上传
单片机源程序如下:
#include <reg51.h>
#include <intrins.h>
#include <math.h>
#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();
}
复制代码
都是自己原创的,请大家多多指教。
以上程序51hei下载地址:
完整sin函数.zip
(45.44 KB, 下载次数: 27)
2020-11-26 16:30 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
蛋进凉绝
时间:
2020-11-28 15:35
51有你黑精彩
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1