⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 利用easyARM7 2103与OCM4X8中文液晶实现画线
💻 C
字号:
//┌─────────────────┓
//│ flags含义:                       │
//│┍─┭─┰─┭─┰─┭─┰─┭─┑│
//││ 7│ 6│ 5│ 4│ 3│ 2│ 1│ 0││              
//│┕─┷─┷─┷─┷─┷─┷─┷─┚│
//│      马  实  空      反  设  清  │
//│      赛  心  心      白  置  空  │
//│      克                          │
//│ 有问题请咨询:武兴华              │
//└─────────────────┚

#include "config.h"
#include <math.h>
#define PI 3.1415

unsigned int data_out;
unsigned int datasend;
unsigned int data1,data2,data3;

uint8 hour = 1;
uint8 minute = 30;
uint8 sec = 45;

uint8 paint_buffer[64][16]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x04,0x41,0xFE,0x00,0x00,0x00,0x48,0x00,0x40,0x00,0x40,0x00,0x7F,0x80,0x00,0x00,
0x04,0x41,0x03,0x80,0x00,0x03,0x98,0x00,0xDF,0x80,0xDF,0x84,0x60,0x80,0x00,0x00,
0x04,0x40,0xFB,0x00,0x00,0x0F,0x9F,0xC1,0x85,0x01,0x85,0x07,0xBF,0x80,0x00,0x00,
0x07,0x80,0xFB,0x00,0x00,0x01,0xE6,0x47,0xC2,0x07,0xC2,0x05,0x3F,0xC0,0x00,0x00,
0x04,0x47,0xFF,0xF0,0x00,0x01,0x97,0x43,0x5F,0xE3,0x5F,0xE7,0x2D,0x00,0x00,0x00,
0x04,0x2C,0x93,0x60,0x00,0x01,0x97,0x81,0x43,0x01,0x43,0x00,0x7E,0x80,0x00,0x00,
0x04,0x20,0xFB,0x00,0x00,0x01,0xA6,0xC1,0xC3,0x01,0xC3,0x00,0x46,0x00,0x00,0x00,
0x04,0x20,0xFB,0x00,0x00,0x01,0xC6,0x61,0xC2,0x01,0xC2,0x00,0xCF,0x00,0x00,0x00,
0x04,0x40,0x26,0x00,0x00,0x01,0x86,0x07,0x26,0x07,0x26,0x03,0xBF,0xE0,0x00,0x00,
0x0F,0x80,0x1E,0x07,0x00,0x01,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x40,0x40,0x00,0x00,
0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x08,0x00,0x7C,0x00,0x00,0x00,0x01,0xF0,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x04,0x0F,0x83,0x80,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x02,0x30,0x00,0x40,0x00,0x00,0x0C,0x00,0x01,0x80,0x00,0x00,0x00,
0x00,0x00,0x00,0x01,0xC0,0x00,0x20,0x00,0x00,0x10,0x00,0x00,0x40,0x00,0x00,0x00,
0x00,0x00,0x00,0x06,0x80,0x00,0x10,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,
0x00,0x00,0x00,0x18,0x40,0x00,0x10,0x00,0x00,0x40,0x00,0x00,0x10,0x00,0x00,0x00,
0x00,0x00,0x00,0x60,0x20,0x00,0x10,0x00,0x00,0x80,0x00,0x00,0x08,0x00,0x00,0x00,
0x00,0x00,0x01,0x80,0x18,0x00,0x10,0x00,0x01,0x03,0x80,0x1C,0x04,0x00,0x00,0x00,
0x00,0x00,0x02,0x00,0x04,0x00,0x10,0x00,0x02,0x04,0x40,0x22,0x02,0x00,0x00,0x00,
0x00,0x00,0x0C,0x00,0x03,0x00,0x20,0x00,0x02,0x04,0x40,0x22,0x02,0x00,0x00,0x00,
0x00,0x00,0x30,0x00,0x00,0xC0,0x40,0x00,0x04,0x04,0x40,0x22,0x01,0x00,0x00,0x00,
0x00,0x00,0x40,0x00,0x00,0x3F,0x80,0x00,0x04,0x03,0x80,0x1C,0x01,0x00,0x00,0x00,
0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x80,0x00,0x00,
0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x00,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x00,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x07,0x80,0x01,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x40,0x02,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x40,0x02,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x07,0x80,0x04,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x08,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x10,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x40,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x01,0x80,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xF0,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uint32 posflag = 0; //x:0-31是否改变
typedef struct _point
{
	int x;
	int y;
}Point;

void delay()
{
	uint8 i;
	for(i=0;i<40;i++);		//*至少120的延时
}
void delayns(unsigned int n)
{
	int i = 0;
	for(;i < n; i++)
	{
		delay();
	}
}
void wait_l(uint32 a)
{	
	uint32 i,j;
	for(i=0;i<a;i++)
		for(j=0;j<10000;j++);
}
void setflag(void)
{
	uint8 i = 0;
	for(i = 0; i < 32; i++)
	{
		posflag |= (1 << i);
	}
}

