#include "STM32Lib\\stm32f10x.h" #include "lcd_st7920.h" #include "FUZZY.h" #include "MAIN.h" u8 lcd_post_select; //ST7920选择 extern AI_CONTROL Ai_CTRL; extern MFL_PARA MFL_PARA_A; //单炉变量定义 extern volatile u16 RS485_READ_VOLTAGE_VALUE; extern volatile u16 RS485_READ_CURRENT_VALUE; /////////////////////////////////////////////////////////////////////// void delay_ms (u16 ms_num) { u16 i; while(ms_num != 0) { ms_num--; for(i = 0; i < delay_ms_num; i++); } } void LCD_DELAY_NOP (void) { u16 i; for(i = 0; i < LCD_DELAY_NOP_NUM; i++); } //LCD初始化 void lcd_init (void) { LCD_CLK1_L; LCD_CLK2_L; LCD_DIN_L; LCD_CS_L; LCD_RESET_L; delay_ms(200); LCD_RESET_H; LCD_CS_H; lcd_post_select = 0; lcd_write (LCD_COMMAND, 0x30); delay_ms(50); lcd_write (LCD_COMMAND, 0x30); delay_ms(50); lcd_write (LCD_COMMAND, 0x0c); delay_ms(50); lcd_write (LCD_COMMAND, 0x01); delay_ms(200); lcd_write (LCD_COMMAND, 0x06); delay_ms(200); lcd_post_select = 1; lcd_write (LCD_COMMAND, 0x30); delay_ms(50); lcd_write (LCD_COMMAND, 0x30); delay_ms(50); lcd_write (LCD_COMMAND, 0x0c); delay_ms(50); lcd_write (LCD_COMMAND, 0x01); delay_ms(200); lcd_write (LCD_COMMAND, 0x06); delay_ms(200); //LCD_BL_ON; lcd_picture_mode (); lcd_text_mode (); } //LCD写入 void lcd_write (u8 lcd_style, u8 a) { u8 n, x; x = lcd_style; for (n = 0; n < 8; n++) { if (lcd_post_select == 0) LCD_CLK1_L; else LCD_CLK2_L; if ((x & 0x80) != 0) LCD_DIN_H; else LCD_DIN_L; //LCD_DELAY_NOP (); if (lcd_post_select == 0) LCD_CLK1_H; else LCD_CLK2_H; //LCD_DELAY_NOP (); x <<= 1; } x = a & 0xf0; for (n = 0; n < 8; n++) { if (lcd_post_select == 0) LCD_CLK1_L; else LCD_CLK2_L; if ((x & 0x80) != 0) LCD_DIN_H; else LCD_DIN_L; //LCD_DELAY_NOP (); if (lcd_post_select == 0) LCD_CLK1_H; else LCD_CLK2_H; //LCD_DELAY_NOP (); x <<= 1; } a <<= 4; x = a & 0xf0; for (n = 0; n < 8; n++) { if (lcd_post_select == 0) LCD_CLK1_L; else LCD_CLK2_L; if ((x & 0x80) != 0) LCD_DIN_H; else LCD_DIN_L; //LCD_DELAY_NOP (); if (lcd_post_select == 0) LCD_CLK1_H; else LCD_CLK2_H; //LCD_DELAY_NOP (); x <<= 1; } } //LCD显示位置定位,0-x-3,0-y-12 void lcd_post (u8 x, u8 y) { if (x < 2) lcd_post_select = 0; else lcd_post_select = 1; if ((x == 1) || (x == 3)) y += 0x10; lcd_write (LCD_COMMAND, 0x80 + y); } //LCD显示字符 void lcd_display (u16 c) { u8 temp; if (c < 128) { temp = (u8)(c); lcd_write (LCD_DATA, temp); } else { temp = (u8)(c >> 8); lcd_write (LCD_DATA, temp); temp = (u8)(c); lcd_write (LCD_DATA, temp); } } //LCD显示字符串 void lcd_display_string (u8 x, u8 y, u8 *p) { if (x == 0) Ai_CTRL.PWM_STATUS_FLAG = 1; lcd_post (x, y); while(*p != 0) lcd_write (LCD_DATA, *p++); } //LCD温度显示后补充空白显示字符串 void lcd_display_temp_space (void) { u32 z, a, b, c, d, e; u8 flag; if (MFL_PARA_A.temp_dis_more_flag == 0) { lcd_display (' '); lcd_display (' '); lcd_display (' '); lcd_display (' '); lcd_display (' '); lcd_display (' '); lcd_display (' '); lcd_display (' '); lcd_display (' '); lcd_display (' '); } else if (MFL_PARA_A.temp_dis_more_flag == 1) { lcd_display (' '); lcd_display (' '); lcd_display (' '); //display voltage z = RS485_READ_VOLTAGE_VALUE; a = z / 1000; z -= a * 1000; b = z / 100; z -= b * 100; c = z / 10; z -= c * 10; d = z; if (a == 0) lcd_display (' '); else lcd_display (a + 0x30); if ((a == 0) && (b == 0)) lcd_display (' '); else lcd_display (b + 0x30); lcd_display (c + 0x30); lcd_display ('V'); //display current z = RS485_READ_CURRENT_VALUE; a = z / 1000; z -= a * 1000; b = z / 100; z -= b * 100; c = z / 10; z -= c * 10; d = z; if (a == 0) lcd_display (' '); else lcd_display (a + 0x30); if ((a == 0) && (b == 0)) lcd_display (' '); else lcd_display (b + 0x30); lcd_display (c + 0x30); } else if (MFL_PARA_A.temp_dis_more_flag == 2) { //display board temperature a = MFL_PARA_A.adc_BoardTemp_data; flag = 0; lcd_display (' '); z = a / 1000; if ((z == 0) && (flag == 0)) { lcd_display (' '); } else { lcd_display (z + 0x30); flag = 1; } a -= z * 1000; z = a / 100; if ((z == 0) && (flag == 0)) { lcd_display (' '); } else { lcd_display (z + 0x30); flag = 1; } a -= z * 100; z = a / 10; if ((z == 0) && (flag == 0)) { lcd_display (' '); } else { lcd_display (z + 0x30); flag = 1; } a -= z * 10; z = a; lcd_display (z + 0x30); //display thermo voltage a = MFL_PARA_A.adc_Thermo_data; flag = 0; lcd_display (' '); z = a / 1000; if ((z == 0) && (flag == 0)) { lcd_display (' '); } else { lcd_display (z + 0x30); flag = 1; } a -= z * 1000; z = a / 100; if ((z == 0) && (flag == 0)) { lcd_display (' '); } else { lcd_display (z + 0x30); flag = 1; } a -= z * 100; z = a / 10; if ((z == 0) && (flag == 0)) { lcd_display (' '); } else { lcd_display (z + 0x30); flag = 1; } a -= z * 10; z = a; lcd_display (z + 0x30); } } //LCD时间显示后补充空白显示字符串 void lcd_display_time_space (void) { u32 z, a; u8 flag; if (MFL_PARA_A.temp_dis_more_flag != 0x55) { lcd_display (' '); lcd_display (' '); lcd_display (' '); lcd_display (' '); lcd_display (' '); lcd_display (' '); } else { lcd_display (' '); lcd_display (' '); //display original temperature a = MFL_PARA_A.TEMP_VALUE; flag = 0; z = a / 1000; if ((z == 0) && (flag == 0)) { lcd_display (' '); } else { lcd_display (z + 0x30); flag = 1; } a -= z * 1000; z = a / 100; if ((z == 0) && (flag == 0)) { lcd_display (' '); } else { lcd_display (z + 0x30); flag = 1; } a -= z * 100; z = a / 10; if ((z == 0) && (flag == 0)) { lcd_display (' '); } else { lcd_display (z + 0x30); flag = 1; } a -= z * 10; z = a; lcd_display (z + 0x30); //display board temperature /*z=MFL_PARA_A.ads1220_original_data; z>>=4; a=z&0x0f; if (a>9) lcd_display (a+0x37); else lcd_display (a+0x30); z>>=4; a=z&0x0f; if (a>9) lcd_display (a+0x37); else lcd_display (a+0x30); z>>=4; a=z&0x0f; if (a>9) lcd_display (a+0x37); else lcd_display (a+0x30); z>>=4; a=z&0x0f; if (a>9) lcd_display (a+0x37); else lcd_display (a+0x30); z>>=4; a=z&0x0f; if (a>9) lcd_display (a+0x37); else lcd_display (a+0x30); */ } } //打开显示屏幕 (图像模式) void lcd_picture_on (void) { lcd_post_select = 0; //8BIT控制界面,维持扩充指令集,,绘图显示on lcd_write (LCD_COMMAND, 0x36); lcd_post_select = 1; lcd_write (LCD_COMMAND, 0x36); } //关闭显示屏幕 (图像模式) void lcd_picture_off (void) { lcd_post_select = 0; //8BIT控制界面,维持扩充指令集,,绘图显示off lcd_write (LCD_COMMAND, 0x34); lcd_post_select = 1; lcd_write (LCD_COMMAND, 0x34); } //进入字符模式,同时将整个屏幕用空格填充 void lcd_text_mode (void) { lcd_post_select = 0; lcd_write (LCD_COMMAND, 0x30); //回到字体模式 lcd_write (LCD_COMMAND, 0x01); lcd_post_select = 1; lcd_write (LCD_COMMAND, 0x30); //回到字体模式 lcd_write (LCD_COMMAND, 0x01); delay_ms(200); } //进入绘图模式,同时将整个屏幕清空 void lcd_picture_mode (void) { u8 i, n; lcd_post_select = 0; lcd_write (LCD_COMMAND, 0x34); lcd_post_select = 1; lcd_write (LCD_COMMAND, 0x34); lcd_post_select = 0; for(i = 0; i < 32; i++) //上半屏32行 { lcd_write (LCD_COMMAND, 0x80 + i); //设置绘图区的Y地址坐标0 lcd_write (LCD_COMMAND, 0x80); //设置绘图区的X地址坐标0 for(n = 0; n < 24; n++) lcd_write (LCD_DATA, 0x00); } lcd_post_select = 1; for(i = 0; i < 32; i++ ) //下半屏32行 { lcd_write (LCD_COMMAND, 0x80 + i); //设置绘图区的Y地址坐标0 lcd_write (LCD_COMMAND, 0x80); //设置绘图区的X地址坐标0 for(n = 0; n < 24; n++) lcd_write (LCD_DATA, 0x00); } lcd_post_select = 0; lcd_write (LCD_COMMAND, 0x36); lcd_post_select = 1; lcd_write (LCD_COMMAND, 0x36); } //反白显示,多字符 void lcd_display_black (u8 y, u8 x, u8 length, u8 style) { u8 i, it, n, es, ee; if (style) it = 0xff; else it = 0x00; if (y < 2) lcd_post_select = 0; else { lcd_post_select = 1; y -= 2; } es = y * 16; ee = y * 16 + 16; lcd_write (LCD_COMMAND, 0x34); //关闭屏幕 for (n = es; n < ee; n++) { lcd_write (LCD_COMMAND, 0x80 + n); //设置绘图区的Y地址坐标0 lcd_write (LCD_COMMAND, 0x80 + x); //设置绘图区的X地址坐标 for(i = 0; i < length; i++) //每行 lcd_write (LCD_DATA, it); } lcd_write (LCD_COMMAND, 0x36); //打开屏幕 lcd_write (LCD_COMMAND, 0x30); //返回文本模式 } //反白显示,单ASCII字符,y第几行,x第几个ASCII字符,最大23 void lcd_display_black_one (u8 y, u8 x, u8 style) { u8 it, n, es, ee, post; if (style) it = 0xff; else it = 0x00; if (y < 2) lcd_post_select = 0; else { lcd_post_select = 1; y -= 2; } es = y * 16; ee = y * 16 + 16; post = x & 0x01; x >>= 1; lcd_write (LCD_COMMAND, 0x34); //关闭屏幕 if (post == 0) { for (n = es; n < ee; n++) { lcd_write (LCD_COMMAND, 0x80 + n); //设置绘图区的Y地址坐标0 lcd_write (LCD_COMMAND, 0x80 + x); //设置绘图区的X地址坐标 lcd_write (LCD_DATA, it); } } else { for (n = es; n < ee; n++) { lcd_write (LCD_COMMAND, 0x80 + n); //设置绘图区的Y地址坐标0 lcd_write (LCD_COMMAND, 0x80 + x); //设置绘图区的X地址坐标 lcd_write (LCD_DATA, 0x00); lcd_write (LCD_DATA, it); } } lcd_write (LCD_COMMAND, 0x36); //打开屏幕 lcd_write (LCD_COMMAND, 0x30); //返回文本模式 }