📄 main.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 + -