int abs(int num)
{
	return (num >= 0)?num:(-num);
}
int max(int num1, int num2)
{
	return (num1 >= num2)?num1:num2;
}
int min(int num1, int num2)
{
	return (num1 >= num2)?num2:num1;
}
void datachg(int *num1, int *num2)
{
	int tmp = 0;
	tmp = *num1;
	*num1 = *num2;
	*num2 = tmp;
}

void setpixels(int cx, int cy, uint8 flags)
{
	int xn = 0, xm = 0;
	uint8 tmp = 0;
	if((cx > 127) || (cy > 63) || (cx < 0) || (cy < 0))
	{
		return;
	}
	
	xn = cx / 8;
	xm = cx % 8;
	
	tmp = paint_buffer[cy][xn];
	
	if(flags & 2)
		paint_buffer[cy][xn] |= 1 << (7 - xm); 
	else if(flags & 4)
		paint_buffer[cy][xn] ^= 1 << (7 - xm);
	else if(flags & 1)
		paint_buffer[cy][xn] &= ~(1 << (7 - xm));
		
	if(tmp != paint_buffer[cy][xn])
	{
		posflag |= (1 << (31 - (cy % 32)));
	}
}

void drawline(Point ptS, Point ptF, uint8 flags)
{
	int lenx = 0;
	int leny = 0;
	int x = 0;
	int tmpy = 0;
	int oldy = -1;
	int i = 0;
	float slope = 0.0;
		
	if(ptS.x == ptF.x)//垂直线
	{
		ptS.y = (ptS.y > 63)?63:ptS.y;
		ptF.y = (ptF.y > 63)?63:ptF.y;
		ptS.y = (ptS.y < 0)?0:ptS.y;
		ptF.y = (ptF.y < 0)?0:ptF.y;
		for(i = min(ptS.y, ptF.y); i < max(ptS.y, ptF.y); i++)
		{
			setpixels(ptS.x, i, flags);
		}
		return;
	}
	
	if(ptS.x > ptF.x)//交换
	{
		datachg(&ptS.x, &ptF.x);
		datachg(&ptS.y, &ptF.y);
	}
	
	lenx = ptF.x - ptS.x;
	leny = ptF.y - ptS.y;
	slope = (float)leny/(float)(lenx);//斜率
	for(x = 0; x <= (ptF.x - ptS.x); x++)
	{
		tmpy = (int)(slope * x);
		if((tmpy - oldy) > 1)
		{
			for(i = 0; i < (tmpy - oldy - 1); i++)
			{
				setpixels(ptS.x + x, ptS.y + oldy + i + 1, flags);
					
			}
		}
		if((tmpy - oldy) < -1)
		{
			for(i = 0; i < (oldy - tmpy - 1); i++)
			{
				setpixels(ptS.x + x, ptS.y + oldy - i - 1, flags);
					
			}
		}
		oldy = tmpy;
		setpixels(ptS.x + x, ptS.y + tmpy, flags);//补线
	}

}

void drawcircle(Point c, int r, int w, uint8 flags)
{
	int x = 0, y = 0;
	for(x = (c.x - r); x <= (c.x + r); x++)
	{
		for(y = (c.y - r); y <= (c.y + r); y++)
		{
			if(flags & 0x10)
			{
				if(abs((x - c.x) * (x - c.x) + (y - c.y) * (y - c.y) - r * r) < (r + w - 1))
				{
					setpixels(x, y, flags);
				}
			}
			else if(flags & 0x20)
			{
				if(((x - c.x) * (x - c.x) + (y - c.y) * (y - c.y) - r * r) < r)
				{
					setpixels(x, y, flags);
				}
			}
		}
	}
}

void drawsin(int h, int w, uint8 flags)
{
	float s = 0;
	int tmp;
	for(s = 0; ; s += 0.01)
	{
		tmp = (int)(s * w);
		if(tmp > 127)
			break;
		setpixels(tmp, (int)(sin(s) * h) + 32, flags);
	}
}

void setpaintbuffer(uint8 n)
{
	int i= 0, j = 0;
	for(i = 0 ;i < 64; i++)
		for(j = 0;j < 16; j++)
			paint_buffer[i][j] = n;
}

void send_data(uint16 data)     //高8位为待送数据
{
	uint8 i;
	for(i=9;i>1;i--)
	{
		datasend = data >> i & 0x40;
		if(datasend)
			IO0SET|=0x40;
		else
			IO0CLR|=0x40;
		IO0SET|=0X80;
		IO0CLR|=0X80; 
		delay();
	}
}

void write_data(uint16 data)              //低八位是待写入数据
{	 
	data1=0xfa00;   //data2中存放高4位数据,data3中存放低4位数据
	data_out=data_out|0x20;                 //cs set to high
	IO0SET=data_out;
	data2=data&0xf0;						//取高4位数据
	data2=data2<<8;
	data3=data&0x0f;						//取低4位数据
	data3=data3<<12;
	send_data(data1);
	send_data(data2);
	send_data(data3);
	IO0CLR|=0x20; 
}

