1 2 3 | void lcd_write_cmd(unsigned char); //lcd 命令寫 void lcd_write_data(unsigned char); //lcd 數據寫 unsigend char lcd_read_data(void); //lcd 數據讀 |
1 2 3 4 | #define BASIC_SET 0x00 //基本指令集,后面的數字查數據手冊,下同。 #define EXTEND_SET 0x00 //擴展指令集 #define DRAW_ON 0x00 //繪圖顯示開 #define DRAW_OFF 0x00 //繪圖顯示關 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | void lcd_set_dot(unsigned char x, unsigned char y) { unsigned char x_byet, x_bit; //在橫坐標的哪一個字節,哪一個位 unsigned char y_byte, y_bit; x_byte = x / 16; //算出它在哪一個字節(地址) //注意一個地址是16位的 x_bit = x % 16; //算出它在哪一個位 y_byte = y /32; //y是沒在哪個字節這個說法 //這里只是確定它在上半屏還是下半屏 //0:上半屏 1:下半屏 y_bit = y % 32; //y_bit確定它是在第幾行 lcd_write_cmd(EXTEND_SET); //擴展指令集 lcd_write_cmd(DRAW_OFF); //繪圖顯示關閉 lcd_write_cmd(0x80 + y_bit); //先寫垂直地址 //具體參照數據手冊 lcd_write_cmd(0x80 + x_byte + 8 * y_byte); //水平坐標 //下半屏的水平坐標起始地址為0x88 //(+8*y_byte)就是用來確定在上半屏還是下半屏 if (x_bit < 8) //如果x_bit位數小于8 { lcd_write_data(0x01 << (7 - x_bit)); //寫高字節。因為坐標是從左向右的 //而GDRAM高位在左,底位在右 lcd_write_data(0x00); //低字節全部填0 } else { lcd_write_data(0x00); //高字節全部填0 lcd_write_data(0x01 << (15 - x_bit)); } lcd_write_cmd(DRAW_ON); //打開繪圖顯示 lcd_write_cmd(BASIC_SET); //回到基本指令集,畢竟ST7920是以字符為主的 return ; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | void lcd_set_dot(unsigned char x, unsigned char y) { unsigned char x_byet, x_bit; //在橫坐標的哪一個字節,哪一個位 unsigned char y_byte, y_bit; unsigned char tmph, tmpl; //定義兩個臨時變量,用于存放讀出來的數據 x &= 0x7F; y &= 0x3F; x_byte = x / 16; //算出它在哪一個字節(地址) //注意一個地址是16位的 x_bit = x&0x0F; //算出它在哪一個位 y_byte = y /32; //y是沒在哪個字節這個說法 //這里只是確定它在上半屏還是下半屏 //0:上半屏 1:下半屏 y_bit = y&0x3F; //y_bit確定它是在第幾行 lcd_write_cmd(EXTEND_SET); //擴展指令集 lcd_write_cmd(DRAW_OFF); //繪圖顯示關閉 lcd_write_cmd(0x80 + y_bit); //先寫垂直地址(最高位必須為1) //具體參照數據手冊 lcd_write_cmd(0x80 + x_byte + 8 * y_byte); //水平坐標 //下半屏的水平坐標起始地址為0x88 //(+8*y_byte)就是用來確定 //在上半屏還是下半屏 lcd_read_data(); //先空讀一次 tmph = lcd_read_data(); //讀高位 tmpl = lcd_read_data(); lcd_write_cmd(0x80 + y_bit); //讀操作會改變AC,所以重新設置一次 lcd_write_cmd(0x80 + x_byte + 8 * y_byte); if (x_bit < 8) //如果x_bit位數小于8 { lcd_write_data(tmph | (0x01 << (7 - x_bit))); //寫高字節。因為坐標是從左向右的 //而GDRAM高位在左,底位在右 lcd_write_data(tmpl); //原數據送回 } else { lcd_write_data(tmph); //原數據送回 lcd_write_data(tmpl | (0x01 << (15 - x_bit))); } lcd_write_cmd(DRAW_ON); //打開繪圖顯示 lcd_write_cmd(BASIC_SET); //回到基本指令集,畢竟ST7920是以字符為主的 return ; } |
歡迎光臨 (http://www.raoushi.com/bbs/) | Powered by Discuz! X3.1 |