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)