• [51单片机] TFT2.4彩屏3 [自制动画效果-滑块+吊钩]


    >_<:引脚和前面几个连接一样,这里做了一个实用的动画效果,模拟起重机的2维视图。

     1 #ifndef __ILI9325_H__
     2 #define __ILI9325_H__
     3 
     4 void ILI9325_Initial(void);
     5 void Write_Cmd_Data(unsigned char x, unsigned int y);
     6 void Write_Cmd(unsigned char DH,unsigned char DL);
     7 void Write_Data(unsigned char DH,unsigned char DL);
     8 void delayms(unsigned int tt);
     9 void  Write_Data_U16(unsigned int y);
    10 static void LCD_SetPos(unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1);
    11 void CLR_Screen(unsigned int bColor);
    12 void Put_pixel(unsigned char x,unsigned char y,unsigned int color);
    13 void Line(unsigned int X0,
    14         unsigned int Y0,
    15         unsigned int X1,
    16         unsigned int Y1,
    17             unsigned int color);
    18 void Rectangle(unsigned int left,
    19                 unsigned int top,
    20                 unsigned int right,
    21                 unsigned int bottom,
    22                 unsigned int color);                
    23 #endif
    9325tp.h
      1 /*----------------------------------------------------------------
      2 320x240彩屏液晶驱动程序
      3 ----------------------------------------------------------------*/
      4 #include"9325tp.h"
      5 #include"reg52.h"
      6 /*----------------------------------------------------------------
      7 全局变量
      8 ----------------------------------------------------------------*/
      9 #define WINDOW_XADDR_START    0x0050 // Horizontal Start Address Set
     10 #define WINDOW_XADDR_END    0x0051 // Horizontal End Address Set
     11 #define WINDOW_YADDR_START    0x0052 // Vertical Start Address Set
     12 #define WINDOW_YADDR_END    0x0053 // Vertical End Address Set
     13 #define GRAM_XADDR            0x0020 // GRAM Horizontal Address Set
     14 #define GRAM_YADDR            0x0021 // GRAM Vertical Address Set
     15 #define GRAMWR                 0x0022 // memory write
     16 
     17 #define DataPort P0                //数据口使用DataPort
     18 
     19 /*----------------------------------------------------------------
     20 定义硬件端口
     21 ----------------------------------------------------------------*/
     22 sbit CS=P2^2;        //片选
     23 sbit RES=P2^1;        //复位
     24 sbit RS=P2^4;        //数据/命令选择
     25 sbit RW=P2^5;
     26 /*----------------------------------------------------------------
     27 清屏函数
     28 输入参数:bColor 清屏所使用的背景色
     29 ----------------------------------------------------------------*/
     30 void CLR_Screen(unsigned int bColor)
     31 {
     32     unsigned int i,j;
     33     LCD_SetPos(0,240,0,320);//320x240
     34     for (i=0;i<320;i++)
     35     {
     36         
     37         for (j=0;j<240;j++)
     38             Write_Data_U16(bColor);
     39         
     40     }
     41 }
     42 /*----------------------------------------------------------------
     43 写命令、写数据
     44 输入参数:x 需要输入的命令 16位
     45 y 需要输入的数据 16位
     46 ----------------------------------------------------------------*/
     47 void  Write_Cmd_Data (unsigned char x,unsigned int y)
     48 {
     49     unsigned char m,n;
     50     m=y>>8;
     51     n=y;
     52     Write_Cmd(0x00,x);
     53     Write_Data(m,n);
     54     
     55 }
     56 
     57 /*----------------------------------------------------------------
     58 写16位数据
     59 ----------------------------------------------------------------*/
     60 void  Write_Data_U16(unsigned int y)
     61 {
     62     unsigned char m,n;
     63     m=y>>8;
     64     n=y;
     65     Write_Data(m,n);
     66     
     67 }
     68 /*----------------------------------------------------------------
     69 写命令
     70 ----------------------------------------------------------------*/
     71 
     72 void Write_Cmd(unsigned char DH,unsigned char DL)
     73 {
     74     CS=0;
     75     RS=0;
     76     
     77     DataPort=DH;
     78     RW=0;
     79     RW=1;
     80     
     81     DataPort=DL;
     82     
     83     RW=0;
     84     RW=1;
     85     CS=1;
     86 }
     87 
     88 /*----------------------------------------------------------------
     89 写数据 双8位
     90 ----------------------------------------------------------------*/
     91 void Write_Data(unsigned char DH,unsigned char DL)
     92 {
     93     
     94     CS=0;
     95     
     96     RS=1;
     97     DataPort=DH;
     98     RW=0;
     99     RW=1;
    100     
    101     DataPort=DL;    
    102     RW=0;
    103     RW=1;
    104     CS=1;
    105 }
    106 /*----------------------------------------------------------------
    107 延时函数
    108 ----------------------------------------------------------------*/
    109 void delayms(unsigned int count)
    110 {
    111     int i,j;                                                                                
    112     for(i=0;i<count;i++)                                                                    
    113     {
    114         for(j=0;j<260;j++);
    115     }                                                                                     
    116 }
    117 /*----------------------------------------------------------------
    118 液晶初始化
    119 ----------------------------------------------------------------*/
    120 void ILI9325_Initial(void)
    121 { 
    122     CS=1;
    123     delayms(5);
    124     RES=0;
    125     delayms(5);
    126     RES=1;
    127     delayms(50);
    128     Write_Cmd_Data(0x0001,0x0100); 
    129     Write_Cmd_Data(0x0002,0x0700); 
    130     Write_Cmd_Data(0x0003,0x1030); 
    131     Write_Cmd_Data(0x0004,0x0000); 
    132     Write_Cmd_Data(0x0008,0x0207);  
    133     Write_Cmd_Data(0x0009,0x0000);
    134     Write_Cmd_Data(0x000A,0x0000); 
    135     Write_Cmd_Data(0x000C,0x0000); 
    136     Write_Cmd_Data(0x000D,0x0000);
    137     Write_Cmd_Data(0x000F,0x0000);
    138     //power on sequence VGHVGL
    139     Write_Cmd_Data(0x0010,0x0000);   
    140     Write_Cmd_Data(0x0011,0x0007);  
    141     Write_Cmd_Data(0x0012,0x0000);  
    142     Write_Cmd_Data(0x0013,0x0000); 
    143     //vgh 
    144     Write_Cmd_Data(0x0010,0x1290);   
    145     Write_Cmd_Data(0x0011,0x0227);
    146     //delayms(100);
    147     //vregiout 
    148     Write_Cmd_Data(0x0012,0x001d); //0x001b
    149     //delayms(100); 
    150     //vom amplitude
    151     Write_Cmd_Data(0x0013,0x1500);
    152     //delayms(100); 
    153     //vom H
    154     Write_Cmd_Data(0x0029,0x0018); 
    155     Write_Cmd_Data(0x002B,0x000D); 
    156     
    157     //gamma
    158     Write_Cmd_Data(0x0030,0x0004);
    159     Write_Cmd_Data(0x0031,0x0307);
    160     Write_Cmd_Data(0x0032,0x0002);// 0006
    161     Write_Cmd_Data(0x0035,0x0206);
    162     Write_Cmd_Data(0x0036,0x0408);
    163     Write_Cmd_Data(0x0037,0x0507); 
    164     Write_Cmd_Data(0x0038,0x0204);//0200
    165     Write_Cmd_Data(0x0039,0x0707); 
    166     Write_Cmd_Data(0x003C,0x0405);// 0504
    167     Write_Cmd_Data(0x003D,0x0F02); 
    168     //ram
    169     Write_Cmd_Data(0x0050,0x0000); 
    170     Write_Cmd_Data(0x0051,0x00EF);
    171     Write_Cmd_Data(0x0052,0x0000); 
    172     Write_Cmd_Data(0x0053,0x013F);  
    173     Write_Cmd_Data(0x0060,0xA700); 
    174     Write_Cmd_Data(0x0061,0x0001); 
    175     Write_Cmd_Data(0x006A,0x0000); 
    176     //
    177     Write_Cmd_Data(0x0080,0x0000); 
    178     Write_Cmd_Data(0x0081,0x0000); 
    179     Write_Cmd_Data(0x0082,0x0000); 
    180     Write_Cmd_Data(0x0083,0x0000); 
    181     Write_Cmd_Data(0x0084,0x0000); 
    182     Write_Cmd_Data(0x0085,0x0000); 
    183     //
    184     Write_Cmd_Data(0x0090,0x0010); 
    185     Write_Cmd_Data(0x0092,0x0600); 
    186     Write_Cmd_Data(0x0093,0x0003); 
    187     Write_Cmd_Data(0x0095,0x0110); 
    188     Write_Cmd_Data(0x0097,0x0000); 
    189     Write_Cmd_Data(0x0098,0x0000);
    190     Write_Cmd_Data(0x0007,0x0133);
    191     
    192     
    193     
    194     //    Write_Cmd_Data(0x0022);//        
    195 }
    196 /*----------------------------------------------------------------
    197 画点
    198 输入参数:x,y 需要画点坐标
    199 color 点的颜色
    200 ----------------------------------------------------------------*/
    201 void Put_pixel(unsigned char x,unsigned char y,unsigned int color)
    202 {
    203     LCD_SetPos(x,x,y,y);
    204     Write_Data_U16(color);
    205 }
    206 /*----------------------------------------------------------------
    207 设置坐标
    208 ----------------------------------------------------------------*/
    209 static void LCD_SetPos(unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1)
    210 {
    211     Write_Cmd_Data(WINDOW_XADDR_START,x0);
    212     Write_Cmd_Data(WINDOW_XADDR_END,x1);
    213     Write_Cmd_Data(WINDOW_YADDR_START,y0);
    214     Write_Cmd_Data(WINDOW_YADDR_END,y1);
    215     Write_Cmd_Data(GRAM_XADDR,x0);
    216     Write_Cmd_Data(GRAM_YADDR,y0);
    217     Write_Cmd (0x00,0x22);//LCD_WriteCMD(GRAMWR);
    218 }
    219 /*----------------------------------------------------------------
    220 在屏幕上画线
    221 输入参数:  起始坐标X0,Y0,终止坐标X1,Y1
    222 color 线颜色
    223 ----------------------------------------------------------------*/ 
    224 void Line(unsigned int X0,
    225           unsigned int Y0,
    226           unsigned int X1,
    227           unsigned int Y1,
    228           unsigned int color)
    229 {
    230     int dx = X1 - X0;
    231     int dy = Y1 - Y0;
    232     int P  = 2 * dy - dx;
    233     int dobDy = 2 * dy;
    234     int dobD = 2 * (dy - dx);
    235     int PointX = 0,PointY = 0;
    236     int incx = 0,incy = 0;
    237     int distance = 0,xerr = 0,yerr = 0;
    238     unsigned int i = 0;
    239     
    240     if(dx == 0)        //k=1斜率为1
    241     {
    242         PointX = X0;
    243         if(Y0 < Y1)
    244         {
    245             PointY = Y0;
    246         }
    247         else
    248         {
    249             PointY = Y1;
    250         }
    251         for(i = 0;i <= ((Y0<Y1) ? (Y1-Y0) : (Y0-Y1));i++)
    252         {
    253             
    254             Put_pixel(PointX,PointY,color);
    255             PointY++;
    256         }
    257         return;
    258     }
    259     if(dy == 0)        //k=0斜率为0
    260     {
    261         PointY = Y0;
    262         if(X0 < X1)
    263         {
    264             PointX = X0;
    265         }
    266         else
    267         {
    268             PointX = X1;
    269         }
    270         for(i = 0;i <= ((X0<X1) ? (X1-X0) : (X0-X1));i++)
    271         {
    272             
    273             Put_pixel(PointX,PointY,color);
    274             PointX++;
    275         }
    276         return;
    277     }
    278     
    279     if(dx > 0)
    280         incx = 1;
    281     else if(dx == 0)
    282         incx = 0;
    283     else
    284         incx = -1;
    285     
    286     if(dy > 0)
    287         incy = 1;
    288     else if(dy == 0)
    289         incy = 0;
    290     else
    291         incy = -1;
    292     
    293     dx = ((X0>X1) ? (X0-X1) : (X1-X0));
    294     dy = ((Y0>Y1) ? (Y0-Y1) : (Y1-Y0));
    295     
    296     if(dx>dy) distance=dx;
    297     else distance=dy;
    298     
    299     PointX = X0;
    300     PointY = Y0;
    301     for(i=0;i<=distance+1;i++)
    302     {
    303         
    304         Put_pixel(PointX,PointY,color);
    305         xerr+=dx;
    306         yerr+=dy;
    307         if(xerr>distance)
    308         {
    309             xerr-=distance;
    310             PointX+=incx;
    311         }
    312         if(yerr>distance)
    313         {
    314             yerr-=distance;
    315             PointY+=incy;
    316         }
    317     }
    318 }
    319 /*---------------------------------------------------------------------------
    320 绘制矩形框
    321 输入参数:矩形的起始位置left,top 
    322 矩形的结束位置right,bottom 
    323 矩形框的颜色color
    324 -----------------------------------------------------------------------------*/
    325 void Rectangle(unsigned int left,
    326   unsigned int top,
    327   unsigned int right,
    328   unsigned int bottom,
    329   unsigned int color)
    330 {
    331   Line(left,top,right,top,color);
    332   Line(left,top,left,bottom,color);
    333   Line(right,top,right,bottom,color);
    334   Line(left,bottom,right,bottom,color);
    335 }
    9325tp.c
      1 #include<reg52.h>
      2 #include"9325tp.h"
      3 
      4 /////////////////////////////////////////////////////////////////////////////////
      5 /* LCD color */
      6 #define White          0xFFFF
      7 #define Black          0x0000
      8 #define Blue           0x001F
      9 #define Red            0xF800
     10 //#define Blue2          0x051F
     11 //#define Magenta        0xF81F
     12 //#define Green          0x07E0
     13 //#define Cyan           0x7FFF
     14 //#define Yellow         0xFFE0
     15 
     16 unsigned char b_x,b_y,b_l,b_w;
     17 unsigned char m_x,m_old_x,m_y,m_l,m_w,m_v,m_a,m_l_limit_p,m_r_limit_p;
     18 unsigned char s_y,s_old_y,s_extre_part,s_v,s_a,s_u_limit_p,s_d_limit_p;
     19 
     20 unsigned char h_x,h_y,h_w;
     21 unsigned char move_x_v,move_y_v,move_a;
     22 unsigned char line_x,line_old_x,line_y,line_l,line_old_l;
     23 //--------------------------------------------------------------
     24 void init1()
     25 {
     26     b_x=10,b_y=20,b_l=80,b_w=220;
     27     m_x=m_old_x=40,m_y=10,m_l=100,m_w=70,m_v=5,m_a=0,m_l_limit_p=40,m_r_limit_p=b_x+b_w-m_l_limit_p;
     28     s_y=s_old_y=80,s_extre_part=10,s_v=1,s_a=0,s_u_limit_p=b_y+10,s_d_limit_p=b_y+b_l-10;
     29 }
     30 //---------------------------Draw-------------------------------
     31 void drawBig()
     32 {
     33     Line(b_x,b_y,b_x+b_w,b_y,Black);
     34     Line(b_x,b_y+b_l,b_x+b_w,b_y+b_l,Black);
     35 }//主梁画
     36 void drawMiddle()
     37 {
     38     if(m_x!=m_old_x)Line(m_old_x,m_y,m_old_x,m_y+m_l,White);
     39     Line(m_x,m_y,m_x,m_y+m_l,Blue);
     40     if(m_x!=m_old_x)Line(m_old_x+m_w,m_y,m_old_x+m_w,m_y+m_l,White);
     41     Line(m_x+m_w,m_y,m_x+m_w,m_y+m_l,Blue);
     42 }//画横梁
     43 void drawSmall()
     44 {
     45     if(s_old_y!=s_y || m_x!=m_old_x)Line(m_old_x-s_extre_part,s_old_y,m_old_x+m_w+s_extre_part,s_old_y,White);
     46     Line(m_x-s_extre_part,s_y,m_x+m_w+s_extre_part,s_y,Red);
     47 }//画小车
     48 void draw1()
     49 {
     50     drawBig();//画主梁
     51     drawMiddle();//画横梁
     52     drawSmall();//画小车
     53 }//总画函数
     54 //----------------------------run-----------------------------
     55 void runMiddle()
     56 {
     57     m_old_x=m_x;
     58     m_x+=m_v;
     59     if(m_x+m_w>=m_r_limit_p || m_x<=m_l_limit_p)m_v*=-1;//达到警戒线
     60 }//横梁移动
     61 void runSmall()
     62 {
     63     s_old_y=s_y;
     64     line_old_x=line_x;
     65     s_y+=s_v;
     66     line_x+=move_x_v;
     67     if(s_y>=s_d_limit_p || s_y<=s_u_limit_p){
     68         s_v*=-1;
     69         move_x_v*=-1;
     70     }//达到警戒线
     71 }//小车移动
     72 void run1()
     73 {
     74     runMiddle();
     75     runSmall();
     76 }//运动函数
     77 /////////////////////////////////////////////////////////////////////////////////
     78 
     79 
     80 void init2()
     81 {
     82     h_x=10,h_y=180,h_w=220;
     83     move_x_v=s_v*11/4,move_y_v=2,move_a=0;
     84     line_x=line_old_x=160,line_y=h_y+3,line_l=line_old_l=50;
     85 }
     86 //-------------------------draw--------------------------------
     87 void drawGou()
     88 {
     89     if(line_old_x!=line_x || line_old_l!=line_old_l){
     90         Rectangle(line_old_x-3,line_y+line_old_l,line_old_x+3,line_y+line_old_l+6,White);
     91         Line(line_old_x,line_y+line_old_l+6,line_old_x,line_y+line_old_l+9,White);
     92         Line(line_old_x,line_y+line_old_l+9,line_old_x+6,line_y+line_old_l+9,White);
     93         Line(line_old_x+6,line_y+line_old_l+9,line_old_x+6,line_y+line_old_l+15,White);
     94         Line(line_old_x+6,line_y+line_old_l+15,line_old_x-6,line_y+line_old_l+15,White);
     95         Line(line_old_x-6,line_y+line_old_l+15,line_old_x-6,line_y+line_old_l+12,White);
     96     }
     97     Rectangle(line_x-3,line_y+line_l,line_x+3,line_y+line_l+6,Blue);
     98     Line(line_x,line_y+line_l+6,line_x,line_y+line_l+9,Black);
     99     Line(line_x,line_y+line_l+9,line_x+6,line_y+line_l+9,Black);
    100     Line(line_x+6,line_y+line_l+9,line_x+6,line_y+line_l+15,Black);
    101     Line(line_x+6,line_y+line_l+15,line_x-6,line_y+line_l+15,Black);
    102     Line(line_x-6,line_y+line_l+15,line_x-6,line_y+line_l+12,Black);    
    103 }//画勾,x,y为绳的下端,r为大小
    104 void drawH()
    105 {
    106     Line(h_x,h_y,h_x+h_w,h_y,Black);
    107 }//画横梁
    108 void drawHuaKuai()
    109 {
    110     if(line_old_x!=line_x)Rectangle(line_old_x-6*3/4,line_y-6,line_old_x+6*3/4,line_y,White);
    111     Rectangle(line_x-6*3/4,line_y-6,line_x+6*3/4,line_y,Blue);
    112 }//画滑块,x,y为绳的上端,r为大小
    113 void drawLine()
    114 {
    115     if(line_old_l!=line_l || line_x!=line_old_x)Line(line_old_x,line_y,line_old_x,line_y+line_old_l,White);
    116     Line(line_x,line_y,line_x,line_y+line_l,Black);
    117 }//画线
    118 void draw2()
    119 {
    120     drawH();
    121     drawHuaKuai();
    122     drawLine();
    123     drawGou();
    124 }
    125 //------------------------run-------------------------------
    126 main()
    127 {
    128     ILI9325_Initial(); //初始化LCD
    129     CLR_Screen(White); //用背景色清屏
    130     init1();//初始化1画面
    131     init2();//初始化2画面
    132     while(1)
    133     {
    134         run1();
    135         draw1();
    136         draw2();
    137     }
    138 }
  • 相关阅读:
    import()函数
    node-sass安装报错
    npm 安装扩展模块时,因缓存报错的问题汇总
    测试
    export default 和 export 区别
    正则
    物联网
    第十二次课堂总结
    第十二次作业
    作业10
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/3649370.html
Copyright © 2020-2023  润新知