stm32 驅(qū)動 TFT LCD
577 | //清屏函數(shù) |
578 | //Color:要清屏的填充色 |
579 | voidLCD_Clear(u16 Color) |
580 | { |
581 | u32 index=0; |
582 | LCD_SetCursor(0x00,0x0000);//設(shè)置光標位置 |
583 | LCD_WriteRAM_Prepare();//開始寫入GRAM |
584 | for(index=0;index<76800;index++) |
585 | { |
586 | LCD_WR_DATA(Color);//向每個GRAM寫入數(shù)據(jù) |
587 | } |
588 | } |
589 |
590 | //在指定區(qū)域內(nèi)填充指定顏色 |
591 | //區(qū)域大小: |
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 | //設(shè)置窗口 |
612 | LCD_WriteReg(R80, xsta);//水平方向GRAM起始地址 |
613 | LCD_WriteReg(R81, xend);//水平方向GRAM結(jié)束地址 |
614 | LCD_WriteReg(R82, ysta);//垂直方向GRAM起始地址 |
615 | LCD_WriteReg(R83, yend);//垂直方向GRAM結(jié)束地址 |
616 | LCD_SetCursor(xsta,ysta);//設(shè)置光標位置 |
617 | LCD_WriteRAM_Prepare();//開始寫入GRAM |
618 | n=(u32)(yend-ysta+1)*(xend-xsta+1); |
619 | while(n--){LCD_WR_DATA(color);}//顯示所填充的顏色. |
620 | //恢復(fù)設(shè)置 |
621 | LCD_WriteReg(R80, 0x0000);//水平方向GRAM起始地址 |
622 | LCD_WriteReg(R81, (LCD_WIDTH-1));//水平方向GRAM結(jié)束地址 |
623 | LCD_WriteReg(R82, 0x0000);//垂直方向GRAM起始地址 |
624 | LCD_WriteReg(R83, (LCD_HEIGHT-1));//垂直方向GRAM結(jié)束地址 |
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;//設(shè)置單步方向 |
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);//根據(jù)坐標畫點 |
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 | //設(shè)置窗口 |
733 | num=num- ;//得到偏移后的值 |
734 | if(!mode)//非疊加方式 |
735 | { |
736 | for(pos=0;pos |
737 | { |
738 | if(size==12) |
739 | temp=asc2_1206[num][pos];//調(diào)用1206字體 |
740 | else |
741 | temp=asc2_1608[num][pos];//調(diào)用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; |
752 | x++; |
753 | } |
754 | x=x0; |
755 | y++; |
756 | } |
757 | }else{//疊加方式 |
758 | for(pos=0;pos |
759 | { |
760 | if(size==12) |
761 | temp=asc2_1206[num][pos];//調(diào)用1206字體 |
762 | else |
763 | temp=asc2_1608[num][pos];//調(diào)用1608字體 |
764 |
765 | for(t=0;t |
766 | { |
767 | if(temp&0x01)LCD_DrawPoint(x+t,y+pos);//畫一個點 |
768 | temp>>=1; |
769 | } |
770 | } |
771 | } |
772 | POINT_COLOR=colortemp; |
773 |
774 | #else |
775 | #define MAX_CHAR_POSX 232 |
776 | #define MAX_CHAR_POSY 304 |
777 |
778 | u8 temp; |
779 | u8 pos,t; |
780 |
781 | if(x>MAX_CHAR_POSX||y>MAX_CHAR_POSY)return; |
782 | //設(shè)置窗口 |
783 |
784 | LCD_WriteReg(R80,x);//水平方向GRAM起始地址 |
785 | LCD_WriteReg(R81,x+(size/2-1));//水平方向GRAM結(jié)束地址 |
786 | LCD_WriteReg(R82,y);//垂直方向GRAM起始地址 |
787 | LCD_WriteReg(R83,y+size-1);//垂直方向GRAM結(jié)束地址 |
788 | LCD_SetCursor(x,y);//設(shè)置光標位置 |
789 | LCD_WriteRAM_Prepare();//開始寫入GRAM |
790 | num=num- ;//得到偏移后的值 |
791 | if(!mode)//非疊加方式 |
792 | { |
793 | for(pos=0;pos |
794 | { |
795 | if(size==12) |
796 | temp=asc2_1206[num][pos];//調(diào)用1206字體 |
797 | else |
798 | temp=asc2_1608[num][pos];//調(diào)用1608字體 |
799 |
800 | for(t=0;t |
801 | { |
802 | if(temp&0x01){ |
803 | LCD_WR_DATA(POINT_COLOR); |
804 | }else{ |
805 | LCD_WR_DATA(BACK_COLOR); |
806 | } |
807 |
808 | temp>>=1; |
809 | } |
810 | } |
811 | }else{//疊加方式 |
812 |
813 | for(pos=0;pos |
814 | { |
815 | if(size==12) |
816 | temp=asc2_1206[num][pos];//調(diào)用1206字體 |
817 | else |
818 | temp=asc2_1608[num][pos];//調(diào)用1608字體 |
819 | for(t=0;t |
820 | { |
821 | if(temp&0x01) |
822 | LCD_DrawPoint(x+t,y+pos);//畫一個點 |