void write_comm(uint16 data)				//低八位是待写入数据
{	 
	data1=0xf800;
	data_out=data_out|0x20;                 //cs set to high
	IO0SET=data_out;
	data2=data&0xf0;						//取高4位数据
	data2=data2<<8;
	data3=data&0x0f;						//取低4位数据
	data3=data3<<12;
	send_data(data1);
	send_data(data2);
	send_data(data3);
	IO0CLR|=0X20;   
}
	
void init_io(void)
{	
	PINSEL0=0XFF000000;
	IO0DIR=0XFFFFFFFF;
	data_out=0;
	IO0CLR|=~data_out;				//初始化A口数据
}

void screen(char data[65])

{		
	unsigned int i;
	write_comm(0x0030);
	for (i=0;i<64;i++)
	{
		write_data(data[i]);
					
		if (i==15)
			write_comm(0x0090); //设定DDRAM第二行,第一列
		if (i==31)
			write_comm(0x0088); //设定DDRAM第三行,第一列
		if (i==47)
			write_comm(0x0098); //设定DDRAM第四行,第一列
		if (i==63)
			write_comm(0x0080); //设定DDRAM第四行,第一列
	}
}	

void paint(void)
{		
	uint16 x=0x0080,y=0x0080;
	uint8 i = 0, j = 0;

	write_comm(0x0034);     //第一次写0x0034  扩充指令集    
	write_comm(0x0036);		//开启绘图功能
	
	for (j=0;j<32;j++)
	{	
		if(posflag & (1 << (31 - j)))
		{
			write_comm(x);
			write_comm(y);
			for(i = 0; i < 16; i++)
			{
		  		write_data(paint_buffer[j][i]);
			}
			for(i = 0; i < 16; i++)
			{
		  		write_data(paint_buffer[j + 32][i]);
			}
		}
		x++;
	}
	posflag = 0;
}

/*******************************************************************/
/********************主函数main*************************************/
/********************************************************************/	
int main()
{		
		
	/*char hz1[65]={"  英文字符显示  a b c d e f g h i j k l m n o p q r s t u v wxyz"};
	char hz2[65]={"  英文字符显示  A B C D E F G H I J K L M N O P Q R S T U V WXYZ"};
	char hz3[65]={"  数字符号显示  0 1 2 3 4 5 6 7 8 9 ~ ! @ # $ % ^ & * ( ) - + = "};
	char hz4[65]={"+++++++++++++++++ 欢迎使用LCD  ++   液晶显示屏 +++++++++++++++++"};*/
	//int i = 0;
	float s_sec = 0;
	float s_minute = 0;
	float s_hour = 0;
	Point ptS;
	const Point ptF = {31,31};
	Point ptLS;
	Point ptLF; 
	
	init_io();
	posflag = 0;
	//setpaintbuffer(0x00);
	write_comm(0x0030);	//基本指令集
	write_comm(0x0001);	//清除显示屏幕,把DDRAM位址计数器调整为"00H"
	write_comm(0x0003);	//把DDRAM位址计数器调整为"00H",游标回原点,该功能不影响显示DDRAM
	write_comm(0x0006);	//光标右移
	write_comm(0x000c);	//显示屏打开
	
	
	
	ptS.x = 0;
	ptS.y = 0;
	//ptF.x = 31;
	//ptF.y = 31;
	
	ptLS.x = 0;
	ptLS.y = 63;
	ptLF.x = 10;
	ptLF.y = 0;
	
	while(1)
	{
		//(ptF.x > 127)?(ptF.x = 0, ptF.y = 0):(ptF.x += 4, ptF.y += 2);
		setpaintbuffer(0x00);
		/*drawcircle(ptF, 30, 1, 0x22);
		ptF = ptS;
		drawcircle(ptF, 10, 1, 0x14);
		drawline(ptLS, ptLF, 0x24);*/
		drawcircle(ptF, 30, 2, 0x12);
		drawcircle(ptF, 3, 1, 0x22);
		
		s_sec = PI * sec / 30;
		ptS.x = ptF.x + (int)(30 * sin(s_sec));
		ptS.y = ptF.y - (int)(30 * cos(s_sec));
		drawline(ptF, ptS, 0x22);
		
		s_minute = PI * minute / 30;
		ptS.x = ptF.x + (int)(25 * sin(s_minute));
		ptS.y = ptF.y - (int)(25 * cos(s_minute));
		drawline(ptF, ptS, 0x22);

		s_hour = PI * (hour % 12) / 6;
		ptS.x = ptF.x + (int)(20 * sin(s_hour));
		ptS.y = ptF.y - (int)(20 * cos(s_hour));
		drawline(ptF, ptS, 0x22);
		
		sec++;
		if(sec > 59)
		{
			sec = 0;
			minute++;
			if(minute > 59)
			{
				minute = 0;
				hour++;
				if(hour > 23)
					hour = 0;
			}
		}
		
		//drawline(ptLF, ptLS, 0x22);
		//drawsin(20, 10, 0x02);
		//posflag = 0x0000ffff;
		//paint();
		//setpaintbuffer(0x00);
		//posflag = 0xffffffff;
		paint();
	}
}
		
		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -