📄 lcd绘制三角波、方波、正弦波曲线程序.c
字号:
//ST7920控制器串行方式C语言演示程序/
#include <AT89X51.H>
#include <intrins.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
#define RS P1_5
#define RW P1_6
#define E P1_7
uchar com,dat;
void Delay1ms(uint time);
void initialization(void);
void writecom(uchar com);
void writedat(uchar com);
void Gra(uchar x,uchar y);
void Clear(void);
void drawarc(uchar a,uchar b,uchar r);
/************************************************************
*Function: 主函数
*************************************************************/
void main(void)
{ uchar i=0,j=0;
uchar x=0,y=0;
float a=0,b=0;
initialization();
Clear();
while(1)
{
for(x=0;x<128;x++) //绘制三角波程序 //x坐标从0到128
{ if(x&0x20)
{y=(x&0x1f)+16;}
else
{y=48-(x&0x1f);}
Gra(x,y);
Delay1ms(50);
}
Delay1ms(2000);
Clear();
for(x=0;x<128;x++) //锯齿波程序
{ {y=(x&0x1f)+16;}
Gra(x,y);
if(x==32||x==64||x==96)
{for(j=16;j<48;j++)
{Gra(x,j);}
}
Delay1ms(50);
}
Delay1ms(2000);
Clear();
for(x=0;x<128;x++) //方波程序
{ if(x&0x10)
{Gra(x,48);}
else
{Gra(x,16);}
if(x==32||x==64||x==96||x==16||x==48||x==80||x==112)
{for(j=16;j<48;j++)
{Gra(x,j);}
}
Delay1ms(50);
}
Delay1ms(2000);
Clear();
for(x=0;x<128;x++) //正弦波程序
{ a=x;
a=a/5;
b=sin(a);
b=b*32+32;
y=(uchar)b;
Gra(x,y);
Delay1ms(50);
}
Delay1ms(2000);
Clear();
}
}
/************************************************************
*Function: 测试I/O口的状态
*************************************************************/
void chk_busy(void) //测忙
{ uchar sign;
RS=0;
RW=1;
E=1;
for(;;)
{ P0=0xff; //P1口置高,准备读数
E=1;
sign=P0; //读忙信号
E=0; //产生一个下降延
if(sign<0x80) //不忙则跳出循环
break;
}
E=0;
}
/************************************************************
*Function: 写控制字
*parameter: uchar com 要写的命令
*Return: 无
*Modify: 改变j
*************************************************************/
void writecom(uchar com)
{ chk_busy();
RS=0;
RW=0;
P0=com;
E=1;
E=0;
}
/************************************************************
*Function: 写数据与地址
*parameter: uchar data 要写的数据
*************************************************************/
void writedat(uchar dat)
{ chk_busy();
RS=1;
RW=0;
P0=dat;
E=1;
E=0;
}
/************************************************************
*Function: 初始化程序
*************************************************************/
void initialization(void)
{ Delay1ms(8); //8ms
writecom(0x01); //清屏
writecom(0x0c); //显示状态设定
writecom(0x30); //功能设定
writecom(0x04); //位地址归位
writecom(0x80); //点设定,显示字符/光标从左到右移位,DDRA覯地址?一/
writecom(0x02); //0000,0010 DDRAM地址归位
writecom(0x01); //清屏
writecom(0x34);
writecom(0x36);
}
/************************************************************
*Function: 打点 x=0:128; y=0:64;
*************************************************************/
void Gra(uchar x,uchar y)
{ uchar aa,xx,yy;
uint word=0,num1=0;
uchar a=0,b=0,j;
aa=x;
xx=x>>4;
yy=0x3f-y; //yy=63-y;
if(yy>=32)
{xx=xx+8;yy-=32;} //下一行
writecom(0x80+yy);
writecom(0x80+xx);
_nop_();
chk_busy();
RS=1;
RW=1;
E=1;
a=P0;
for(j=0;j<10;j++);
E=0;
E=1;
for(j=0;j<10;j++);
b=P0;;
E=0;
_nop_();
if((x&0x0f)<8) //该点在高位
{ num1=b;
num1=num1<<8;
num1=num1|a;
word=0x8000>>(x&0x0f) ; //该位置一
word=word|num1;
writecom(0x80+yy); //先设水平
writecom(0x80+xx); //后设垂直
writedat(word>>8);
}
else
{ num1=b;
num1=num1<<8;
(uchar)word=0x8000>>(x&0x0f);
word=word|a;
word=word&0xff00;
num1=num1|word;
writecom(0x80+yy); //先设垂直
writecom(0x80+xx); //后设水平
writedat(b);
writedat(num1>>8);
}
}
/************************************************************
*Function: 绘图模式清屏
*************************************************************/
void Clear(void)
{ uchar i,j;
for(j=0;j<16;j++)
for(i=0;i<32;i++)
{ writecom(0x80+i);
writecom(0x80+j);
writedat(0x00);
writedat(0x00);
}
}
/************************************************************
*Function: 延时1毫秒
*parameter: time:循环的次数,即延时多少毫秒,为整形
*************************************************************/
void Delay1ms(uint time) //1ms延时程序
{ uchar i;
while(time--)
{ for(i = 0; i < 115; i++);}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -