stm32 驱动 TFT LCD
时间:11-26
来源:互联网
点击:
| 577 | //清屏函数 |
| 578 | //Color:要清屏的填充色 |
| 579 | voidLCD_Clear(u16 Color) |
| 580 | { |
| 581 | u32 index=0; |
| 582 | LCD_SetCursor(0x00,0x0000);//设置光标位置 |
| 583 | LCD_WriteRAM_Prepare();//开始写入GRAM |
| 584 | for(index=0;index<76800;index++) |
| 585 | { |
| 586 | LCD_WR_DATA(Color);//向每个GRAM写入数据 |
| 587 | } |
| 588 | } |
| 589 |
| 590 | //在指定区域内填充指定颜色 |
| 591 | //区域大小: |
| 592 | // (xend-xsta)*(yend-ysta) |
| 593 | voidLCD_Fill(u8 xsta,u16 ysta,u8 xend,u16 yend,u16 color) |
| 594 | { |
| 595 |
| 596 | #if USE_HORIZONTAL //横屏 |
| 597 |
| 598 | u16 colortemp=POINT_COLOR; |
| 599 | u16 ytemp=ysta; |
| 600 | POINT_COLOR=color; |
| 601 | for(;xsta<=xend;xsta++) |
| 602 | { |
| 603 | for(;ysta<=yend;ysta++)LCD_DrawPoint(xsta,ysta); |
| 604 | ysta=ytemp; |
| 605 | } |
| 606 | POINT_COLOR=colortemp; |
| 607 |
| 608 | #else //竖屏 |
| 609 |
| 610 | u32 n; |
| 611 | //设置窗口 |
| 612 | LCD_WriteReg(R80, xsta);//水平方向GRAM起始地址 |
| 613 | LCD_WriteReg(R81, xend);//水平方向GRAM结束地址 |
| 614 | LCD_WriteReg(R82, ysta);//垂直方向GRAM起始地址 |
| 615 | LCD_WriteReg(R83, yend);//垂直方向GRAM结束地址 |
| 616 | LCD_SetCursor(xsta,ysta);//设置光标位置 |
| 617 | LCD_WriteRAM_Prepare();//开始写入GRAM |
| 618 | n=(u32)(yend-ysta+1)*(xend-xsta+1); |
| 619 | while(n--){LCD_WR_DATA(color);}//显示所填充的颜色. |
| 620 | //恢复设置 |
| 621 | LCD_WriteReg(R80, 0x0000);//水平方向GRAM起始地址 |
| 622 | LCD_WriteReg(R81, (LCD_WIDTH-1));//水平方向GRAM结束地址 |
| 623 | LCD_WriteReg(R82, 0x0000);//垂直方向GRAM起始地址 |
| 624 | LCD_WriteReg(R83, (LCD_HEIGHT-1));//垂直方向GRAM结束地址 |
| 625 |
| 626 | #endif |
| 627 |
| 628 | } |
| 629 |
| 630 | //画线 |
| 631 | //x1,y1:起点坐标 |
| 632 | //x2,y2:终点坐标 |
| 633 | voidLCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2) |
| 634 | { |
| 635 | u16 t; |
| 636 | intxerr=0,yerr=0,delta_x,delta_y,distance; |
| 637 | intincx,incy,uRow,uCol; |
| 638 |
| 639 | delta_x=x2-x1;//计算坐标增量 |
| 640 | delta_y=y2-y1; |
| 641 | uRow=x1; |
| 642 | uCol=y1; |
| 643 | if(delta_x>0)incx=1;//设置单步方向 |
| 644 | elseif(delta_x==0)incx=0;//垂直线 |
| 645 | else{incx=-1;delta_x=-delta_x;}//终点坐标小于起始坐标,反方向,将坐标重新定位为正坐标 |
| 646 | if(delta_y>0)incy=1; |
| 647 | elseif(delta_y==0)incy=0;//水平线 |
| 648 | else{incy=-1;delta_y=-delta_y;}//终点坐标小于起始坐标,反方向,将坐标重新定位为正坐标 |
| 649 | if( delta_x>delta_y)distance=delta_x;//选取基本增量坐标轴 |
| 650 | elsedistance=delta_y; |
| 651 | for(t=0;t<=distance+1;t++ )//画线输出 |
| 652 | { |
| 653 | LCD_DrawPoint(uRow,uCol);//根据坐标画点 |
| 654 | xerr+=delta_x ;//X坐标增量 |
| 655 | yerr+=delta_y ;//Y坐标增量 |
| 656 | if(xerr>distance) |
| 657 | { |
| 658 | xerr-=distance; |
| 659 | uRow+=incx; |
| 660 |
| 661 | } |
| 662 | if(yerr>distance) |
| 663 | { |
| 664 | yerr-=distance; |
| 665 | uCol+=incy; |
| 666 | } |
| 667 | } |
| 668 | } |
| 669 |
| 670 | //画矩形 |
| 671 | voidLCD_DrawRectangle(u8 x1, u16 y1, u8 x2, u16 y2) |
| 672 | { |
| 673 | LCD_DrawLine(x1,y1,x2,y1); |
| 674 | LCD_DrawLine(x1,y1,x1,y2); |
| 675 | LCD_DrawLine(x1,y2,x2,y2); |
| 676 | LCD_DrawLine(x2,y1,x2,y2); |
| 677 | } |
| 678 |
| 679 | //在指定位置画一个指定大小的圆 |
| 680 | //(x,y):中心点 |
| 681 | //r :半径 |
| 682 | voidDraw_Circle(u8 x0,u16 y0,u8 r) |
| 683 | { |
| 684 | inta,b; |
| 685 | intdi; |
| 686 | a=0;b=r; |
| 687 | di=3-(r<1);//判断下个点位置的标志 |
| 688 | while(a<=b) |
| 689 | { |
| 690 | LCD_DrawPoint(x0-b,y0-a);//3 |
| 691 | LCD_DrawPoint(x0+b,y0-a);//0 |
| 692 | LCD_DrawPoint(x0-a,y0+b);//1 |
| 693 | LCD_DrawPoint(x0-b,y0-a);//7 |
| 694 | LCD_DrawPoint(x0-a,y0-b);//2 |
| 695 | LCD_DrawPoint(x0+b,y0+a);//4 |
| 696 | LCD_DrawPoint(x0+a,y0-b);//5 |
| 697 | LCD_DrawPoint(x0+a,y0+b);//6 |
| 698 | LCD_DrawPoint(x0-b,y0+a); |
| 699 |
| 700 | a++; |
| 701 |
| 702 | //使用Bresenham算法画圆 |
| 703 | if(di<0){ |
| 704 | di +=4*a+6; |
| 705 | }else{ |
| 706 | di+=10+4*(a-b); |
| 707 | b--; |
| 708 | } |
| 709 | LCD_DrawPoint(x0+a,y0+b); |
| 710 | } |
| 711 | } |
| 712 |
| 713 | //在指定位置显示一个字符 |
| 714 | //x:0~234 |
| 715 | //y:0~308 |
| 716 | //num:要显示的字符:" "--->"~" |
| 717 | //size:字体大小 12/16 |
| 718 | //mode:叠加方式(1)还是非叠加方式(0) |
| 719 | voidLCD_ShowChar(u8 x,u16 y,u8 num,u8 size,u8 mode) |
| 720 | { |
| 721 |
| 722 | #if USE_HORIZONTAL |
| 723 |
| 724 | #define MAX_CHAR_POSX 312 |
| 725 | #define MAX_CHAR_POSY 232 |
| 726 |
| 727 | u8 temp; |
| 728 | u8 pos,t; |
| 729 | u16 x0=x; |
| 730 | u16 colortemp=POINT_COLOR; |
| 731 | if(x>MAX_CHAR_POSX||y>MAX_CHAR_POSY)return; |
| 732 | //设置窗口 |
| 733 | num=num- ;//得到偏移后的值 |
| 734 | if(!mode)//非叠加方式 |
| 735 | { |
| 736 | for(pos=0;pos |
| 737 | { |
| 738 | if(size==12) |
| 739 | temp=asc2_1206[num][pos];//调用1206字体 |
| 740 | else |
| 741 | temp=asc2_1608[num][pos];//调用1608字体 |
| 742 |
| 743 | for(t=0;t |
| 744 | { |
| 745 | if(temp&0x01) |
| 746 | POINT_COLOR=colortemp; |
| 747 | else |
| 748 | POINT_COLOR=BACK_COLOR; |
| 749 |
| 750 | LCD_DrawPoint(x,y); |
| 751 | temp>>=1; |
stm32TFTLC 相关文章:
- Stm32的TFT LCD显示器控制学习笔记(12-01)
- STM32之TFT-LCD液晶(11-13)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
