atmage16_12864液晶显示波形,画点,画线
//以下采用的是模块化编程
//液晶写数据写命令
//读数据读命令
#include"yejing12864.h"
#include"delay.h"
#include<macros.h>
#include<iom16v.h>
#define uint unsigned int
#define uchar unsigned char
//定义使能
#define LCD_EN1 PORTC|=BIT(4)
#define LCD_EN0 PORTC&=~BIT(4)
//命令模式
#define LCD_RS1 PORTC|=BIT(5)
#define LCD_RS0 PORTC&=~BIT(5)
//读写控制
#define LCD_WR1 PORTC|=BIT(6)
#define LCD_WR0 PORTC&=~BIT(6)
//串并口控制
#define LCD_PSB1 PORTC|=BIT(7)
#define LCD_PSB0 PORTC&=~BIT(7)
//写地址
void write12864_com(uint com)
{
DDRB=0xff;
PORTB=0xff;
LCD_RS0;
LCD_WR0;
LCD_EN0;
PORTB=com;
delay_xms(1);
LCD_EN1;
delay_xms(1);
LCD_EN0;
}
//写数据
void write12864_date(uint date)
{
DDRB=0xff;
PORTB=0xff;
LCD_RS1;
LCD_WR0;
LCD_EN0;
PORTB=date;
delay_xms(1);
LCD_EN1;
delay_xms(1);
LCD_EN0;
}
//读数据
uchar read_12864(void)
{
uchar shuju;
DDRB=0x00;
PORTB=0xff;
LCD_RS1;
LCD_WR1;
LCD_EN0;
delay_xms(1);
LCD_EN1;
delay_xms(1);
shuju=PINB;
delay_xms(1);
LCD_EN0;
return(shuju);
} //12864 液 晶 初 始 化
void LCD12864_init(void)
{
LCD_PSB1;
write12864_com(0x30);
delay_xms(1);
write12864_com(0x0c);
delay_xms(1);
write12864_com(0x01);
delay_xms(1);
}
//12864 液晶画图时的清屏函数
void clrRAM_12864(void)
{
uchar i,j;
for(i=0;i<64;i++)
for(j=0;j<16;j++)
{
write12864_com(0x34);
write12864_com(i+0x80);
write12864_com(j+0x80);
write12864_com(0x30);
write12864_date(0x00);
write12864_date(0x00);
}
} //延 时 函 数 atmage16 单 片 机 4M 晶 振 1us 和 1ms 的 准 确 延 时
#include"delay.h"
void delay_xus(uint n)
{
uint i;
n=n*5/16;
for(i=0;i<n;i++);
} void delay_xms(uint x)
{
while(x--)
{
uint i;
for(i=0;i<666;i++);
}
}
//主函数,在12864 液晶上显示有0 通道出来的数据,转换成点
#include<iom16v.h>
#include<macros.h>
#include<math.h>
#include"delay.h"
#include"yejing12864.h"
#include"dianxs12864.h"
#include"xianxs12864.h"
#include"zbx.h"
#define uchar unsigned char
#define uint unsigned int
uchar table[]="0123456789";
uint adc_result;
void ad_init(void)
{
ADMUX=0x40;//参考电压的设置,数据对齐方式,通道的选择
ADCSRA=0xe6;//
delay_xms(1000);
} void main(void)
{
uint q,b,s,g;
DDRB=0xff;//端口初始化
PORTB=0xff;
DDRA&=~BIT(0);//电位器接在PA0 上
PORTA&=~BIT(0);
DDRC=0xf0;
PORTC=0xf0;
clrRAM_12864();
delay_xms(50);
LCD12864_init();
ad_init();
while(1)
{
uint i,xa,ya,py;
uint pro_result;
uint adc_l,adc_h;
adc_l=ADCL;
adc_h=ADCH;
adc_result=adc_h*256+adc_l;
zbx();
if(pro_result!=adc_result);
{
pro_result=adc_result;
ya=fabs(32-adc_result*32/1023);
if(xa==0)
{
py=ya;
dianxs12864(8,ya,1);
} xianxs_ry(xa+7,py,xa+8,ya,1);
py=ya;
xa=xa+2;
if(xa>=128)
{
xa=0;
clrRAM_12864();
delay_xms(50);
}
} q=adc_result/1000;
b=adc_result%1000/100;
s=adc_result%100/10;
g=adc_result%10;
write12864_com(0x9c);
write12864_date(table[q]);
write12864_date(table[b]);
write12864_date(table[s]);
write12864_date(table[g]);
}
} /*#pragma interrupt_handler AD_isr:15;
void AD_isr(void)
{
uint adc_l,adc_h;
adc_l=ADCL;
adc_h=ADCH;
adc_result=adc_h*256+adc_l;
}*/
//显示一个坐标轴
#include"dianxs12864.h"
#include"xianxs12864.h"
#include"zbx.h"
#define uint unsigned int
#define uchar unsigned char
void zbx(void)
{
xianxs_shu(7,0,63,1);//画一个垂直的轴
xianxs_heng(0,127,32,1); //画一个横轴
//以十格为单位,给横轴画点
dianxs12864(17,31,1);
dianxs12864(27,31,1);
dianxs12864(37,31,1);
dianxs12864(47,31,1);
dianxs12864(57,31,1);
dianxs12864(67,31,1);
dianxs12864(77,31,1);
dianxs12864(87,31,1);
dianxs12864(97,31,1);
dianxs12864(107,31,1);
dianxs12864(117,31,1);
//以十格为单位,垂直轴上的点
dianxs12864(8,2,1);
dianxs12864(8,12,1);
dianxs12864(8,22,1);
dianxs12864(8,42,1);
dianxs12864(8,52,1);
dianxs12864(8,62,1);
//垂直轴上的箭头
dianxs12864(6,1,1);
dianxs12864(5,2,1);
dianxs12864(8,1,1);
dianxs12864(9,2,1);
//横轴上的箭头
dianxs12864(126,31,1);
dianxs12864(125,30,1);
dianxs12864(126,33,1);
dianxs12864(125,34,1);
}
//点显示函数
#include"dianxs12864.h"
#include"delay.h"
#include"yejing12864.h"
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
//********************************************************
//打点函数
//参数:color=1,该点填充(1);color=0,该点填充(0);
//********************************************************
void dianxs12864(uchar x,uchar y,uchar color)
{
uchar x_dyte,x_byte;//横坐标在哪一个字节,哪一位
uchar y_dyte,y_byte;//纵坐标在哪一个字节,哪一位
uchar high ,low; //定义存放读出来的两个数据
//write12864_com(0x01);
//write12864_com(0x34);
write12864_com(0x36);
//x,y 的坐标互换,即普通的x,y 坐标
x_dyte=x/16; //算出它在哪一个字节(地址)
//一个地址是16 位的
x_byte=x&0x0f; //算出他在哪一位
y_dyte=y/32; //确定是上半屏还是下半屏
//0:上半屏,1 下半屏
y_byte=y&0x1f; //计算0~31 当中的哪一行,即确定是在第几行
write12864_com(0x80+y_byte);//先写垂直坐标(最高位必须为1)
write12864_com(0x80+x_dyte+8*y_dyte);//水平坐标
//下半屏的水平坐标起始地址为0x80
//(+8*y_byte)来确定
//是用上半屏还是下半屏
read_12864(); //先空读一次
high=read_12864(); //读高位
low=read_12864(); //读低位
delay_xms(1);
write12864_com(0x80+y_byte);//先写垂直坐标(最高位必须为1)
write12864_com(0x80+x_dyte+8*y_dyte);//水平坐标
//下半屏的水平坐标起始地址为0x80
//(+8*y_byte)来确定
//是用上半屏还是下半屏
if(x_byte<8)
{
if(color==1)
write12864_date(high|(0X01<<(7-x_byte)));//写高字节因为坐标是从左
到右的
else
write12864_date(high&(~(0X01<<(7-x_byte))));
write12864_date(low); //原数据送回
} else
{
write12864_date(high);
if(color==1)
write12864_date(low|(0x01<<(15-x_byte)));
else
write12864_date(low&(~(0x01<<(15-x_byte))));
}
write12864_com(0x30);
} //横 线 , 竖 线 , 任 意 线 显 示 显 示
#include"xianxs12864.h"
#include"dianxs12864.h"
#define uchar unsigned char
#define uint unsigned int
//横线显示当y 相等时
void xianxs_heng(uchar x0,uchar x1,uchar y,uchar color)
{
uchar t;
if(x0 > x1)
{
t=x1;
x1=x0;
x0=t;
} for for(;x0 <= x1;x0++)
{
dianxs12864(x0,y,color);
}
} //竖 线 显 示 当 x 相 等 时
void xianxs_shu(uchar x,uchar y0,uchar y1,uchar color)
{
uchar z;
if(y0>y1)
{
z=y1;
y1=y0;
y0=z;
} for for(;y0<=y1;y0++)
{
dianxs12864(x,y0,color);
}
}
//下面是两种不同的表达形式
//第一种这个是把bresenham 算法的结论来做的算法
void xianxs_ry(uchar x0,uchar y0,uchar x1,uchar y1,uchar color)
{
int temp;
int dx,dy;
int s1,s2,status,i;
int Dx,Dy,sub;
dx=x1-x0;
if(dx>=0)//判断x 是增加还是减小
s1=1;
else
s1=-1;
dy=y1-y0;
if(dy>=0)//判断x 是增加还是减小
s2=1;
else
s2=-1;
if(dx<0)
Dx=-dx;
else
Dx=dx;
if(dy<0)
Dy=-dy;
else
Dy=dy;
if(Dy>Dx) //以角度45 为分界线,靠近y 轴是status=1,靠近x 轴是status=0
{
temp=Dx;
Dx=Dy;
Dy=temp;
status=1;
} else
status=0;
//判断垂直线和水平线
if(dx==0)
xianxs_shu(x0,y0,y1,color);
if(dy==0)
xianxs_heng(x0,x1,y0,color);
//bresenham 算法画任意两点的直线
sub=2*Dy-Dx;//第一次判断下一个点的位置
for(i=0;i<Dx;i++)
{
dianxs12864(x0,y0,color);//画出第一个点
if(sub>=0)
{
if(status==1)//靠近y 轴
x0=x0+s1; //x 加1
else //靠近x轴
y0=y0+s2; //y 加1
sub=sub-2*Dx;//计算下一个点的位置
}
if(status==1)
y0=y0+s2;
else
x0=x0+s1;
sub=sub+2*Dy;
}
} //下 面 这 种 方 法 也 可 以 显 示
//这个是把bresenham 算法的过程来做的算法
/*//任意的两个点显示
void xianxs_ry(uchar x0,uchar y0,uchar x1,uchar y1,uchar color)
{
int t,distance;
int x=0,y=0,dx,dy;
char cx,cy;
dx=x1-x0;
dy=y1-y0;
//判断两个横坐标的大小
if(dx>0)
{
cx=1;
} else if(dx==0)//两 个 横 坐 标 相 等 则 输 出 横 的 直 线
{
xianxs_shu(x0,y0,y1,color);
return;
} else
{
cx=-1;
}
//判断两个做坐标的大小
if(dy>0)
{
cy=1;
} else if(dy==0)
{
xianxs_heng(x0,x1,y0,color);
return;
} else
{
cy=-1;
} //对dx和dy取绝对值,使其为正整数
if(dx<0)
dx=-dx;
if(dy<0)
dy=-dy;
//判断两个大小,把大的给变量distance
if(dx>dy)
{
distance=dx;
} else
{
distance=dy;
} dianxs12864(x0,y0,color);//画出第一个点
//画线
for(t=0;t<=distance+1;t++)
{
dianxs12864(x0,y0,color);//显示在那个点
x=x+dx;
y=y+dy;
if(x>distance)
{
x=x-distance;
x0=x0+cx;
} if(y>distance)
{
y=y-distance;
y0=y0+cy;
}
} }*/
//以下是以上个子函数的.h 文件
//延时函数
#ifndef __DELAY_H__
#define __DELAY_H__
#include<iom16v.h>
#include<macros.h>
#define uint unsigned int
#define uchar unsigned char
void delay_xus(uint x);
void delay_xms(uint t);
#endif
#ifndef __YEJING12864_H__
#define __YEJING12864_H__
#define uchar unsigned char
#define uint unsigned int
void write12864_com(uint com);
void write12864_date(uint date);
uchar read_12864(void);
void LCD12864_init(void);
void clrRAM_12864(void);
#endif
#ifndef __DIANXS12864_H__
#define __DIANXS12864_H__
#include<iom16v.h>
#include<macros.h>
#define uint unsigned int
#define uchar unsigned char
void dianxs12864(uchar x,uchar y,uchar color);
//void clrRAM_12864(void);
#endif
#ifndef __XIANXS12864_H__
#define __XIANXS12864_H__
#include<iom16v.h>
#include<macros.h>
#define uint unsigned int
#define uchar unsigned char
void xianxs_heng(uchar x0,uchar x1,uchar y,uchar color);
void xianxs_shu(uchar x,uchar y0,uchar y1,uchar color);
void xianxs_ry(uchar x0,uchar y0,uchar x1,uchar y1,uchar color);
#endif
#ifndef __ZBX_H__
#define __ZBX_H__
#define uint unsigned int
#define uchar unsigned char
void zbx(void);
#endif