一.在原点板子上修改,将FSMC改为一般IO驱动 1.1已经完成 (1)初始化,清屏,蓝色背景--OK。 (2) 一般打点,可以。--OK (3)快速打点,可以,点坐标会错乱。--NG
(4)字符引用快速打点,打出来背景点,没有字符。--NG
1.2IO对照表,已经检查验证,输出正常。 1. LCD_CS FSMC_NE4 PG12 2. LCD_RS FSMC_A10 PG0 3. LCD_WR FSMC_NWE PD5 4. LCD_RD FSMC_NOE PD4 5. RESET 硬件 6. LCD_D0(DB1) FSMC_D0 PD14 7. LCD_D1(DB2) FSMC_D1 PD15 8. LCD_D2(DB3) FSMC_D2 PD0 9. LCD_D3(DB4) FSMC_D3 PD1 10. LCD_D4(DB5) FSMC_D4 PE7 11. LCD_D5(DB6) FSMC_D5 PE8 12. LCD_D6(DB7) FSMC_D6 PE9 13. LCD_D7(DB8) FSMC_D7 PE10 14. LCD_D8(DB10) FSMC_D8 PE11 15. LCD_D9(DB11) FSMC_D9 PE12 16. LCD_D10(DB12) FSMC_D10 PE13 17. LCD_D11(DB13) FSMC_D11 PE14 18. LCD_D12(DB14) FSMC_D12 PE15 19. LCD_D13(DB15) FSMC_D13 PD8 20. LCD_D14(DB16) FSMC_D14 PD9 21. LCD_D15(DB17) FSMC_D15 PD10 22.GND 23.LCD_BL PB0 24.VCC 3.3V 25.VCC 3.3V 26.GND 27.GND 28.VCC 29.T_MISO PB2 30.T_MOSI PF9 31.T_PEN PF10 32.MO _NG 33.T_CS PF11
34.T_SCK PB1
[size=18.6667px]//写寄存器函数 [size=18.6667px]//regval:寄存器值 [size=18.6667px]void LCD_WR_REG(u16 regval) [size=18.6667px]{ [size=18.6667px] //LCD->LCD_REG=regval;//写入要写的寄存器序号 //结构体指针,指向FSMC基地址 [size=18.6667px] LCD_CS = 0; //片选有效 [size=18.6667px] LCD_RS = 0; //指令 [size=18.6667px] LCD_RD = 1; //读 禁止 [size=18.6667px] DATA_OUT(regval); //写数据 [size=18.6667px] LCD_WR = 0; [size=18.6667px] // delay_us(5); [size=18.6667px] LCD_WR = 1; //写数据 [size=18.6667px] LCD_CS = 1; //片选结束 [size=18.6667px]} [size=18.6667px]
[size=18.6667px]//写LCD数据 [size=18.6667px]//data:要写入的值 [size=18.6667px]void LCD_WR_DATA(u16 data) [size=18.6667px]{ [size=18.6667px] //LCD->LCD_RAM=data; // -> 间接引用 运算符,#define LCD ((LCD_TypeDef *) LCD_BASE) // 指针指向结构体的成员 FSMC直接赋值给寄存器 [size=18.6667px] LCD_CS = 0; //片选有效 [size=18.6667px] LCD_RS = 1; //数据 控制信号 1数据 0命令 [size=18.6667px] LCD_RD = 1; //读 禁止 [size=18.6667px] DATA_OUT(data); //写数据 [size=18.6667px] LCD_WR = 0; [size=18.6667px] //delay_us(5); [size=18.6667px] LCD_WR = 1; //写数据 [size=18.6667px] LCD_CS = 1; //片选结束
[size=18.6667px]} [size=18.6667px]
[size=18.6667px]//读LCD数据 [size=18.6667px]//返回值:读到的值 [size=18.6667px]u16 LCD_RD_DATA(void) [size=18.6667px]{ [size=18.6667px] vu16 ram; //防止被优化 [size=18.6667px] //ram=LCD->LCD_RAM; [size=18.6667px] [size=18.6667px] LCD_DB_IO_inputMode(); //IO输入模式 [size=18.6667px] DATA_OUT(0x0000); [size=18.6667px] LCD_CS = 0; //片选有效 [size=18.6667px] LCD_RS = 1; //数据 控制信号 [size=18.6667px] LCD_WR = 1; //写数据 禁止 [size=18.6667px] LCD_RD = 0; //读数据 允许 [size=18.6667px] DATA_OUT(0xffff); //端口全部输出 1 [size=18.6667px]// delay_us(5); [size=18.6667px] ram = DATA_IN(); [size=18.6667px] [size=18.6667px] LCD_RD = 1; //读数据 禁止 [size=18.6667px] LCD_CS = 1; //片选失效 [size=18.6667px] [size=18.6667px]// delay_us(10); [size=18.6667px] LCD_DB_IO_outputMode(); [size=18.6667px] return ram;
[size=18.6667px]}
//写寄存器 //LCD_Reg:寄存器地址 //LCD_RegValue:要写入的数据 void LCD_WriteReg(u16 LCD_Reg,u16 LCD_RegValue) { //LCD->LCD_REG = LCD_Reg; //写入要写的寄存器序号 //LCD->LCD_RAM = LCD_RegValue;//写入数据 LCD_WR_REG(LCD_Reg); // delay_us(10); LCD_WR_DATA(LCD_RegValue); }
//读寄存器 //LCD_Reg:寄存器地址 //返回值:读到的数据 u16 LCD_ReadReg(u16 LCD_Reg) { LCD_WR_REG(LCD_Reg); //写入要读的寄存器序号 // delay_us(3); return LCD_RD_DATA(); //返回读到的值 } //开始写GRAM void LCD_WriteRAM_Prepare(void) { //LCD->LCD_REG=lcddev.wramcmd; LCD_WR_REG(lcddev.wramcmd); } //LCD写GRAM //RGB_Code:颜色值 void LCD_WriteRAM(u16 RGB_Code) { //LCD->LCD_RAM = RGB_Code;//写十六位GRAM LCD_WR_DATA(RGB_Code); }
#include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "lcd.h" #include "usart.h" //#include "font.h"
/************************************************ ALIENTEK 战舰STM32F103开发板实验13 TFTLCD显示实验 关注微信公众平台微信号:"正点原子",免费获取STM32资料。 广州市星翼电子科技有限公司 作者:正点原子 @ALIENTEK ************************************************/ int main(void) { unsigned int LCD_DX[20]; unsigned char i=0,j=0; u8 x=0; u8 lcd_id[12]; //存放LCD ID字符串 delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 LED_Init(); //LED端口初始化 LCD_Init(); //读有问题,写可以,刷屏地底色完成 //LCD_DB_IO_outputMode(); POINT_COLOR=GREEN; sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);//将LCD ID打印到lcd_id数组。 // LCD_Draw_Circle(40,50,20); //可以执行 //LCD_ShowString(30,130,200,12,12,"TFTLCD TEST"); //LCD_DrawPoint(30,40); //可以执行 // LCD_Fast_DrawPoint(30,40,GREEN); // 31 40; 32 40; 33 40; 34 40不成一线 回写的 #if 0 LCD_Fast_DrawPoint(0,40,RED); //划线对点坐标 LCD_Fast_DrawPoint(1,40,RED); LCD_Fast_DrawPoint(2,40,RED); //跳了一段 打点 LCD_Fast_DrawPoint(3,40,RED); LCD_Fast_DrawPoint(4,40,RED); LCD_Fast_DrawPoint(5,40,RED); LCD_Fast_DrawPoint(6,40,RED); LCD_Fast_DrawPoint(7,40,RED); LCD_Fast_DrawPoint(8,40,RED); LCD_Fast_DrawPoint(9,40,RED); LCD_Fast_DrawPoint(10,40,RED); LCD_Fast_DrawPoint(11,40,RED); LCD_Fast_DrawPoint(12,40,RED); LCD_Fast_DrawPoint(13,40,RED); LCD_Fast_DrawPoint(14,40,RED); LCD_Fast_DrawPoint(15,40,RED); #endif LCD_DrawLine(1, 20, 100, 20); //划线 没问题 LCD_ShowString(30,40,210,24,24,"WarShip STM32 ^_^"); //写字 异常
while(1); }
|