/******************************************************************************
开发坏境:CCSv5.4
开发板:TIVA C Launchpad(TM4C123GH6PM)
程序功能:LCD12864显示,可描点,画水平线竖直线,任意直线,坐标轴,sinx,显示汉字,数字,ASCII
程序说明:并行模式,PA2,PA3,PA4分别对应RS,RW,E,PB0-PB7对应数据口
PSB接高电平
******************************************************************************/
#include <stdint.h>
#include <stdbool.h>
#include <math.h>
#include "hw_types.h"
#include "hw_memmap.h"
#include "fpu.h"
#include "sysctl.h"
#include "rom.h"
#include "pin_map.h"
#include "grlib.h"
#include "gpio.h"
#include "adc.h"
#include "hw_gpio.h"
#define uchar unsigned char
#define uint unsigned int
开发坏境:CCSv5.4
开发板:TIVA C Launchpad(TM4C123GH6PM)
程序功能:LCD12864显示,可描点,画水平线竖直线,任意直线,坐标轴,sinx,显示汉字,数字,ASCII
程序说明:并行模式,PA2,PA3,PA4分别对应RS,RW,E,PB0-PB7对应数据口
PSB接高电平
******************************************************************************/
#include <stdint.h>
#include <stdbool.h>
#include <math.h>
#include "hw_types.h"
#include "hw_memmap.h"
#include "fpu.h"
#include "sysctl.h"
#include "rom.h"
#include "pin_map.h"
#include "grlib.h"
#include "gpio.h"
#include "adc.h"
#include "hw_gpio.h"
#define uchar unsigned char
#define uint unsigned int
void delay_Nms(uint n);
uchar LCD12864_Busy(void);
void Ini_Lcd(void);
void write_com(uchar com);
void write_dat(uchar dat);
uchar LCD12864_ReadData(void);
void LCD12864_ClearScreen(void);
void drawPoint(unsigned char x,unsigned char y,unsigned char color);
void drawRowLine(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char color);
void drawCollumLine(unsigned char x0,unsigned char y0,unsigned char y1,unsigned char color);
void drawLine(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char color);
void drawsin();
void drawxy_0(void);
void disp_num(double num,uchar dec_dig);
uchar LCD12864_Busy(void);
void Ini_Lcd(void);
void write_com(uchar com);
void write_dat(uchar dat);
uchar LCD12864_ReadData(void);
void LCD12864_ClearScreen(void);
void drawPoint(unsigned char x,unsigned char y,unsigned char color);
void drawRowLine(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char color);
void drawCollumLine(unsigned char x0,unsigned char y0,unsigned char y1,unsigned char color);
void drawLine(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char color);
void drawsin();
void drawxy_0(void);
void disp_num(double num,uchar dec_dig);
uchar const disps[]={"波的频率为:"};
void main(void)
{
//设置系统时钟为50MHz (400/2/4=50)
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);
Ini_Lcd();
//设置系统时钟为50MHz (400/2/4=50)
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);
Ini_Lcd();
//*****************************************************************************************
//画sin函数
LCD12864_ClearScreen();
drawsin();
while(1);
}
//画sin函数
LCD12864_ClearScreen();
drawsin();
while(1);
}
/*******************************************
函数名称:delay_Nms
功 能:延时N个ms的时间
参 数:无
返回值 :无
********************************************/
void delay_Nms(uint n)
{
uint i = 0;
for(i = n;i > 0;i--)
SysCtlDelay(SysCtlClockGet() / 3000);
}
函数名称:delay_Nms
功 能:延时N个ms的时间
参 数:无
返回值 :无
********************************************/
void delay_Nms(uint n)
{
uint i = 0;
for(i = n;i > 0;i--)
SysCtlDelay(SysCtlClockGet() / 3000);
}
/******************************************************************************
* 函 数 名 : LCD12864_Busy
* 函数功能: 检测LCD是否忙
* 输 入 : 无
* 输 出 : 1或01表示不忙0表示忙
*******************************************************************************/
uchar LCD12864_Busy(void)
{
uchar i = 0;
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3,GPIO_PIN_3 );//RS=0,RW=1
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, GPIO_PIN_4); //E=1
delay_Nms(1);
while((GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7) & 0x80) == 0x80) //检测读取到的值
{
i++;
if(i > 100)
{
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4); //E=0
return 0; //超过等待时间返回0表示失败
}
}
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4); //E=0
return 1;
}
/*******************************************
函数名称:Ini_Lcd
功 能:初始化液晶模块
参 数:无
返回值 :无
********************************************/
void Ini_Lcd(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);//使能GPIOA
GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4);//PA2,3,4设为输出
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//使能GPIOB
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);//PB设为输出
delay_Nms(15); //延时等待液晶完成复位
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4); //E=0
delay_Nms(5);
write_com(0x30); /*功能设置:一次送8位数据,基本指令集*/
* 函 数 名 : LCD12864_Busy
* 函数功能: 检测LCD是否忙
* 输 入 : 无
* 输 出 : 1或01表示不忙0表示忙
*******************************************************************************/
uchar LCD12864_Busy(void)
{
uchar i = 0;
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3,GPIO_PIN_3 );//RS=0,RW=1
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, GPIO_PIN_4); //E=1
delay_Nms(1);
while((GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7) & 0x80) == 0x80) //检测读取到的值
{
i++;
if(i > 100)
{
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4); //E=0
return 0; //超过等待时间返回0表示失败
}
}
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4); //E=0
return 1;
}
/*******************************************
函数名称:Ini_Lcd
功 能:初始化液晶模块
参 数:无
返回值 :无
********************************************/
void Ini_Lcd(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);//使能GPIOA
GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4);//PA2,3,4设为输出
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//使能GPIOB
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);//PB设为输出
delay_Nms(15); //延时等待液晶完成复位
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4); //E=0
delay_Nms(5);
write_com(0x30); /*功能设置:一次送8位数据,基本指令集*/
delay_Nms(1);
write_com(0x08); /*DDRAM地址归位*/
delay_Nms(1);
write_com(0x0c); /*显示设定:开显示,不显示光标,不做当前显示位反白闪动*/
delay_Nms(1);
write_com(0x01); /*清屏,将DDRAM的位址计数器调整为“00H”*/
delay_Nms(1);
write_com(0x06); /*功能设置,点设定:显示字符/光标从左到右移位,DDRAM地址加1*/
delay_Nms(5);
}
write_com(0x08); /*DDRAM地址归位*/
delay_Nms(1);
write_com(0x0c); /*显示设定:开显示,不显示光标,不做当前显示位反白闪动*/
delay_Nms(1);
write_com(0x01); /*清屏,将DDRAM的位址计数器调整为“00H”*/
delay_Nms(1);
write_com(0x06); /*功能设置,点设定:显示字符/光标从左到右移位,DDRAM地址加1*/
delay_Nms(5);
}
/**************************************************
*名称:void write_com(uchar com)
*功能:向1602写指令
*入口参数:com
*出口参数:无
**************************************************/
void write_com(uchar com)
{
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2,~GPIO_PIN_2);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3,~GPIO_PIN_3);//RS=0,RW=0
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, com); //PB=com
delay_Nms(1);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, GPIO_PIN_4); //E=1
delay_Nms(1);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4); //E=0
}
*名称:void write_com(uchar com)
*功能:向1602写指令
*入口参数:com
*出口参数:无
**************************************************/
void write_com(uchar com)
{
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2,~GPIO_PIN_2);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3,~GPIO_PIN_3);//RS=0,RW=0
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, com); //PB=com
delay_Nms(1);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, GPIO_PIN_4); //E=1
delay_Nms(1);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4); //E=0
}
/**************************************************
*名称:void write_dat(uchar dat)
*功能:向1602写数据
*入口参数:dat
*出口参数:无
**************************************************/
void write_dat(uchar dat)
{
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3,GPIO_PIN_2 );//RS=1,RW=0
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, dat); //PB=dat
delay_Nms(1);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4,GPIO_PIN_4); //E=1
delay_Nms(1);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4); //E=0
}
*名称:void write_dat(uchar dat)
*功能:向1602写数据
*入口参数:dat
*出口参数:无
**************************************************/
void write_dat(uchar dat)
{
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3,GPIO_PIN_2 );//RS=1,RW=0
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, dat); //PB=dat
delay_Nms(1);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4,GPIO_PIN_4); //E=1
delay_Nms(1);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4); //E=0
}
/******************************************************************************
* 函 数 名 : LCD12864_ReadData
* 函数功能 : 读取数据
* 输 入 : 无
* 输 出: 读取到的8位数据
*******************************************************************************/
uchar LCD12864_ReadData(void)
{
uchar readValue;
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2,GPIO_PIN_2);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3,GPIO_PIN_3);//RS=1,RW=1
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4); //E=0
delay_Nms(1);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, GPIO_PIN_4); //E=1
delay_Nms(1);
GPIOPinTypeGPIOInput(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);//PB设为输入
readValue =GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);//PB设为输出
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4); //E=0
return readValue;
}
* 函 数 名 : LCD12864_ReadData
* 函数功能 : 读取数据
* 输 入 : 无
* 输 出: 读取到的8位数据
*******************************************************************************/
uchar LCD12864_ReadData(void)
{
uchar readValue;
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2,GPIO_PIN_2);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3,GPIO_PIN_3);//RS=1,RW=1
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4); //E=0
delay_Nms(1);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, GPIO_PIN_4); //E=1
delay_Nms(1);
GPIOPinTypeGPIOInput(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);//PB设为输入
readValue =GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);//PB设为输出
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, ~GPIO_PIN_4); //E=0
return readValue;
}
/******************************************************************************
* 函 数 名 : LCD12864_ClearScreen
* 函数功能 : 在画图模式下LCD12864的01H命令不能清屏所以要自己写一个清 屏函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void LCD12864_ClearScreen(void)
{
uchar i,j;
write_com(0x34); //开启拓展指令集
for(i=0;i<32;i++) //因为LCD有纵坐标32格所以写三十二次
{
write_com(0x80+i); //先写入纵坐标Y的值
write_com(0x80); //再写入横坐标X的值
for(j=0;j<32;j++) //横坐标有16位每位写入两个字节的的数据也
{ //就写入32次以为当写入两个字节之后横坐标会自
write_dat(0x00); //动加1所以就不用再次写入地址了。
}
}
write_com(0x36); //0x36扩展指令里面打开绘图显示
write_com(0x30); //恢复基本指令集
}
/***********************************************************
函数名: drawPoint
函数说明:画点
传入参数:打点位置(x0,y0);color=1,点亮;color=0,擦除
传出参数:无
返回值: 无
**********************************************************/
void drawPoint(unsigned char x,unsigned char y,unsigned char color)
{
unsigned char row,collum,cbite;
unsigned char tempH,tempL;
write_com(0x34);
write_com(0x36);
collum=x>>4;
cbite=x&0x0f;
if(y<32)
{row=y;}
else
{
row=y-32;
collum+=8;
}
write_com(0x80+row);
write_com(0x80+collum);
LCD12864_ReadData();
tempH=LCD12864_ReadData();
tempL=LCD12864_ReadData();
write_com(0x80+row);
write_com(0x80+collum);
if (color)
{
if(cbite<8)
{
tempH|=(1<<(7-cbite));
//tempL=(1<<(7-cbite));
}
else
{
//tempH=(1<<(15-cbite));
tempL|=(1<<(15-cbite));
}
}
else
{
if(cbite<8)
{
tempH&=~(1<<(7-cbite));
//tempL=(1<<(7-cbite));
}
else
{
//tempH=(1<<(15-cbite));
tempL&=~(1<<(15-cbite));
}
}
write_dat(tempH);
write_dat(tempL);
write_com(0x30);
}
/***********************************************************
函数名: drawRowLine
函数说明:画水平线
传入参数:(x0,y0),水平线的起点;(x1,y0)水平线的终点,color=1,点亮;color=0,擦除
传出参数:无
返回值: 无
**********************************************************/
void drawRowLine(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char color)
{
unsigned char temp;
if(x0>x1) // 对x0、x1大小进行排列,以便画图
{
temp = x1;
x1 = x0;
x0 = temp;
}
do
{
drawPoint(x0, y0, color); // 逐点显示,描出垂直线
x0++;
}
while(x1>=x0);
}
* 函 数 名 : LCD12864_ClearScreen
* 函数功能 : 在画图模式下LCD12864的01H命令不能清屏所以要自己写一个清 屏函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void LCD12864_ClearScreen(void)
{
uchar i,j;
write_com(0x34); //开启拓展指令集
for(i=0;i<32;i++) //因为LCD有纵坐标32格所以写三十二次
{
write_com(0x80+i); //先写入纵坐标Y的值
write_com(0x80); //再写入横坐标X的值
for(j=0;j<32;j++) //横坐标有16位每位写入两个字节的的数据也
{ //就写入32次以为当写入两个字节之后横坐标会自
write_dat(0x00); //动加1所以就不用再次写入地址了。
}
}
write_com(0x36); //0x36扩展指令里面打开绘图显示
write_com(0x30); //恢复基本指令集
}
/***********************************************************
函数名: drawPoint
函数说明:画点
传入参数:打点位置(x0,y0);color=1,点亮;color=0,擦除
传出参数:无
返回值: 无
**********************************************************/
void drawPoint(unsigned char x,unsigned char y,unsigned char color)
{
unsigned char row,collum,cbite;
unsigned char tempH,tempL;
write_com(0x34);
write_com(0x36);
collum=x>>4;
cbite=x&0x0f;
if(y<32)
{row=y;}
else
{
row=y-32;
collum+=8;
}
write_com(0x80+row);
write_com(0x80+collum);
LCD12864_ReadData();
tempH=LCD12864_ReadData();
tempL=LCD12864_ReadData();
write_com(0x80+row);
write_com(0x80+collum);
if (color)
{
if(cbite<8)
{
tempH|=(1<<(7-cbite));
//tempL=(1<<(7-cbite));
}
else
{
//tempH=(1<<(15-cbite));
tempL|=(1<<(15-cbite));
}
}
else
{
if(cbite<8)
{
tempH&=~(1<<(7-cbite));
//tempL=(1<<(7-cbite));
}
else
{
//tempH=(1<<(15-cbite));
tempL&=~(1<<(15-cbite));
}
}
write_dat(tempH);
write_dat(tempL);
write_com(0x30);
}
/***********************************************************
函数名: drawRowLine
函数说明:画水平线
传入参数:(x0,y0),水平线的起点;(x1,y0)水平线的终点,color=1,点亮;color=0,擦除
传出参数:无
返回值: 无
**********************************************************/
void drawRowLine(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char color)
{
unsigned char temp;
if(x0>x1) // 对x0、x1大小进行排列,以便画图
{
temp = x1;
x1 = x0;
x0 = temp;
}
do
{
drawPoint(x0, y0, color); // 逐点显示,描出垂直线
x0++;
}
while(x1>=x0);
}
/***********************************************************
函数名: drawCollumLine
函数说明:画竖直线
传入参数:(x0,y0),竖直线的起点;(x1,y0)竖直线的终点;color=1,点亮;color=0,擦除
传出参数:无
返回值: 无
************************************************************/
void drawCollumLine(unsigned char x0,unsigned char y0,unsigned char y1,unsigned char color)
{
unsigned char temp;
if(y0>y1)
{
temp=y0;
y0=y1;
y1=temp;
}
while (y0<=y1)
{
drawPoint(x0,y0,color);
y0++;
}
}
函数名: drawCollumLine
函数说明:画竖直线
传入参数:(x0,y0),竖直线的起点;(x1,y0)竖直线的终点;color=1,点亮;color=0,擦除
传出参数:无
返回值: 无
************************************************************/
void drawCollumLine(unsigned char x0,unsigned char y0,unsigned char y1,unsigned char color)
{
unsigned char temp;
if(y0>y1)
{
temp=y0;
y0=y1;
y1=temp;
}
while (y0<=y1)
{
drawPoint(x0,y0,color);
y0++;
}
}
/*************************************************************
函数名: drawLine
函数说明:使用Bresenham法,画任意两点间的直线
传入参数:(x0,y0),竖直线的起点;(x1,y1)竖直线的终点 color=1,点亮;color=0,擦除
传出参数:无
返回值: 无
************************************************************/
void drawLine(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char color)
{
int dx; // 直线x轴差值变量
int dy; // 直线y轴差值变量
int dx_sym; // x轴增长方向,为-1时减值方向,为1时增值方向
int dy_sym; // y轴增长方向,为-1时减值方向,为1时增值方向
int dx_2; // dx*2值变量,用于加快运算速度
int dy_2; // dy*2值变量,用于加快运算速度
int di; // 决策变量
dx = x1-x0; // 求取两点之间的差值
dy = y1-y0;
if(dx<0) dx_sym=-1;
else
{
if(dx>0) dx_sym=1;
else
{
drawCollumLine(x0,y0,y1,color);
return;
}
}
if(dy>0) dy_sym=1;
else
{
if(dy<0) dy_sym=-1;
else
{
drawRowLine(x0,y0,x1,color);
return;
}
}
dx=dx_sym*dx;
dy=dy_sym*dy;
dx_2=dx*2;
dy_2=dy*2;
if(dx>=dy)
{
di=dy_2-dx;
while(x0!=x1)
{
drawPoint(x0,y0,color);
x0+=dx_sym;
if(di<0) di+=dy_2;
else {di+=dy_2-dx_2;y0+=dy_sym;}
}
drawPoint(x0,y0,color);
}
else
{
di=dx_2-dy;
while(y0!=y1)
{
drawPoint(x0,y0,color);
y0+=dy_sym;
if(di<0) di+=dx_2;
else {di+=dx_2-dy_2;x0+=dx_sym;}
}
drawPoint(x0,y0,color);
}
}
/*************************************************************
函数名: drawsin
函数说明:画sinx函数
传入参数:无
传出参数:无
************************************************************/
void drawsin()
{
uchar i;
uchar x0,y0;
double y;
drawxy_0();
for(i=1;i<61;i++)
{
x0=64+i;
y=31*sin(i*3.14159/60.0);
if((y-(int)y)>=0.5) y=(int)y+1;
else y=(int)y;
y0=32-y;
drawPoint(x0,y0,1);
}
for(i=1;i<61;i++)
{
x0=64-i;
y=31*sin(i*3.14159/60.0);
if((y-(int)y)>=0.5) y=(int)y+1;
else y=(int)y;
y0=32+y;
drawPoint(x0,y0,1);
函数名: drawLine
函数说明:使用Bresenham法,画任意两点间的直线
传入参数:(x0,y0),竖直线的起点;(x1,y1)竖直线的终点 color=1,点亮;color=0,擦除
传出参数:无
返回值: 无
************************************************************/
void drawLine(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char color)
{
int dx; // 直线x轴差值变量
int dy; // 直线y轴差值变量
int dx_sym; // x轴增长方向,为-1时减值方向,为1时增值方向
int dy_sym; // y轴增长方向,为-1时减值方向,为1时增值方向
int dx_2; // dx*2值变量,用于加快运算速度
int dy_2; // dy*2值变量,用于加快运算速度
int di; // 决策变量
dx = x1-x0; // 求取两点之间的差值
dy = y1-y0;
if(dx<0) dx_sym=-1;
else
{
if(dx>0) dx_sym=1;
else
{
drawCollumLine(x0,y0,y1,color);
return;
}
}
if(dy>0) dy_sym=1;
else
{
if(dy<0) dy_sym=-1;
else
{
drawRowLine(x0,y0,x1,color);
return;
}
}
dx=dx_sym*dx;
dy=dy_sym*dy;
dx_2=dx*2;
dy_2=dy*2;
if(dx>=dy)
{
di=dy_2-dx;
while(x0!=x1)
{
drawPoint(x0,y0,color);
x0+=dx_sym;
if(di<0) di+=dy_2;
else {di+=dy_2-dx_2;y0+=dy_sym;}
}
drawPoint(x0,y0,color);
}
else
{
di=dx_2-dy;
while(y0!=y1)
{
drawPoint(x0,y0,color);
y0+=dy_sym;
if(di<0) di+=dx_2;
else {di+=dx_2-dy_2;x0+=dx_sym;}
}
drawPoint(x0,y0,color);
}
}
/*************************************************************
函数名: drawsin
函数说明:画sinx函数
传入参数:无
传出参数:无
************************************************************/
void drawsin()
{
uchar i;
uchar x0,y0;
double y;
drawxy_0();
for(i=1;i<61;i++)
{
x0=64+i;
y=31*sin(i*3.14159/60.0);
if((y-(int)y)>=0.5) y=(int)y+1;
else y=(int)y;
y0=32-y;
drawPoint(x0,y0,1);
}
for(i=1;i<61;i++)
{
x0=64-i;
y=31*sin(i*3.14159/60.0);
if((y-(int)y)>=0.5) y=(int)y+1;
else y=(int)y;
y0=32+y;
drawPoint(x0,y0,1);
}
}
/*************************************************************
函数名: drawxy_0
函数说明:画坐标轴,包括两条直线和箭头
传入参数:无
传出参数:无
************************************************************/
void drawxy_0(void)
{
drawRowLine(0,32,127,1);
drawCollumLine(64,0,63,1);
drawPoint(63,0,1);
drawPoint(62,1,1);
drawPoint(61,2,1);
drawPoint(65,0,1);
drawPoint(66,1,1);
drawPoint(67,2,1);
drawPoint(127,31,1);
drawPoint(126,30,1);
drawPoint(125,29,1);
drawPoint(127,33,1);
drawPoint(126,34,1);
drawPoint(125,35,1);
}
函数名: drawxy_0
函数说明:画坐标轴,包括两条直线和箭头
传入参数:无
传出参数:无
************************************************************/
void drawxy_0(void)
{
drawRowLine(0,32,127,1);
drawCollumLine(64,0,63,1);
drawPoint(63,0,1);
drawPoint(62,1,1);
drawPoint(61,2,1);
drawPoint(65,0,1);
drawPoint(66,1,1);
drawPoint(67,2,1);
drawPoint(127,31,1);
drawPoint(126,30,1);
drawPoint(125,29,1);
drawPoint(127,33,1);
drawPoint(126,34,1);
drawPoint(125,35,1);
}
/**************************************************
*名称:void disp_num(double num,uchar dec_dig)
*功能:显示任意实数,并可设定保留小数位数,且有四舍五入功能
*入口参数:num,dec_dig
**************************************************/
void disp_num(double num,uchar dec_dig)
{
int num_int,num_dec_int,m=0,k=0,j;
double num_dec;
*名称:void disp_num(double num,uchar dec_dig)
*功能:显示任意实数,并可设定保留小数位数,且有四舍五入功能
*入口参数:num,dec_dig
**************************************************/
void disp_num(double num,uchar dec_dig)
{
int num_int,num_dec_int,m=0,k=0,j;
double num_dec;
uchar integ[10],decim[10];
num_int= (int)(num+5*pow(10,-(dec_dig+1)));//a= 1234
num_dec= num - num_int;//b= 0.5678
num_int= (int)(num+5*pow(10,-(dec_dig+1)));//a= 1234
num_dec= num - num_int;//b= 0.5678
for(j=num_int;j>0;j=j/10)
{
integ[k++]=j%10;
}
{
integ[k++]=j%10;
}
num_dec_int=(int)(num_dec*pow(10,dec_dig));
for(j=num_dec_int;j>0;j=j/10)
{
decim[m++]=j%10;
}
for(j=num_dec_int;j>0;j=j/10)
{
decim[m++]=j%10;
}
for(j=k-1;j>=0;j--)
{
write_dat(integ[j]+48);
}
if(num_int==0) write_dat('0');
write_dat('.');
{
write_dat(integ[j]+48);
}
if(num_int==0) write_dat('0');
write_dat('.');
for(j=dec_dig-1;j>=0;j--)
{
write_dat(decim[j]+48);
}
}
{
write_dat(decim[j]+48);
}
}