11-mini2440之LCD画圆圈
mini2440原理图
USS
IIS
SPI
ALE/GPA18 CLE/GPA17 FRnB NAND CTRL NCON nFCEGPA22 nFRE/GPA20 nFWE/GPA19 SDCLK/GPE5 SDCMD/GPE6 SDIO SDDATA0/GPE7 SDDATA1/GPE8 SDDATA2/GPE9 SDDATA3/GPE10
nXBACK/GPB5 nXBREQ/GPB6 nGCS0 nGCS1/GPA12 nGCS2/GPA13 nGCS3/GPA14 nGCS4/GPA15 nGCS5/GPA16 nOE nWAIT nWE OM0 OM1
C
ADC
Clock EXYCLK CLKOUT0/GPH9 CLKOUT1/GPH10 MPLLCAP UPLLCAP OM2 OM3 XTIpll XTOpll XTIrtc XTOrtc
B
nCTS0/GPH0 nRTS0/GPH1 TXD0/GPH2 RXD0/GPH3 TXD1/GPH4 RXD1/GPH5 nRTS1/TXD2/GPH6 nCTS1/RXD2/GPH7 UCLK/GPH8
AIN0 AIN1 AIN2 AIN3 AIN4/TSYM AIN5/TSYP AIN6/TSXM AIN7/TSXP Aref
F7 E7 B7 F8 C7 D8 E8 D7 G8 B8 A8 C8 B9 H8 E9 C9 D9 G9 F9 H9 D10 C10 H10 E10 C11 G10 D11
1 2 3
J1 CON3
OM0
从NOR FLASH启动系统, 一般为BIOS模式 从NAND FLASH启动系统,一般为正常运行模式
C5 15p
XTIpll
NANDBOO7 K6 K5
中点画圆算法
中点画圆算法中点画圆算法(Midpoint Circle Algorithm)是一种用于在计算机图形学中绘制圆形的常用算法。
它通过计算圆的各个点的位置,并将其画出,从而实现在屏幕或其他输出设备上绘制圆形的功能。
该算法简单高效,广泛应用于计算机图形学和计算机游戏开发中。
该算法的基本思想是从圆的起点(0,r)开始,逆时针方向按顺序计算其他各个象限的对称点。
在每一步迭代中,根据当前点的位置和距离圆心的距离来决定下一个点的位置。
通过对称性,算法只需要计算象限一中的点,并将其他象限的点进行对称复制。
具体步骤如下:1.初始化圆心位置和半径。
圆心可以任意选择在屏幕上的位置,半径确定了圆的大小。
2.定义一个变量d表示决策参数。
初始时,将决策参数d设为5/4-r,其中r为圆的半径。
3.初始化点的位置为圆的起点(0,r)。
4.在每一步迭代中,根据当前点的位置和决策参数d的值,计算下一个点的位置。
-如果d小于0,则选择当前点的东侧点作为下一个点,并更新决策参数:d=d+2x+1,其中x为当前点的横坐标。
-如果d大于等于0,则选择当前点的东北侧点作为下一个点,并更新决策参数:d=d+2x+1-2y,其中y为当前点的纵坐标。
5.在每一步迭代中,重复步骤4直到达到终止条件,即当前点的横坐标大于等于纵坐标。
6.在每一步迭代中,根据当前点的位置和对称性,在其他象限绘制对应的点。
通过以上步骤,可以逐渐计算出圆上的各个点的位置,并将其绘制出来,从而实现圆形的绘制。
中点画圆算法的优点是简单高效,不需要使用复杂的三角函数运算,适用于在计算资源有限的设备上实现圆形绘制。
该算法在计算机图形学中得到广泛应用,用于绘制圆形的轮廓、填充和渲染等操作。
它在计算机游戏中也被广泛使用,用于绘制角色、道具和特效等元素,为游戏提供更加真实和生动的视觉效果。
总结一下,中点画圆算法是一种常用的计算机图形学算法,用于绘制圆形。
它的简单高效使其成为了广泛应用于计算机图形学和计算机游戏开发中的重要工具。
TFT LCD上的画圆的算法
【转】TFT-LCD上画圆的算法收藏本项目在嵌入式软件开发过程中,涉及到在嵌入式TFT LCD上实现画圆,下面先简要介绍常用的画圆算法(Bresenham算法),然后再具体阐述笔者对该算法的改进。
一个圆,如果画出了圆上的某一点,那么可以利用对称性计算余下的七段圆弧:Plot(x,y),Plot(y,x),Plot(y,-x),Plot(x,-y),Plot(-x,-y),Plot(-y,-x),Plot(-y,x),Plot(-x,y)。
1、Bresenham 画圆算法。
Bresenham算法的主要思想是:以坐标原点(0,0)为圆心的圆可以通过0度到45°的弧计算得到,即x从0增加到半径,然后利用对称性计算余下的七段圆弧。
当x从0增加到时,y从R递减到。
设圆的半径为R,则圆的方程为:f(x,y)=(x+1)2+y2-R2=0 (1)假设当前列(x=xi列)中最接近圆弧的像素已经取为P(xi,yi),根据第二卦限1/8圆的走向,下一列(x=xi+1列)中最接近圆弧的像素只能在P的正右方点H(xi+1,yi)或右下方点L(xi+1,yi-1)中选择,如图1所示。
Bresenham画圆算法采用点T(x,y)到圆心的距离平方与半径平方之差D(T)作为选择标准,即D(T)=(x+1)2+y2-R2 (2)通过比较H、L两点各自对实圆弧上点的距离大小,即根据误差大小来选取,具有最小误差的点为绘制点。
根据公式(2)得:对H(xi+1,yi)点有:D(H)=(xi+1)2+yi2-R2;对L(xi+1,yi-1)点有:D(L)=(xi+1)2+(yi-1)2-R2;根据Bresenham画圆算法,则选择的标准是:如果|D(H)|<|D(L)|,那么下一点选取H(xi+1,yi);如果|D(H)|>|D(L)|,那么下一点选取L(xi+1,yi-1);如果|D(H)|=|D(L)|,那么下一点可以取L(xi+1,yi-1),也可以选取H(xi+1,yi),我们约定选取H(xi+1,yi)。
Arduino+ESP32之驱动GC9A01圆形LCD(一),基于Arduino_GFX库
Arduino+ESP32之驱动GC9A01圆形LCD(⼀),基于Arduino_GFX库最近买了⼀块圆形屏幕,驱动IC是GC9A01,⾃⼰参考淘宝给的stm32的驱动例程,在ubuntu下使⽤IDF开发ESP32,也在windows的vscode内安装IDF开发ESP32,虽然都做到了能显⽰图⽚,但是总有⼀块暗紫⾊的偏差阴影,也尝试了移植LVGL,都遇到了问题。
如上图,在⽹上看到有Arduino的⼀个TFT LCD的驱动库,已经包含了对该型号屏幕IC的驱动,所以转战Arduino环境,来驱动这块圆形屏幕。
1. 下载Arduino_GFX库下载好该库后,放置到Arduino的library⽬录下,如下图所⽰。
这是Arduino的库的默认路径。
2.Arduino GFX库测试Arduino 的library⽬录,这个路径内的项⽬⽂件都是只读的,不便于我们直接打开内部的⽰例项⽬烧录和测试。
将Arduino GFX库内的example⽂件夹内的HelloWorld⽂件夹复制到其他路径下,我是复制到了桌⾯上的smart_screen_001⽂件夹内,然后打开项⽬⼯程HelloWorld.ino⽂件。
修改三处代码,分别修改DC 以及SPI等脚位,以及RST脚,和背光脚DF_GFX_BL。
上述Arduino+ESP32,驱动GC9A01的源⽂件:/******************************************************************************** Start of Arduino_GFX setting** Arduino_GFX try to find the settings depends on selected board in Arduino IDE* Or you can define the display dev kit not in the board list* Defalult pin list for non display dev kit:* Arduino Nano, Micro and more: CS: 9, DC: 8, RST: 7, BL: 6* ESP32 various dev board : CS: 5, DC: 27, RST: 33, BL: 22* ESP32-C3 various dev board : CS: 7, DC: 2, RST: 1, BL: 3* ESP32-S2 various dev board : CS: 34, DC: 26, RST: 33, BL: 21* ESP8266 various dev board : CS: 15, DC: 4, RST: 2, BL: 5* Raspberry Pi Pico dev board : CS: 17, DC: 27, RST: 26, BL: 28* RTL8720 BW16 old patch core : CS: 18, DC: 17, RST: 2, BL: 23* RTL8720_BW16 Official core : CS: 9, DC: 8, RST: 6, BL: 3* RTL8722 dev board : CS: 18, DC: 17, RST: 22, BL: 23* RTL8722_mini dev board : CS: 12, DC: 14, RST: 15, BL: 13* Seeeduino XIAO dev board : CS: 3, DC: 2, RST: 1, BL: 0* Teensy 4.1 dev board : CS: 39, DC: 41, RST: 40, BL: 22******************************************************************************/#include <Arduino_GFX_Library.h>/* More dev device declaration: https:///moononournation/Arduino_GFX/wiki/Dev-Device-Declaration*/#if defined(DISPLAY_DEV_KIT)Arduino_GFX *gfx = create_default_Arduino_GFX();#else /* !defined(DISPLAY_DEV_KIT) *//* More data bus class: https:///moononournation/Arduino_GFX/wiki/Data-Bus-Class*/#if 0Arduino_DataBus *bus = create_default_Arduino_DataBus();#elseArduino_DataBus *bus = new Arduino_ESP32SPI(12/* DC */, 15/* CS */, 14/* SCK */, 13/* MOSI */, -1/* MISO */, HSPI /* spi_num */);#endif/* More display class: https:///moononournation/Arduino_GFX/wiki/Display-Class*/#if 0Arduino_GFX *gfx = new Arduino_ILI9341(bus, DF_GFX_RST, 0/* rotation */, false/* IPS */); #elseArduino_GFX *gfx = new Arduino_GC9A01(bus, 2/* RST */, 0/* rotation */, true/* IPS */);#endif#endif /* !defined(DISPLAY_DEV_KIT) *//******************************************************************************** End of Arduino_GFX setting******************************************************************************/#define DF_GFX_BL 16void setup(void){gfx->begin();gfx->fillScreen(BLACK);#ifdef DF_GFX_BLpinMode(DF_GFX_BL, OUTPUT);digitalWrite(DF_GFX_BL, HIGH);#endifgfx->setCursor(10, 10);gfx->setTextColor(RED);gfx->println("Hello World!");delay(5000); // 5 seconds}void loop(){gfx->setCursor(random(gfx->width()), random(gfx->height()));gfx->setTextColor(random(0xffff), random(0xffff));gfx->setTextSize(random(6) /* x scale */, random(6) /* y scale */, random(2) /* pixel_margin */); gfx->println("Hello World!");delay(1000); // 1 second}实验现象:随机弹出了很多不同⼤⼩,不同⾊彩的Hello world,符合⽰例代码的实现。
51单片机LCD12864绘图
LCD12864绘图方法如下:一、绘图方法:1、使用扩展指令集并关闭绘图显示2、输入y轴坐标3、输入x轴坐标4、写入数据D15-D85、写入数据D7-D06、开绘图显示7、返回普通指令对应程序如下:LCD_write_comm(0x34);//使用扩充指令集LCD_delay();LCD_write_comm(0x80+y);//y坐标起始地址LCD_delay();LCD_write_comm(0x80+x);//x坐标起始地址LCD_delay();LCD_write_date(0x55);//写入数据D15-D8LCD_delay();LCD_write_date(0x55);//写入数据D7-D0LCD_delay();LCD_write_comm(0x36);//显示RAMLCD_delay();LCD_write_comm(0x30);//退出扩展指令集LCD_delay();程序执行效果则是第一行的第1-16个像素点会描出0x5555的二进制像素点,则后面的整个屏幕则是花屏,如果只想看到这0x5555,这几个像素点,则必须要给LCD的RAM重新赋值,也可以说是清屏,程序如下:void LCD12864_RAM_Cls(){u8 x,y;//xy坐标LCD_write_comm(0x34);//使用扩充指令集LCD_delay();for(y=0;y<32;y++){LCD_write_comm(0x80+y);//y坐标起始地址LCD_delay();LCD_write_comm(0x80);//x坐标起始地址LCD_delay();for(x=0;x<16;x++){LCD_write_date(0x00);LCD_delay();LCD_write_date(0x00);LCD_delay();}}LCD_write_comm(0x36);//显示RAMLCD_delay();LCD_write_comm(0x30);//退出扩展指令集LCD_delay();}二、坐标与显示X轴坐标设定初始值后会自动加1,取值范围0-15Y轴需要人为加1,取值范围为0-31整个屏幕分为上下屏,上屏对应坐标为x(0-7)y(0-31),下屏对应坐标为x(8-15)y(0-31)三、LCD12864图片显示代码1、Main.c#include"common.h"#include"delay.h"#include"12864.h"unsigned char code Picture[]= // 图片数据表{//此处添加图片取模16进制码共1024Byte,取模方式:从左到右从上到下0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x06,0x30,0x01,0xE0,0x00,0x00,0x2A,0x00,0x00,0xD8,0x00,0x00,0x00,0x00,0x01, 0x80,0x0F,0x7B,0x63,0xE0,0x00,0x00,0x22,0x00,0x01,0x24,0x00,0x00,0x00,0x00,0x01,0x80,0x0D,0xDB,0x63,0x01,0xBC,0x00,0x08,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x01, 0x80,0x0C,0x1B,0x63,0x07,0xB0,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x01, 0x80,0x0C,0x1B,0x63,0xED,0xB0,0xDB,0x00,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x01, 0x80,0x0C,0x19,0xE1,0xE7,0xB0,0xDB,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x0C,0x19,0xE1,0xE7,0xB0,0xDB,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x05,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0A,0x80,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x0A,0x00,0x00,0xFF,0xF8,0xE0,0x05,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x06,0xC0,0x15,0x00,0x1F,0xFF,0xFF,0xC0,0x02,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x09,0x20,0x11,0x00,0xFB,0xFF,0xE1,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x08,0x20,0x0A,0x03,0x9F,0x00,0x9E,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x04,0x40,0x04,0x0E,0x70,0x00,0x81,0xC7,0x80,0x01,0x40,0x00,0x00,0x00,0x01, 0x80,0x02,0x80,0x00,0x1D,0x80,0x00,0xE0,0x61,0xE0,0x02,0xA0,0x00,0x00,0x00,0x01, 0xC0,0x01,0x00,0x00,0x77,0x9F,0xFC,0xF0,0x18,0xF8,0x02,0x20,0x00,0x00,0x00,0x01, 0xC0,0x00,0x00,0x01,0xDF,0x00,0x00,0xF3,0x0C,0x3C,0x01,0x40,0x00,0x00,0x00,0x01, 0xC0,0x00,0x00,0x03,0x9E,0x00,0x00,0xF8,0x06,0x1E,0x00,0x80,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x07,0x0E,0x30,0x01,0xFC,0x7F,0x07,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x07,0x0E,0x30,0x01,0xFC,0x7F,0x07,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0x83,0xC0,0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x0F,0xFD,0xFF,0xFF,0xFF,0xFF,0xFC,0x01,0xF0,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x3F,0x81,0xFF,0x00,0x00,0x00,0x00,0x1F,0xF0,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0xFE,0xF0,0x00,0x00,0x01,0x00,0x00,0xC0,0x1C,0x00,0x00,0x00,0x00,0x01, 0x80,0x03,0xC0,0x07,0x80,0x00,0x03,0xE0,0x07,0x00,0x1C,0x00,0x00,0x00,0x00,0x01, 0x80,0x03,0x80,0x03,0x60,0x00,0x03,0xE0,0x0C,0x00,0x0E,0x00,0x00,0x00,0x00,0x01, 0x80,0x07,0x00,0x00,0xC0,0x00,0x00,0x20,0x18,0x00,0x07,0x00,0x00,0x00,0x00,0x01, 0x80,0x09,0x01,0x80,0x60,0x00,0x00,0x20,0x73,0x9F,0x03,0x80,0x00,0x00,0x00,0x01, 0x80,0x1E,0x0F,0xF2,0x20,0x00,0x00,0x20,0x67,0xFF,0xC1,0xC0,0x00,0x00,0x00,0x01, 0x80,0x1E,0x1F,0xF9,0x30,0x00,0x00,0x20,0xEF,0xFF,0xE0,0xE0,0x00,0x00,0x00,0x01, 0x80,0x38,0x3F,0xFC,0x90,0x00,0x00,0x20,0xCB,0xFF,0xF9,0xF0,0x00,0x00,0x00,0x01, 0x80,0x7F,0x7F,0xFE,0x10,0x00,0x00,0x20,0xDB,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x01, 0x80,0x6E,0xF9,0xBF,0x10,0x00,0x00,0x20,0xF7,0xED,0xFF,0xF0,0x00,0x00,0x00,0x01, 0x80,0x7C,0xFC,0x3F,0x10,0x00,0x00,0x20,0x67,0xE1,0xFD,0xE0,0x00,0x00,0x00,0x01, 0x80,0x7C,0xFC,0x3F,0x10,0x00,0x00,0x20,0x67,0xE1,0xFD,0xE0,0x00,0x00,0x00,0x01, 0x80,0x38,0xFC,0x3F,0x18,0x00,0x00,0x20,0x87,0xE0,0xFD,0xC0,0x00,0x00,0x00,0x01, 0x80,0x38,0xF1,0x8F,0x18,0x00,0x1F,0xE7,0x87,0x9C,0x7D,0xC0,0x00,0x00,0x00,0x01, 0x80,0x1C,0xFE,0x1F,0x81,0xFF,0xFF,0xC0,0x0F,0xE0,0xFF,0x80,0x00,0x00,0x00,0x01, 0x80,0x0C,0xFC,0x3F,0x80,0x00,0x00,0x00,0x0F,0xE1,0xF8,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0xF9,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEC,0xFE,0x00,0x00,0x00,0x00,0x01,0x80,0x03,0xF9,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x01,0x80,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0xE0,0x00,0x00,0x00,0x60,0x00,0x00,0x01,0xC0,0x02,0x80,0x00,0x00,0x00,0x1C,0x01, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};void main(){LCD12864_init();//LCD初始化//LCD12864_RAM_Cls();LCD_Picture_show(Picture);while(1);}2、common.h#ifndef __COMMON_H#define __COMMON_H#include<STC12C5A60S2.h>#include "intrins.h"#define u8 unsigned char//无符号字符型#define u16 unsigned int//无符号整型#endif3、delay.h#ifndef __DELAY_H#define __DELAY_H#include "common.h"#define MAIN_Fosc 24000000L //定义主时钟void delay_ms(u16 ms);void LCD_delay();//LCD延时函数#endif4、delay.c#include "delay.h"//-------毫秒延时函数---------------void delay_ms(u16 ms){u16 i;do{i = MAIN_Fosc / 13000;while(--i) ; //14T per loop }while(--ms);}//------LCD延时函数-----------------void LCD_delay(void){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}5、12864.h#ifndef __12864_H#define __12864_h#include "common.h"sbit CS =P1^1;//片选sbit SID=P1^2;//数据口sbit CLK=P1^3;//同步时钟void LCD_write_spi(u8 date);//LCD SPI数据写入void LCD_write_comm(u8 comm);//LCD写指令void LCD_write_date(u8 date);//LCD写数据void LCD12864_init();//LCD初始化void LCD12864_RAM_Cls();//RAM清屏void LCD_print(u8 *date);//LCD字符串显示void LCD_Picture_show(u8 *date);#endif6、12864.c#include"common.h"#include"delay.h"#include"12864.h"//------LCD SPI数据写入--------------------void LCD_write_spi(u8 date){u8 i;for(i=0;i<8;i++){CS=1;if(date&0x80){SID=1;}else{SID=0;}date <<= 1;CLK=1;LCD_delay();CLK=0;}}//------LCD写指令--------------------void LCD_write_comm(u8 comm){u8 date = 0xf8;//串行写入指令到LCD(数据手册)u8 comm_H = comm&0xf0;u8 comm_L = comm<<4;CS =0;CLK=0;SID=0;LCD_delay();LCD_write_spi(date);LCD_write_spi(comm_H);LCD_write_spi(comm_L);CS=0;}//------LCD写数据-----------------------void LCD_write_date(u8 date){u8 date2 = 0xfa;//串行写入指令到LCD(数据手册)u8 date_H = date&0xf0;u8 date_L = date<<4;CS =0;CLK=0;SID=0;LCD_delay();LCD_write_spi(date2);LCD_write_spi(date_H);LCD_write_spi(date_L);CS=0;}//-----LCD初始化--------------------------void LCD12864_init(){LCD_write_comm(0x01);//清屏幕delay_ms(1);LCD_write_comm(0x0c);//开显示,游标显示关闭LCD_delay();LCD_write_comm(0x81);//设定坐标LCD_delay();}//-----写RAM清屏--------------------------void LCD12864_RAM_Cls(){u8 x,y;//xy坐标LCD_write_comm(0x34);//使用扩充指令集LCD_delay();for(y=0;y<32;y++){LCD_write_comm(0x80+y);//y坐标起始地址LCD_delay();LCD_write_comm(0x80);//x坐标起始地址LCD_delay();for(x=0;x<16;x++){LCD_write_date(0x00);LCD_delay();LCD_write_date(0x00);LCD_delay();}}LCD_write_comm(0x36);//显示RAMLCD_delay();LCD_write_comm(0x30);//退出扩展指令集LCD_delay();}//----LCD字符串显示-----------------------void LCD_print(u8 *date){u8 j=0;while(date[j]!='\0'){LCD_write_date(date[j]);j++;LCD_delay();}}//----图片显示-----------------------------void LCD_Picture_show(u8 *date){u8 x,y;//xy坐标LCD_write_comm(0x34);//使用扩充指令集LCD_delay();for(y=0;y<32;y++){LCD_write_comm(0x80+y);//y坐标起始地址LCD_delay();LCD_write_comm(0x80);//x坐标起始地址LCD_delay();for(x=0;x<8;x++)//写上半屏幕{LCD_write_date(date[16*y+x*2]);LCD_delay();LCD_write_date(date[16*y+x*2+1]);LCD_delay();}for(x=0;x<8;x++)//写下半屏幕{LCD_write_date(date[16*(y+32)+x*2]);LCD_delay();LCD_write_date(date[16*(y+32)+x*2+1]);LCD_delay();}}LCD_write_comm(0x36);//显示RAMLCD_delay();LCD_write_comm(0x30);//退出扩展指令集LCD_delay();}四、程序执行效果。
11-mini2440之LCD画圆圈
#define GLOBAL_CLK 1#include "def.h"#include "option.h"#include "2440addr.h"#include "2440lib.h"#include "2440slib.h"#include "mmu.h"/**#define LCD_W35**#elif defined(LCD_W35)**#define LCD_WIDTH 320 宽//在option.h文件里面有他们的定义*#define LCD_HEIGHT 240 高*#define LCD_PIXCLOCK 4 时钟参数*#define LCD_RIGHT_MARGIN 0x44 右边沿*#define LCD_LEFT_MARGIN 0x04 左边沿*#define LCD_HSYNC_LEN 0x01 行无效脉冲宽度*#define LCD_UPPER_MARGIN 10 上边沿*#define LCD_LOWER_MARGIN 4 下边沿*#define LCD_VSYNC_LEN 1 列无效脉冲宽度*#define LCD_CON5 ((1<<11) | (1<<8) | (1<<9) | (1<<0) )*/unsigned int lcd_buf[LCD_HEIGHT][LCD_WIDTH]; //24bpp,定义为(unsigned int)32位void delay(unsigned int times);void lcd_init(void);void lcd_brush_background(unsigned int color);void lcd_draw_circle(unsigned int color, unsigned int radius);int Main(void){lcd_init();while (1){lcd_brush_background(0xffffff); //白delay(3000);lcd_draw_circle(0x0000ff, 80);delay(10000);lcd_brush_background(0x0000ff); //蓝delay(3000);lcd_draw_circle(0x00ff00, 80);delay(10000);lcd_brush_background(0x00ff00); //绿delay(3000);lcd_draw_circle(0xff0000, 80);delay(10000);lcd_brush_background(0xff0000); //红delay(3000);lcd_draw_circle(0x000000, 80);delay(10000);lcd_brush_background(0x000000); //黑delay(3000);lcd_draw_circle(0xffffff, 80);delay(10000);}return 0;}void delay(unsigned int times){int i;for (;times > 0; times--)for (i = 0; i < 400; i++);}void lcd_init(void){rGPCCON = 0xaaaa02a9; //管脚配置用于LCDrGPCUP = 0xffffffff;rGPDCON = 0xaaaaaaaa;rGPDUP = 0xffffffff;rGPGCON |= (0x3<<8); //设置GPG4为LCD_PWREN rGPGUP |= (0x1<<4);rGPGDAT |= (0x1<<4);rLCDCON1 = (LCD_PIXCLOCK<<8) | (0x3<<5) | (0xd<<1); //设置时钟、LCD类型为TFT、24bpprLCDCON2 = (LCD_UPPER_MARGIN<<24) | ((LCD_HEIGHT - 1)<<14) | (LCD_LOWER_MARGIN<<6) | (LCD_VSYNC_LEN);rLCDCON3 = (LCD_RIGHT_MARGIN<<19) | ((LCD_WIDTH - 1)<<8) | (LCD_LEFT_MARGIN);rLCDCON4 = LCD_HSYNC_LEN;rLCDCON5 = 0x0308;rLCDSADDR1 = (((unsigned int)lcd_buf>>22)<<21) | ((0x1fffff) & ((unsigned int)lcd_buf>>1));rLCDSADDR2 = 0x1fffff & (((unsigned int)lcd_buf + (LCD_WIDTH * LCD_HEIGHT * 4))>>1);rLCDSADDR3 = LCD_WIDTH * 32 / 16;rLCDINTMSK |= 0x3;rTCONSEL = 0;rLCDCON5 = rLCDCON5 & (~(1<<3)) | (1<<3); //有效PWREN信号rLCDCON5 = rLCDCON5 & (~(1<<5)) | (0<<5); //PWREN信号极性不翻转rLCDCON1 |= 0x1; //开启LCD}void lcd_brush_background(unsigned int color){int x, y;for (x = 0; x < LCD_HEIGHT; x++){for (y = 0; y < LCD_WIDTH; y++){lcd_buf[x][y] = color;}}}void lcd_draw_circle(unsigned int color, unsigned int radius) {unsigned int x, y;unsigned int sqr = radius * radius;for (x = 0; x < LCD_WIDTH; x++){for (y = 0; y < LCD_HEIGHT; y++){if (((x-120)*(x-120) + (y-160)*(y-160)) <= sqr){lcd_buf[x][y] = color;}}}}。
ps圆圈教程_ps怎么画圆圈
ps圆圈教程_ps怎么画圆圈
想要在ps中绘制一个空心的圆圈,但是每次都是绘制出实心圆形,该怎么把圆形变圆圈呢?下面由店铺为大家整理的ps圆圈教程,希望大家喜欢!
ps圆圈教程
1、打开ps软件,点击“文件”-“新建”,建立新的画布。
2、点击侧面的工具面板中的“钢笔”,调出钢笔工具栏。
3、点击钢笔工具栏中的圆圈选项。
4、按住shift键,然后在画布中拖动鼠标,即可画出实心圆圈
5、通过“图层”-“图层样式”-“描边”,调出描边对话框,然后设置圆圈的边框。
6、描边后的圆圈的样子。
7、画空心圆的话,要选择钢笔工具栏的“样式”,然后选择空心样式。
8、然后如第留步进行描边。
9、描边之后就可以获得自己心仪的空心圆了。
ps怎么输入数字圆圈符号?ps给数字加圆圈的技巧
ps怎么输入数字圆圈符号? ps给数字加圆圈的技巧
想要设计一款圆圈数字,该怎么输入呢?下面我们就来看看使用ps制作圆圈数字的技巧。
我们用【
Adobe Photoshop 2020 v21.2.8.17 ACR13.2/12.4 中文版+安装教程 类型:图像处理 大小:1.93GB 语言:简体中文点击【
我们在数字5的外面,画出一个合适大小的圆形。 最后,我们看到数字加圆圈就做好了。 以上就是ps给数字添加圆圈的技巧,希望大家喜欢,请继续关注。
TFTLCD彩屏液晶驱动二画点画线画圆
// lcd.h 寄存器定义,参照上个程序#include "lcd.h"void (*printf)(char *, ...) = 0x33f9291C;static unsigned short *fb = 0x32000000;//---------------数据手册413页---------------//5:6:5格式,去除低位可以减少误差#define RGB565(r, g, b) ((r >> 3) << 11 | (g >> 2) << 5 | (b >> 3))void clr_fb(void);void fill_fb(int start_x, int end_x, int start_y, int end_y, unsigned short val);void draw_point(int x, int y, int clor);void draw_line(int x1,int y1,int x2,int y2,int color);void draw_circle(int x, int y, int r, int color);void _start(void){//LCD初始化,参照上个程序init_lcd();//start lcdLCDCON1 |= ENVID(1);LCDCON5 |= PWREN(1);//清屏幕clr_fb();//-------------画奥运5色环-----------------------draw_circle(35, 35, 35, RGB565(0, 0, 255));draw_circle(115, 35, 35, RGB565(0, 255, 255)); draw_circle(195, 35, 35, RGB565(255, 0, 0));draw_circle(70, 70, 35, RGB565(255, 255, 0));draw_circle(150, 70, 35, RGB565(0, 255, 0));//------------画奥运下面的正四方形---------------draw_line(90, 150, 140, 150, RGB565(255, 0, 255)); draw_line(90, 150, 90, 200, RGB565(255, 0, 255)); draw_line(90, 200, 140, 200, RGB565(255, 0, 255)); draw_line(140, 150, 140, 200, RGB565(255, 0, 255)); //------------画奥运下面的斜45度四方形------------draw_line(115, 140, 80, 175, RGB565(255, 0, 255)); draw_line(80, 175, 115, 210, RGB565(255, 0, 255)); draw_line(115, 210, 150, 175, RGB565(255, 0, 255)); draw_line(150, 175, 115, 140, RGB565(255, 0, 255));//------------画纵坐标---------------------------draw_line(250, 250, 479, 250, RGB565(255, 255, 0)); draw_line(479, 250, 465, 240, RGB565(255, 255, 0)); draw_line(479, 250, 465, 260, RGB565(255, 255, 0)); //------------画横坐标---------------------------draw_line(250, 1, 250, 250, RGB565(255, 255, 0)); draw_line(250, 1, 240, 15, RGB565(255, 255, 0)); draw_line(250, 1, 260, 15, RGB565(255, 255, 0));//--------------画条形---------------------------fill_fb(280, 320, 100, 250, RGB565(255, 0, 0));fill_fb(320, 340, 120, 250, RGB565(0, 200, 0));fill_fb(380, 420, 50, 250, RGB565(255, 0, 255));fill_fb(420, 440, 150, 250, RGB565(0, 255, 255));printf("hello lcd\n");}//-----------画点函数。
msp430的lcd12864显示画圆程序
m s p430的l c d12864显示画圆程序------------------------------------------作者xxxx------------------------------------------日期xxxx基于msp430g2553的Lcd12864的显示画圆程序注:只用将改为其他msp430系列即可使用两个文件"12864.h"//******************************************************************* // 12864 画图、打点//typedef unsigned char uchar;typedef unsigned int uint;#define LCD_DataIn P1DIR=0x00 //数据口方向设置为输入#define LCD_DataOut P1DIR=0xff //数据口方向设置为输出#define LCD2MCU_Data P1IN#define MCU2LCD_Data P1OUT#define LCD_CMDOut P2DIR|=0x07 //P3口的低三位设置为输出#define LCD_RS_H P2OUT|=BIT0 //P2.0高#define LCD_RS_L P2OUT&=~BIT0 //P2.0低#define LCD_RW_H P2OUT|=BIT1 //P2.1高#define LCD_RW_L P2OUT&=~BIT1 //P2.1低#define LCD_EN_H P2OUT|=BIT2 //2.2高#define LCD_EN_L P2OUT&=~BIT2 //P2.2低/*******************************************函数名称:Delay_1ms功能:延时约1ms的时间参数:无返回值:无********************************************/ void Delay_1ms(void){uchar i;for(i = 150;i > 0;i--) _NOP();}/******************************************* 函数名称:Delay_Nms功能:延时N个1ms的时间参数:n--延时长度返回值:无********************************************/ void Delay_Nms(uint n){uint i;for(i = n;i > 0;i--) Delay_1ms();}/******************************************* 函数名称:Write_Cmd功能:向液晶中写控制命令参数:cmd--控制命令返回值:无********************************************/void Write_Cmd(uchar cmd){uchar lcdtemp = 0;LCD_RS_L;LCD_RW_H;LCD_DataIn;do //判忙{LCD_EN_H;_NOP();lcdtemp = LCD2MCU_Data;LCD_EN_L;}while(lcdtemp & 0x80);LCD_DataOut;LCD_RW_L;MCU2LCD_Data = cmd;LCD_EN_H;Delay_1ms();LCD_EN_L;}/******************************************* 函数名称:Write_Data功能:向液晶中写显示数据参数:dat--显示数据返回值:无********************************************/ void Write_Data(uchar dat){uchar lcdtemp = 0;LCD_RS_L;LCD_RW_H;LCD_DataIn;do //判忙{LCD_EN_H;_NOP();lcdtemp = LCD2MCU_Data;LCD_EN_L;}while(lcdtemp & 0x80);LCD_DataOut;LCD_RS_H;LCD_RW_L;MCU2LCD_Data = dat;LCD_EN_H;Delay_1ms();LCD_EN_L;}/******************************************* // 读数据********************************************/ uchar read_data(){uint readvalue;LCD_DataOut;MCU2LCD_Data |=0xff;LCD_RS_H;LCD_RW_H;LCD_DataIn;LCD_EN_L;LCD_EN_H;readvalue=LCD2MCU_Data;Delay_1ms();LCD_EN_L;return readvalue;}//************************************************************ //*********************************************************** //********************************************************/****************定位函数*****x(1~8)y(1~4)****************/ void LCD_SetXY(uchar X, uchar Y){switch(Y) {case 1: Write_Cmd(0x7F + X);break;case 2: Write_Cmd(0x8F + X);break;case 3: Write_Cmd(0x87 + X);break;case 4: Write_Cmd(0x97 + X);break;default:break;}}//************************************************************ /****************在指定的位置显示某个字符****************/ void disp_char(uchar X, uchar Y, uchar wdata){LCD_SetXY(X, Y);Write_Data(wdata);}/******************************************************************** 函数功能:在指定的位置显示字符串******************************************************************/ void disp_str(uchar X, uchar Y, uchar *Str){uchar temp;LCD_SetXY(X, Y);temp = *Str;while(temp != 0){Write_Data(temp);temp = *(++Str);}}//********************************************************//打点函数//参数:color=1,该点填充1;color=0,该点填充白色0;//********************************************************void GUI_Point(unsigned char x,unsigned char y,unsigned char color){unsigned char x_Dyte,x_byte; //定义列地址的字节位,及在字节中的哪1 位unsigned char y_Dyte,y_byte; //定义为上下两个屏(取值为0,1),行地址(取值为0~31)unsigned char GDRAM_hbit,GDRAM_lbit;Write_Cmd(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 当中的哪一行Write_Cmd(0x80+y_byte); //设定行地址(y 坐标),即是垂直地址Write_Cmd(0x80+x_Dyte+8*y_Dyte); //设定列地址(x 坐标),并通过8*y_Dyte 选定上下屏,即是水平地址read_data(); //预读取数据GDRAM_hbit=read_data(); //读取当前显示高8 位数据GDRAM_lbit=read_data(); //读取当前显示低8 位数据Delay_Nms(1);Write_Cmd(0x80+y_byte); //设定行地址(y 坐标)Write_Cmd(0x80+x_Dyte+8*y_Dyte); //设定列地址(x 坐标),并通过8*y_Dyte 选定上下屏Delay_Nms(1);if(x_byte<8) //判断其在高8 位,还是在低8 位{if(color==1){Write_Data(GDRAM_hbit|(0x01<<(7-x_byte))); //置位GDRAM 区高8 位数据中相应的点}elseWrite_Data(GDRAM_hbit&(~(0x01<<(7-x_byte)))); //清除GDRAM 区高8 位数据中相应的点Write_Data(GDRAM_lbit); //显示GDRAM 区低8 位数据}else{Write_Data(GDRAM_hbit); //写高8位数据if(color==1)Write_Data(GDRAM_lbit|(0x01<<(15-x_byte))); //置位GDRAM 区高8 位数据中相应的点elseWrite_Data(GDRAM_lbit&(~(0x01<<(15-x_byte))));//清除GDRAM区高8位数据中相应的点}Write_Cmd(0x30); //恢复到基本指令集}//********************************************************//填充GDRAM 数据://参数:dat 为填充的数据//********************************************************void GUI_Fill_GDRAM(unsigned char dat){uchar i,j,k;uchar bGDRAMAddrX = 0x80; //GDRAM 水平地址uchar bGDRAMAddrY = 0x80; //GDRAM 垂直地址for(i=0;i<2;i++){for(j=0;j<32;j++){for(k=0;k<8;k++){Write_Cmd(0x34); //设置为8 位MPU 接口,扩充指令集,绘图模式关 Write_Cmd(bGDRAMAddrY+j); //垂直地址YWrite_Cmd(bGDRAMAddrX+k); //水平地址XWrite_Data(dat);Write_Data(dat);}}bGDRAMAddrX = 0x88;}Write_Cmd(0x36); //打开绘图模式Write_Cmd(0x30); //恢复基本指令集,关闭绘图模式}//********************************************************///*********************************************************/ /******************画水平线*********************/void LCD_Draw_Line_x( uchar X0, uchar X1, uchar Y, uchar Color ) {uchar Temp ;if( X0 > X1 ){Temp = X1 ;X1 = X0 ;X0 = Temp ;}for( ; X0 <= X1 ; X0++ )GUI_Point( X0, Y, Color );}//*************画垂直线第x列从第y0行画到第y1行颜色 color **************************/void LCD_Draw_Line_Y( uchar X, uchar Y0, uchar Y1, uchar Color ){uchar Temp ;if( Y0 > Y1 ){Temp = Y1 ;Y1 = Y0 ;Y0 = Temp ;}for(; Y0 <= Y1 ; Y0++)GUI_Point( X, Y0, Color);}//**************画斜线(x,y)到(end x,end y)***********************/void LCD_Draw_Line( uchar StartX, uchar StartY, uchar EndX, uchar EndY, uchar Color ){int distance; /*根据屏幕大小改变变量类型(如改为int型)*/int delta_x, delta_y ;int incx, incy ;do{delta_x = EndX - StartX ;delta_y = EndY - StartY ;if( delta_x > 0 ){incx = 1;}else if( delta_x == 0 ){incx = 0;}else{incx = -1 ;}if( delta_y > 0 ){incy = 1 ;}else if(delta_y == 0 ){incy = 0 ;}else{incy = -1 ;}delta_x = incx * delta_x ;delta_y = incy * delta_y ;if( delta_x > delta_y ){distance = delta_x ;StartX+=incx;StartY+=incy;}else{distance = delta_y;StartX+=incx;StartY+=incy;}GUI_Point( StartX, StartY, Color );}while(distance!=0);}/******************************************* // sin函数********************************************/void fsin2(){float x,y;uchar x1,y1;for(x=0;x<(4*3.14159);x+=0.1){y=1*sin(3*x);x1=10*x;y1=31-(10*y+0.5); //对y值进行四舍五入GUI_Point(x1,y1,1);}}/*******************************************函数名称:Ini_Lcd功能:初始化液晶模块参数:无返回值:无********************************************/void Ini_Lcd(void){LCD_CMDOut; //液晶控制端口设置为输出Delay_Nms(500);Write_Cmd(0x30); //基本指令集Delay_1ms();Write_Cmd(0x02); // 地址归位Delay_1ms();Write_Cmd(0x0c); //整体显示打开,游标关闭Delay_1ms();Write_Cmd(0x01); //清除显示Delay_Nms(10);Write_Cmd(0x06); //游标右移Delay_1ms();Write_Cmd(0x80); //设定显示的起始地址}M#include <msp430g2553.h>#include <math.h>#include <stdio.h>#include "12864.h"/****************************************// 画圆*****************************************/void GUI_Circle(uchar x0,uchar y0,uchar r,uchar color){char a,b;char di;if(r>31 ||r==0) return; //参数过滤,次液晶显示的最大圆半径为31 a=0;b=r;di=3-2*r; //判断下个点位置的标志while(a<=b){GUI_Point(x0-b,y0-a,color); //3GUI_Point(x0+b,y0-a,color); //0GUI_Point(x0-a,y0+b,color); //1GUI_Point(x0-b,y0-a,color); //7GUI_Point(x0-a,y0-b,color); //2GUI_Point(x0+b,y0+a,color); //4GUI_Point(x0+a,y0-b,color); //5GUI_Point(x0+a,y0+b,color); //6GUI_Point(x0-b,y0+a,color);a++;/***使用Bresenham 算法画圆**/if(di<0)di +=4*a+6;else{di +=10+4*(a-b);b--;}GUI_Point(x0+a,y0+b,color);}}/**************************************** // 主函数*****************************************/ void main( void ){uint i,j;uchar op[]={"It's the LCD! "};WDTCTL = WDTPW + WDTHOLD; //关狗Ini_Lcd(); //初始化液晶// Write_Cmd(0x80); //写第一行的显示地址// for(i = 0; i < 10; i++)// Write_Data(0x30 + i); //显示0x30~0x3f对应的字符 Write_Cmd(0x90); //写第二行的显示地址for(i = 0; i < 16; i++)Write_Data(0x60 + i); //显示0x60~0x6f对应的字符 // Write_Cmd(0x88); //写第三行的显示地址// for(i = 0; i < 16; i++)// Write_Data(tishi[i]); //Write_Cmd(0x98); //写第四行的显示地址for(i = 0; i < 16; i++)Write_Data(op[i]); //for(i = 1000; i > 0; i--) //延时一会{for(j =200; j > 0; j--)_NOP();}Write_Cmd(0x01); //clearDelay_Nms(10);GUI_Fill_GDRAM(0x00);Delay_Nms(10);fsin2(); //画sin函数for(i = 1000; i > 0; i--) //延时一会 {for(j =400; j > 0; j--)_NOP();}Write_Cmd(0x01); //clearDelay_Nms(10);GUI_Fill_GDRAM(0x00);Delay_Nms(5);GUI_Circle(33,31,20,1); //画圆LPM0;}。
LCD_画点,画直线,画圆,画矩形的几种算法
LCD_Send_Cmd(0x2b);
LCD_Send_Data((y1 & (0xff00))>>8);
LCD_Send_Data(y1 & 0x00ff);
LCD_Send_Data((y2 & (0xff00))>>8);
LCD_Send_Data(y2 & 0x00ff);
{
LCD_Draw_Point(x,y,bkColor);
if(Dx>=0) x++;
else x--;
e+=2*dy;
if(e>=0)
{
if(Dy>=0) y++;
else y--;
}
}
}
}
/*Bresenham算法画圆*/
void LCD_Draw_Circle2(int x,int y,int r,u16 color)
{
int a,b;
int di;
a=0;
b=r;
di=3-(r<<1);//判断下个点位置的标志
while(a<=b)
}
}
}
}
/*利用Bresenham算法画实心圆,缺点画圆速度慢*/
void LCD_Draw_FullCircle2(int Xpos,int Ypos,int Radius,u16 color)
{
int tx=0,ty=Radius,d=3-2*Radius,i;
}
else
{
di +=10+4*(a-b);
mini2440 开发板之 andriod 说明书
mini2440开发板之andriod使用手册潘应云(南京师范大学,panyingyun@,QQ:29548754,848682821)提供第一部分:内核映像及文件系统介绍 (1)第二部分:使用说明 (1)开发平台:RedHat 9.0 + mini2440开发板使用内核版本类型:linux-2.6.25-android-1.0_r1.tar.gz下载地址:/p/android/downloads/list交叉编译器:arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2下载地址:/sgpp/lite/arm/portal/release642或者直接复制下面地址/sgpp/lite/arm/portal/package3686/public/arm-none-eabi/arm-2 008q3-66-arm-none-eabi-i686-pc-linux-gnu.tar.bz2第一部分:内核映像及文件系统介绍1、zImage:andriod内核映像文件。
支持触摸屏(目前没有校屏程序,点击不太准),支持nfs文件系统启动,支持RTC(可以正确显示google时钟),支持DM9000网卡,支持yaffs文件系统,电源管理等。
2、nfs_root_andriod.tar.gz:nfs方式启动文件系统,可以看到很绚丽的google大钟和google浏览器。
3、final_config.rar:内核配置文件(可以自己用命令mv final config .config 放到内核下进行编译)。
(为何不提供yaffs文件系统而采用NFS启动方式:主要原因是mini2440开发板提供的nand flash太小,只有64M空间,这里需要至少80M的空间)第二部分:使用说明(注意:开发环境和redhat9.0系统的安装大家可以参考mini2440开发板手册。
画圆圈的正确方法
画圆圈的正确方法嘿,咱今儿就来唠唠画圆圈的正确方法!你可别小瞧这画圆圈,这里头的门道可多着呢!你想想看,画圆圈就像是一场小小的冒险。
咱得先准备好工具呀,一支顺手的笔那可是相当重要,就好像战士上战场得有把趁手的兵器一样。
然后,深吸一口气,调整好状态,准备开始这场奇妙之旅。
咱先试着轻轻地落笔,就像轻轻地踏上一片未知的土地。
然后,慢慢地开始转动手腕,让笔尖在纸上滑动。
哎呀,这感觉就好像在冰面上滑冰一样,要顺滑,不能卡顿。
要是一卡顿,那这圆圈可就不圆溜啦!你说画个圆圈有啥难的?嘿,那你可就错啦!你看那骑自行车,看起来简单吧,不就是蹬蹬轮子嘛,但真要骑得稳、骑得好,那也得下功夫不是?画圆圈也一样啊!你得掌握好力度,不能太轻也不能太重。
太轻了,那线条都不明显;太重了,又容易把纸划破。
这就跟咱过日子似的,得把握好分寸,才能过得舒坦。
还有啊,画圆圈的时候得有耐心。
别着急,一笔一笔地来,就像盖房子,得一砖一瓦地慢慢垒。
你要是心急火燎地一顿乱画,那能画出个啥好圆圈呀!这耐心啊,就如同那小火慢炖的汤,越炖越有滋味。
咱再想想,画个大大的圆圈和画个小小的圆圈,那能一样吗?肯定不一样呀!就像人有高有矮,各有各的特点。
画大圆圈的时候,手腕得更灵活,活动范围更大;画小圆圈呢,就得更精细,更小心翼翼。
有时候我就在想,这画圆圈是不是就像我们的人生呀。
我们都在努力画好自己的那个圈,有起有伏,有顺利的时候也有遇到困难的时候。
但只要我们坚持不懈,用心去画,总能画出一个让自己满意的圆圈来。
所以啊,别小看这画圆圈,这里面的学问大着呢!咱可得好好琢磨琢磨,怎样才能画出一个完美的圆圈。
下次再拿起笔的时候,你就试着按照我说的这些方法去画,看看是不是能画出更圆更漂亮的圈来。
相信我,只要你用心,一定能做到!。
AI怎么制作圆环呢?AI制作圆环的三种方法
AI怎么制作圆环呢?AI制作圆环的三种⽅法
Adobe illustrator是⼀种应⽤于出版、多媒体和在线图像的⼯业标准⽮量插画的软件,圆环也是在设计中经常⽤到的造型,下⾯教你在AI中制作圆环,⼀起来看看吧!
最终效果图:
步骤:
1、打开AI软件,在软件启动时,请勿进⾏其它操作
2、新建⼀⽂件,在左侧⼯具箱选择”椭圆形⼯具“
3、画两个同⼼圆
(按住shift画第⼀个圆,再同时按住alt键可以画另⼀个圆为同⼼圆)
⽅法1
⽤⿊箭头选择⼩圆形,然后在“对象”--“路径”--“分割下⽅对象“
⿊箭头单击⼩圆形(不要选择到⼤圆形),然后移动出来,圆环就做好了
⽅法2
⽤⿊箭头框选两个圆形,然后在“对象”--“复合路径”--“建⽴“
2、圆环造型就做好了
⿏标右键造型,选择释放复合路径,即可返回原来的造型
⽅法3
在”窗⼝“中调出”路径查找器“
⽤⿊箭头框选两个圆形,点击”路径查找器“的”减去顶层“,圆环造型也可以做出来
以上就是AI制作圆环的三种⽅法介绍,操作很简单的,⼤家学会了吗?希望这篇⽂章能对⼤家有所帮助!相关阅读:。
LCD画点画线画圆画正弦波
LCD12864画点画线画圆画正弦波实际效果图如下:C程序如下:#include<>#include<>#define uchar unsigned char#define uint unsigned int#define LCD P0uchar chip_select=1;bit color=0;sbit e=P2^1;sbit rw=P2^2;sbit rs=P2^3;sbit cs2=P2^4;sbit cs1=P2^5;uchar line=0;uchar select=0;void delay(uint i){while(i--);}/*************************** check busy ************************/ void checkBusy() //检查LCD是否忙{uchar dat;rs=0;//指令操作rw=1;//读出操作do{LCD=0xff;//P0设置为输入e=1;//给使能信号dat=0x80&LCD;//只判断DB7位的状态e=0;}while(dat==0x80);//忙则继续检测}void lcdWrite(bit ml,uchar zifu) {checkBusy();rs=ml;rw=0;P0=zifu;e=1;delay(1);e=0;}void ClearLCD(uchar zifu){uchar i,j;lcdWrite(0,0x3f);cs1=1;cs2=1;for(i=0;i<8;i++){lcdWrite(0,0xb8+i);lcdWrite(0,0xc0);lcdWrite(0,0x40);for(j=0;j<64;j++){lcdWrite(1,zifu);}}}void initLCD() //初始化{cs1=1;cs2=1;lcdWrite(0,0x3e);//关显示lcdWrite(0,0x3f);//开显示ClearLCD(0x0f);//清屏}/*液晶显示函数*//*x和y来控制显示的位置,x为行,y为列,x1和y1为字的像素行数,x2为显示几行,y2为显示几个字数 */void jis(uchar x,uchar y,uchar x1,uchar y1,uchar x2,uchar y2,uchar code *hz) {uchar i,j,k,l,a;lcdWrite(0,0x3f);//开显示for(i=0;i<x2;i++){for(j=0;j<y2;j++){for(k=0;k<x1;k++){lcdWrite(0,0xb8+x+i*x1+k);lcdWrite(0,0xc0);lcdWrite(0,0x40+y+j*y1);a=i*x1*y1*y2+j*x1*y1+k*y1;for(l=0;l<y1;l++){lcdWrite(1,hz[a+l]);}}}}}/***************************** write data ************************/ void WriteData(uchar dsp_data){if(chip_select==1){cs1=1;cs2=0;}else{cs1=0;cs2=1;}checkBusy();lcdWrite(1,dsp_data);}/**************************** read data ***********************/ uchar ReadData(void){uchar dsp_data;checkBusy();LCD=0xFF;if(chip_select==1){cs2=0;cs1=1;}else{cs2=1;cs1=0;}rw=1;rs=1;e=1;e=0;e=1;//E的下降沿,然后E持续拉高读才有效dsp_data=LCD;e=0;return(dsp_data);}uchar j=0,i=0;uchar r=32;uchar code hz[]={0x20,0x30,0xAC,0x63,0x10,0x00,0x40,0x20,0x58,0x47,0x44,0x48,0x50,0x20,0x 20,0x00,0x22,0x23,0x22,0x12,0x12,0x00,0x42,0x62,0x5A,0x46,0x42,0x42,0x52,0xE2,0x 42,0x00,/*"绘",0*/0x00,0xFE,0x42,0x42,0x22,0x1E,0xAA,0x4A,0xAA,0x9A,0x0A,0x02,0x02,0xFE,0x 00,0x00,0x00,0xFF,0x42,0x42,0x41,0x41,0x48,0x72,0x54,0x40,0x41,0x43,0x41,0xFF,0x 00,0x00,/*"图",1*/0x10,0x21,0x86,0x60,0x00,0x0C,0xD4,0x54,0x55,0xF6,0x54,0x54,0xD4,0x0C,0x 04,0x00,0x04,0xFC,0x03,0x00,0x00,0x00,0x8F,0x69,0x09,0x0F,0x09,0x29,0xCF,0x00,0x 00,0x00,/*"演",2*/0x00,0x20,0x20,0x22,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x22,0x22,0x20,0x 20,0x00,0x10,0x08,0x04,0x03,0x00,0x40,0x80,0x7F,0x00,0x00,0x01,0x02,0x0C,0x18,0x 00,0x00,/*"示",3*/};/***********************在LCD上任意坐标画点********************************/void DrawPoint(uchar X,uchar Y,uchar Type){//X,Y化点的坐标Type画点的类型:2反相点,0檫除点,1画点uchar DX = (Y >> 3);//计算出属于哪个字节uchar BX = Y - (DX << 3);//计算出属于字节哪一位uchar TempData = 0;if (X > 63){chip_select=2;X -= 64;}else{chip_select=1;}lcdWrite(0,0xb8+DX);//设行地址lcdWrite(0,0x40+X);//设列地址TempData = ReadData();//读出所画点所在字节的内容switch (Type) //对该字节进行相应操作{case 0:TempData &= ~(1<<BX);//擦除break;case 1:TempData |= (1 << BX);//画点break;case 2:TempData ^= (1 << BX);//反相break;}lcdWrite(0,0xb8+DX);//设行地址lcdWrite(0,0x40+X);//设列地址WriteData(TempData);//把修改后的字节送回LCD,达到画点目的}/********插值法画任意两点之间直线的函数,函数中只用加减法,程序运行效率很高**********/DrawLine(uchar x1,uchar y1,uchar x2,uchar y2) {//x1,y1起点坐标;x2,y2终点坐标;uchar x,y;uchar d_x,d_y;char err=0;uchar temp=0;if(y2<y1){x=x1;y=y1;x1=x2;y1=y2;x2=x;y2=y;}d_y=y2-y1;if (d_y==0){if (x1>x2){x=x1;x1=x2;x2=x;}for ( x=x1;x<=x2;x++ ) DrawPoint(x,y1,1); }else{if(x2>=x1){temp=1;d_x=x2-x1;}else d_x=x1-x2;x=x1;y=y1;DrawPoint(x,y,1);if(temp&&(d_y<=d_x))while(x!=x2){if(err<0){x=x+1;err=err+(y2-y);}else{x=x+1;y=y+1;err=err+(y2-y)-(x2-x);}DrawPoint(x,y,1);}else if(temp&&(d_y>d_x)) while(y!=y2){d_x=x2-x;d_y=y2-y;if(err<0){x=x+1;y=y+1;err=err+d_y-d_x;}else{y=y+1;err=err-d_x;}DrawPoint(x,y,1);}else if(!temp&&(d_y<=d_x)) while(x!=x2){d_x=x-x2;d_y=y2-y;if(err<0){x=x-1;err=err+d_y;}else{x=x-1;y=y+1;err=err+d_y-d_x;}DrawPoint(x,y,1);}else if(!temp &&(d_y>d_x)) while(y!=y2){d_x=x-x2;d_y=y2-y;if(err<0){x=x-1;y=y+1;err=err+d_y-d_x;}else{y=y+1;err=err-d_x;}DrawPoint(x,y,1);}}}/*********************************************************************** /void DrawLevel(void){for(i=0;i<127;i++){DrawPoint(i,32,1);}//画水平直线}/*********************************************************************** *************/void DrawSineWave(void){uchar xn=0;uchar yn=32;uchar i;uchar xi,yi;for(i=0;i<127;i++){xi=i;yi=(sin(i**32)+32;DrawLine(xn,yn,xi,yi);//在一系列零散的点上,两点两点之间连线,从而得到一条曲线xn=i;yn=yi;}}/*********************************************************************** **************/void DrawCircle(uchar x0,uchar y0,uchar r)//x0,y0为圆心坐标,r为圆半径{uchar xn,yn,xi,yi;unsigned int j;xn=cos(0)*r+x0;yn=sin(0)*r+y0;for(j=0;j<630;j++){xi=(cos(j**r)+x0;yi=(sin(j**r)+y0;DrawLine(xn,yn,xi,yi);//在一系列零散的点上,两点两点之间连线,从而得到一条曲线xn=xi;yn=yi;}}/*********************************************************************** ***************************/void DrawRetic(uchar x0,uchar y0,uchar x1,uchar y1)//画正方形,x0,y0为左上角坐标,x1,y1为右下角坐标{DrawLine(x0,y0,x1,y0);DrawLine(x0,y0,x0,y1);DrawLine(x1,y0,x1,y1);DrawLine(x0,y1,x1,y1);/* uchar i;for(i=0;i<=x1-x0;i++){DrawPoint(x0+i,y0,1);DrawPoint(x0+i,y1,1);}for(i=0;i<=y1-y0;i++){DrawPoint(x0,y0+i,1);DrawPoint(x1,y0+i,1);}*/}/*********************************************************************** ***************************/void DrawTrigle(uchar x1,uchar y1,uchar x2,uchar y2,uchar x3,uchar y3)//画三角形,三个坐标为三角形顶点{DrawLine(x1,y1,x2,y2);DrawLine(x2,y2,x3,y3);DrawLine(x1,y1,x3,y3);}/******************************** main **********************************************************/void main(void){initLCD();while(1){ClearLCD(0x00);cs1=1;cs2=0;jis(0,32,2,16,1,2,hz);cs1=0;cs2=1;jis(0,0,2,16,1,2,hz+2*32);DrawLine(0,63,127,0);DrawRetic(10,10,100,50);DrawTrigle(63,17,20,60,100,60);DrawLevel();DrawSineWave();DrawCircle(63,32,r);r-=4;if (r<8){r=32;}}}。
lcd画圆函数
lcd画圆函数LCD(液晶显示器)是一种广泛应用于电子设备中的显示技术,它能够以高清的图像和色彩还原度来呈现各种信息。
在LCD中,画圆函数是一种重要的图形绘制函数,它能够通过数学计算和像素点的显示来实现圆形图案的绘制。
本文将详细介绍LCD画圆函数的原理和实现方法。
一、LCD的工作原理我们需要了解LCD的工作原理。
LCD是通过光学效应来显示图像的,其核心是液晶材料。
液晶材料是一种介于液体和固体之间的物质,其分子在电场作用下可以改变排列状态,从而实现光的透过和阻挡。
LCD显示器由液晶层、偏振片、玻璃基板等组成,当电流通过液晶层时,液晶分子排列发生变化,从而改变光的透过程度,进而实现图像的显示。
二、画圆函数的原理在LCD中,画圆函数是通过计算每个像素点与圆心的距离来确定该点是否属于圆的范围,从而实现圆形图案的绘制。
画圆函数的原理主要包括以下几个步骤:1. 确定圆心和半径:根据需求确定圆心的坐标和半径的大小。
2. 计算像素点与圆心的距离:对于每个像素点,通过计算它与圆心的距离来判断它是否在圆的范围内。
距离的计算可以使用勾股定理来进行,即根据像素点的坐标和圆心的坐标计算两点之间的距离。
3. 判断像素点是否属于圆的范围:根据像素点与圆心的距离和半径的关系,来确定该像素点是否在圆的范围内。
如果距离小于半径,则该点属于圆的范围内。
4. 绘制圆形图案:对于属于圆的范围内的像素点,可以通过改变液晶分子的排列状态来达到显示的效果,从而绘制出圆形图案。
三、实现方法在LCD中,实现画圆函数有多种方法,常用的方法有中点画圆法和Bresenham画圆法。
这两种方法都是通过计算像素点与圆心的距离来确定像素点是否在圆的范围内。
1. 中点画圆法:中点画圆法是一种简单且高效的画圆方法,它通过计算像素点与圆心的距离和一个中点的位置来判断像素点是否在圆的范围内。
该方法适用于任意半径的圆绘制。
2. Bresenham画圆法:Bresenham画圆法是一种更加精确的画圆方法,它通过计算一个误差值来判断像素点是否在圆的范围内。
数学画圆的四个步骤
数学画圆的四个步骤
画圆是数学中的基本操作之一,它在几何学、物理学、工程学等领域都有广泛的应用。
下面将介绍以数学画圆的四个步骤。
第一步:确定圆心和半径
画圆的第一步是确定圆心和半径。
圆心是圆的中心点,半径是从圆心到圆周上任意一点的距离。
在平面直角坐标系中,圆心的坐标可以表示为(x,y),半径可以表示为r。
如果已知圆心和半径,可以用公式(x-a)²+(y-b)²=r²来表示圆的方程。
第二步:确定圆周上的点
画圆的第二步是确定圆周上的点。
圆周上的点可以用参数方程表示,即x=a+rcosθ,y=b+rsinθ,其中θ是圆周上的任意一个角度,a和b是圆心的坐标,r是半径。
当θ从0到2π时,圆周上的点可以被完整地表示出来。
第三步:绘制圆周上的点
画圆的第三步是绘制圆周上的点。
可以用直尺和圆规来绘制圆周上的点。
首先用直尺连接圆心和圆周上的任意一点,然后用圆规以圆心为中心,半径为圆周上的点到圆心的距离,画一个圆弧,这个圆弧与圆周相交的点就是圆周上的另一个点。
重复这个过程,就可以绘制出整个圆周。
第四步:填充圆内部
画圆的最后一步是填充圆内部。
可以用颜色或图案来填充圆内部,使圆更加鲜明。
填充圆内部的方法有很多种,可以用铅笔、彩笔、水彩等工具来完成。
总结
以上就是以数学画圆的四个步骤。
画圆是数学中的基本操作之一,掌握了这四个步骤,就可以轻松地画出一个完美的圆。
在实际应用中,画圆的方法还有很多种,需要根据具体情况选择合适的方法。
C51编程液晶上画圆
C51编程液晶上画圆.txt41滴水能穿石,只因为它永远打击同一点。
42火柴如果躲避燃烧的痛苦,它的一生都将黯淡无光。
C51编程:液晶上画圆的程序终于出来了,请大虾们帮我看看能否再简化一下。
谢谢! [xiaoqi.] [96次] 01-5-22 下午 11:56:31/************************************************//*画圆。
数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2 *//************************************************///col,row为全局变量void circle(Uchar Ox,Uchar Oy,Uchar Rx){unsigned int xx,rr,xt,yt,rs;yt=Rx;rr=Rx*Rx;rs=Rx*71/100; //分开1/8圆弧来画,0.71=根号2for (xt=0;xt<=rs;xt++){xx=xt*xt;while ((yt*yt)>(rr-xx))yt--;col=Ox+xt; //第一象限row=Oy-yt;point();col=Ox-xt; //第二象限row=Oy-yt;point();col=Ox-xt; //第三象限row=Oy+yt;point();col=Ox+xt; //第四象限row=Oy+yt;point();/***************45度镜象变换,画另一半***************/col=Ox+yt; //第一象限row=Oy-xt;point();col=Ox-yt; //第二象限row=Oy-xt;point();col=Ox-yt; //第三象限row=Oy+xt;point();col=Ox+yt; //第四象限row=Oy+xt;point();}}怕是很难精简了! [lwd110] [7次] 01-5-23 上午 11:55:08要么在一个point()中画8个点,节约一点函数调用时间?简化了一次,目标代码短了200字节左右。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#define GLOBAL_CLK 1
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
/*
*#define LCD_W35
*
*#elif defined(LCD_W35)
*
*#define LCD_WIDTH 320 宽//在option.h文件里面有他们的定义
*#define LCD_HEIGHT 240 高
*#define LCD_PIXCLOCK 4 时钟参数
*#define LCD_RIGHT_MARGIN 0x44 右边沿
*#define LCD_LEFT_MARGIN 0x04 左边沿
*#define LCD_HSYNC_LEN 0x01 行无效脉冲宽度
*#define LCD_UPPER_MARGIN 10 上边沿
*#define LCD_LOWER_MARGIN 4 下边沿
*#define LCD_VSYNC_LEN 1 列无效脉冲宽度
*#define LCD_CON5 ((1<<11) | (1<<8) | (1<<9) | (1<<0) )
*/
unsigned int lcd_buf[LCD_HEIGHT][LCD_WIDTH]; //24bpp,定义为(unsigned int)32位
void delay(unsigned int times);
void lcd_init(void);
void lcd_brush_background(unsigned int color);
void lcd_draw_circle(unsigned int color, unsigned int radius);
int Main(void)
{
lcd_init();
while (1)
{
lcd_brush_background(0xffffff); //白
delay(3000);
lcd_draw_circle(0x0000ff, 80);
delay(10000);
lcd_brush_background(0x0000ff); //蓝
delay(3000);
lcd_draw_circle(0x00ff00, 80);
delay(10000);
lcd_brush_background(0x00ff00); //绿
delay(3000);
lcd_draw_circle(0xff0000, 80);
delay(10000);
lcd_brush_background(0xff0000); //红
delay(3000);
lcd_draw_circle(0x000000, 80);
delay(10000);
lcd_brush_background(0x000000); //黑
delay(3000);
lcd_draw_circle(0xffffff, 80);
delay(10000);
}
return 0;
}
void delay(unsigned int times)
{
int i;
for (;times > 0; times--)
for (i = 0; i < 400; i++)
;
}
void lcd_init(void)
{
rGPCCON = 0xaaaa02a9; //管脚配置用于LCD
rGPCUP = 0xffffffff;
rGPDCON = 0xaaaaaaaa;
rGPDUP = 0xffffffff;
rGPGCON |= (0x3<<8); //设置GPG4为LCD_PWREN rGPGUP |= (0x1<<4);
rGPGDAT |= (0x1<<4);
rLCDCON1 = (LCD_PIXCLOCK<<8) | (0x3<<5) | (0xd<<1); //设置时钟、LCD类型为TFT、24bpp
rLCDCON2 = (LCD_UPPER_MARGIN<<24) | ((LCD_HEIGHT - 1)<<14) | (LCD_LOWER_MARGIN<<6) | (LCD_VSYNC_LEN);
rLCDCON3 = (LCD_RIGHT_MARGIN<<19) | ((LCD_WIDTH - 1)<<8) | (LCD_LEFT_MARGIN);
rLCDCON4 = LCD_HSYNC_LEN;
rLCDCON5 = 0x0308;
rLCDSADDR1 = (((unsigned int)lcd_buf>>22)<<21) | ((0x1fffff) & ((unsigned int)lcd_buf>>1));
rLCDSADDR2 = 0x1fffff & (((unsigned int)lcd_buf + (LCD_WIDTH * LCD_HEIGHT * 4))>>1);
rLCDSADDR3 = LCD_WIDTH * 32 / 16;
rLCDINTMSK |= 0x3;
rTCONSEL = 0;
rLCDCON5 = rLCDCON5 & (~(1<<3)) | (1<<3); //有效PWREN信号
rLCDCON5 = rLCDCON5 & (~(1<<5)) | (0<<5); //PWREN信号极性不翻转
rLCDCON1 |= 0x1; //开启LCD
}
void lcd_brush_background(unsigned int color)
{
int x, y;
for (x = 0; x < LCD_HEIGHT; x++)
{
for (y = 0; y < LCD_WIDTH; y++)
{
lcd_buf[x][y] = color;
}
}
}
void lcd_draw_circle(unsigned int color, unsigned int radius) {
unsigned int x, y;
unsigned int sqr = radius * radius;
for (x = 0; x < LCD_WIDTH; x++)
{
for (y = 0; y < LCD_HEIGHT; y++)
{
if (((x-120)*(x-120) + (y-160)*(y-160)) <= sqr)
{
lcd_buf[x][y] = color;
}
}
}
}。