atmage16_12864液晶显示波形,画点,画线源程序

来源:本站
导读:目前正在解读《atmage16_12864液晶显示波形,画点,画线源程序》的相关信息,《atmage16_12864液晶显示波形,画点,画线源程序》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《atmage16_12864液晶显示波形,画点,画线源程序》的详细说明。
简介:介绍了atmage16_12864液晶显示波形,画点,画线源程序

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

提醒:《atmage16_12864液晶显示波形,画点,画线源程序》最后刷新时间 2024-03-14 01:04:11,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《atmage16_12864液晶显示波形,画点,画线源程序》该内容的真实性请自行鉴别。