|
LCD取模格式示范.jpg (46.45 KB, 下載次數(shù): 123)
下載附件
2016-4-6 18:51 上傳
0.png (42.53 KB, 下載次數(shù): 142)
下載附件
2016-4-6 18:52 上傳
所有源碼下載:
My_LCDdriver.rar
(111.33 KB, 下載次數(shù): 170)
2016-4-6 18:52 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
//LCD驅(qū)動程序,包含8*8字符,8*16字符,8*8數(shù)字,16*16漢字
//畫方框(也可用于畫直線),8*8反色,16*16反色,128*64圖片顯示
//下面給出外部接口及程序接口
主要程序如下:
- /*--------------------------------------------------------------*/
- //讀出指令(狀態(tài))
- unsigned char LCD_read_cmd(void)
- {
- unsigned char read_cmd;
- Data_IO = 0xff; //輸入
- RS = 0; //指令
- RW = 1; //讀出
- E = 1; //高電平讀出
- read_cmd = Data_IO; //指令
- E = 0;
- return (read_cmd);
- }
- /*--------------------------------------------------------------*/
- //讀出數(shù)據(jù)
- //先只須空讀一次, 以后接著就無須空讀
- //空讀之后讀出的數(shù)據(jù)都是有效的!!!
- unsigned char LCD_read_dat(void)
- {
- unsigned char read_dat;
- Data_IO = 0xff; //輸入
- RS = 1; //數(shù)據(jù)
- RW = 1; //讀出
- E = 1; //高電平讀出
- read_dat = Data_IO; //數(shù)據(jù)
- E = 0;
- return (read_dat);
- }
- /*--------------------------------------------------------------*/
- //檢查忙標(biāo)志位
- void LCD_check_busy(void)
- {
- unsigned char lcd_status;
- do{
- lcd_status = LCD_read_cmd();
- }while(lcd_status & 0x80);
- }
- /*--------------------------------------------------------------*/
- //寫入指令
- void LCD_write_cmd(unsigned char cmd)
- {
- LCD_check_busy();
- RS = 0; //指令
- RW = 0; //寫入
- Data_IO = cmd; //指令
- E = 1;
- E = 0; //下降沿寫入
- }
- /*--------------------------------------------------------------*/
- //寫入數(shù)據(jù)
- void LCD_write_dat(unsigned char dat)
- {
- LCD_check_busy();
- RS = 1; //數(shù)據(jù)
- RW = 0; //寫入
- Data_IO = dat; //數(shù)據(jù)
- E = 1;
- E = 0; //下降沿寫入
- }
- /*--------------------------------------------------------------*/
- //液晶字節(jié)定位(8*1)
- //液晶規(guī)劃:
- //x: 0 - 7 (行)
- //y: 0 -127 (列)
- void LCD_byte_pos(unsigned char x, unsigned char y)
- {
- if(y < 64) LCD_sel_left //左半屏
- else {y -= 64; LCD_sel_right} //右半屏
- LCD_write_cmd(X_Page_Addr + x); //頁地址0-7
- LCD_write_cmd(Y_Col_Addr + y); //列地址0-63
- }
- /*--------------------------------------------------------------*/
- //液晶字符定位(8*8)
- //液晶規(guī)劃:
- //x: 0 - 7 (行)
- //y: 0 -15 (列)
- void LCD_char_pos(unsigned char x, unsigned char y)
- {
- y <<= 3;
- LCD_byte_pos(x, y);
- }
- /*--------------------------------------------------------------*/
- //顯示清屏
- void LCD_clr_scr(unsigned char sel_dat)
- {
- unsigned char i, j;
-
- if(sel_dat == 0) LCD_sel_left
- else if(sel_dat == 1) LCD_sel_right
- else if(sel_dat == 2) LCD_sel_all
- for(j = 0; j < 8; j++)
- {
- LCD_write_cmd(X_Page_Addr + j);
- LCD_write_cmd(Y_Col_Addr);
- for(i = 0; i < 64; i++) LCD_write_dat(0x00);
- }
- }
- /*--------------------------------------------------------------*/
- //顯示清行
- //row: 0 - 7 共8行
- void LCD_clr_row(unsigned char row)
- {
- unsigned char i;
- LCD_sel_all
- LCD_write_cmd(Y_Col_Addr);
- LCD_write_cmd(X_Page_Addr + row);
- for(i = 0; i < 64; i++) LCD_write_dat(0x00);
- }
- /*--------------------------------------------------------------*/
- //讀出8bytes數(shù)據(jù)
- //液晶規(guī)劃:
- //x: 0 - 7 (行)
- //y: 0 -15 (列)
- void LCD_read_8bytes(unsigned char x, unsigned char y, unsigned char *read_dat)
- {
- unsigned char i;
- LCD_char_pos(x, y); LCD_read_dat(); //空讀一次!!!
- for(i = 0; i < 8; i++)
- {
- *read_dat = LCD_read_dat();
- read_dat++;
- }
- }
- /*--------------------------------------------------------------*/
- //#if (Font_type == 0) //(8*16字體)
- /*--------------------------------------------------------------*/
- //液晶字符輸出(8*16字體)
- //x: 0 -3 (行)
- //y: 0 -15 (列)
- void LCD_printc16(unsigned char x, unsigned char y, unsigned char c_dat)
- {
- unsigned char i, j;
- for(j = 0; j < 2; j++)
- {
- LCD_char_pos((x * 2 + j), y);
- for(i = 0; i < 8; i++) LCD_write_dat(Font_code16[c_dat - 32][8 * j + i]);
- }
- }
- /*--------------------------------------------------------------*/
- //液晶字符串輸出(8*16字體)
- //x: 0 - 3 (行)
- //y: 0 -15 (列)
- void LCD_prints16(unsigned char x, unsigned char y, unsigned char *s_dat)
- {
- while(*s_dat) LCD_printc16(x, y++, *s_dat++);
- }
- /*--------------------------------------------------------------*/
- //#elif (Font_type == 1) //(8*8字體)
- /*--------------------------------------------------------------*/
- //液晶字符輸出(8*8字體)
- //x: 0 - 7 (行)
- //y: 0 -15 (列)
- void LCD_printc(unsigned char x, unsigned char y, unsigned char c_dat)
- {
- unsigned char i;
- LCD_char_pos(x, y);
- LCD_write_dat(0x00); //補空, 1bytes
- for(i = 0; i < 6; i++) LCD_write_dat(Font_code[c_dat - 32][i]);
- LCD_write_dat(0x00); LCD_write_dat(0x00); //補空, 2bytes
- }
- /*--------------------------------------------------------------*/
- //液晶字符輸出(6*8字體)
- //x: 0 - 7 (行)
- //y: 0 -21 (列)
- void LCD_printcs(unsigned char x, unsigned char y, unsigned char c_dat)
- {
- unsigned char i;
- y = y * 6 + 1; //最左邊和最右邊各空一字節(jié)
- //LCD_write_dat_pos(x, y, 0x00); //前面補一個空字節(jié)
- for(i = 0; i < 6; i++) LCD_write_dat_pos(x, y + i + 1, Font_code[c_dat - 32][i]);
- }
- /*--------------------------------------------------------------*/
- //液晶字符串輸出(6*8字體)
- //x: 0 - 3 (行)
- //y: 0 -21 (列)
- /*void LCD_printss(unsigned char x, unsigned char y, unsigned char *s_dat)
- {
- while(*s_dat) LCD_printcs(x, y++, *s_dat++);
- }
- #endif
- /*--------------------------------------------------------------*/
- //液晶字符串輸出(8*8字體)
- //x: 0 - 7 (行)
- //y: 0 -15 (列)
- void LCD_prints(unsigned char x, unsigned char y, unsigned char *s_dat)
- {
- while(*s_dat) LCD_printc(x, y++, *s_dat++);
- }
- /*--------------------------------------------------------------*/
- //液晶字符反色區(qū)域(8*8字體)
- //x: 0 - 7 (行)
- //y: 0 -15 (列)
- void LCD_inverse(unsigned char x, unsigned char y)
- {
- unsigned char i;
- unsigned char read_buffer[8];
- LCD_read_8bytes(x, y, read_buffer);
- LCD_char_pos(x, y);
- for(i = 0; i < 8; i++) LCD_write_dat(~read_buffer[i]);
- }
- /*--------------------------------------------------------------*/
- //液晶字符下劃線區(qū)域(8*8字體)
- //x: 0 - 7 (行)
- //y: 0 -15 (列)
- //attr: =1, 添加下劃線
- // =0, 刪除下劃線
- void LCD_underline(unsigned char x, unsigned char y, unsigned char attr)
- {
- unsigned char i;
- unsigned char read_buffer[8];
- LCD_read_8bytes(x, y, read_buffer);
- LCD_char_pos(x, y);
- if(attr) for(i = 0; i < 8; i++) LCD_write_dat(read_buffer[i] | 0x80);
- else for(i = 0; i < 8; i++) LCD_write_dat(read_buffer[i] & ~0x80);
- }
- /*--------------------------------------------------------------*/
- //液晶反色顯示
- void LCD_scr_inverse(void)
- {
- unsigned char i, j;
- for(j = 0; j < 8; j++)
- {
- for(i = 0; i < 16; i++) LCD_inverse(j, i);
- }
- }
- /*--------------------------------------------------------------*/
- //#if Font_type //(8*8字體)
- /*--------------------------------------------------------------*/
- //液晶字符反色輸出(8*8字體)
- //x: 0 - 7 (行)
- //y: 0 -15 (列)
- void LCD_inversec(unsigned char x, unsigned char y)
- {
- LCD_inverse(x, y);
- }
- /*--------------------------------------------------------------*/
- //液晶字符加下劃線(8*8字體)
- //x: 0 - 7 (行)
- //y: 0 -15 (列)
- //attr: =1, 添加下劃線
- // =0, 刪除下劃線
- void LCD_underlinec(unsigned char x, unsigned char y, unsigned char attr)
- {
- LCD_underline(x, y, attr);
- }
- /*--------------------------------------------------------------*/
- //#else //(8*16字體)
- /*--------------------------------------------------------------*/
- //液晶字符反色輸出(8*16字體)
- //x: 0 - 3 (行)
- //y: 0 -15 (列)
- void LCD_inverse16(unsigned char x, unsigned char y)
- {
- x <<= 1;
- LCD_inverse(x, y);
- LCD_inverse(x+1, y);
- }
- /*--------------------------------------------------------------*/
- //液晶字符加下劃線(8*16字體)
- //x: 0 - 3 (行)
- //y: 0 -15 (列)
- //attr: =1, 添加下劃線
- // =0, 刪除下劃線
- void LCD_underline16(unsigned char x, unsigned char y, unsigned char attr)
- {
- x <<= 1;
- LCD_underline(x + 1, y, attr);
- }
- //#endif
- /*--------------------------------------------------------------*/
- //液晶字符串反色輸出
- //x: 0 -7 (行)
- //y: 0 -15 (列)
- //num: num < 16 - y
- void LCD_inverses(unsigned char x, unsigned char y, unsigned char num)
- {
- while(num--) LCD_inversec(x, y++);
- }
- /*--------------------------------------------------------------*/
- //液晶字符串加下劃線
- //x: 0 -7 (行)
- //y: 0 -15 (列)
- //num: num < 16 - y
- //attr: =1, 添加下劃線
- // =0, 刪除下劃線
- void LCD_underlines(unsigned char x, unsigned char y, unsigned char num, unsigned char attr)
- {
- while(num--) LCD_underlinec(x, y++, attr);
- }
- /*--------------------------------------------------------------*/
- //液晶漢字輸出(16*16字體)
- //取碼規(guī)則: 低位在前, 列行掃描, 陰碼(1-亮, 0-滅)
- //x: 0 - 3 (行)
- //y: 0 - 7 (列)
- void LCD_printch(unsigned char x, unsigned char y, unsigned char code *h_dat)
- {
- unsigned char i, j;
- x <<= 1; y <<= 1;
- for(j = 0; j < 2; j++)
- {
- LCD_char_pos((x + j), y);
- for(i = 0; i < 16; i++) LCD_write_dat(h_dat[16 * j + i]);
- }
- }
- /*--------------------------------------------------------------*/
- //液晶漢字詞組輸出(16*16字體)
- //取碼規(guī)則: 低位在前, 列行掃描, 陰碼(1-亮, 0-滅)
- //x: 0 - 3 (行)
- //y: 0 - 7 (列)
- //num: num < 8 - y
- //一次最多顯示八個漢字!
- void LCD_printsh(unsigned char x, unsigned char y, unsigned char code *h_dat, unsigned char num)
- {
- unsigned char i;
-
- for(i = 0; i < num; i++) {LCD_printch(x, y++, h_dat); h_dat += 32;}
- }
- /*--------------------------------------------------------------*/
- //液晶漢字輸出(16*16字體)
- //查表顯示輸出
- //取碼規(guī)則: 低位在前, 列行掃描, 陰碼(1-亮, 0-滅)
- //x: 0 - 3 (行)
- //y: 0 - 7 (列)
- void LCD_showch(unsigned char x, unsigned char y, unsigned char code *dat)
- {
- unsigned char i;
-
- for(i = 0; i < GB_16_num; i++)
- {
- if((GB_16[i].Index[0] == dat[0]) && (GB_16[i].Index[1] == dat[1])) break;
- }
- LCD_printch(x, y, GB_16[i].Msk);
- }
- /*--------------------------------------------------------------*/
- //液晶漢字詞組輸出(16*16字體)
- //查表顯示輸出
- //取碼規(guī)則: 低位在前, 列行掃描, 陰碼(1-亮, 0-滅)
- //x: 0 - 3 (行)
- //y: 0 - 7 (列)
- //num: num < 8 - y
- void LCD_showsh(unsigned char x, unsigned char y, unsigned char code *dat)
- {
- while(*dat) {LCD_showch(x, y++, dat); dat += 2;} //一個漢字GB碼由2個字節(jié)組成
- }
- /*--------------------------------------------------------------*/
- //液晶漢字反色區(qū)域(16*16字體)
- //x: 0 - 3 (行)
- //y: 0 - 7 (列)
- void LCD_inversech(unsigned char x, unsigned char y)
- {
- x <<= 1;
- y <<= 1;
- LCD_inverse(x, y);
- LCD_inverse(x, y+1);
- LCD_inverse(x+1, y);
- LCD_inverse(x+1, y+1);
- }
- /*--------------------------------------------------------------*/
- //液晶漢字詞組反色區(qū)域(16*16字體)
- //x: 0 - 3 (行)
- //y: 0 - 8 (列)
- //num: num < 8 - y 漢字個數(shù)
- void LCD_inversesh(unsigned char x, unsigned char y, unsigned char num)
- {
- while(num--) LCD_inversech(x, y++);
- }
- /*--------------------------------------------------------------*/
- //#if Font_type //(8*8字體)
- /*--------------------------------------------------------------*/
- //定位輸出數(shù)字
- //x: 0 - 7 (行)
- //y: 0 - 15/20 (列)
- //num: 0 - 65535 要顯示的數(shù)字
- //num_bit: 0 - 5 數(shù)字的位數(shù)
- //num_font: =0,6*8 輸出字體
- // =1,8*8
- /*void LCD_printn(unsigned char x, unsigned char y, unsigned int num, unsigned char num_bit, unsigned char num_font)
- {
- char i;
- unsigned char ii;
- unsigned char dat[6];
- for(i = 0; i < 6; i++) dat[i] = 0; i = 0; //初始化數(shù)據(jù)
- while(num / 10) //拆位
- {
- dat[i] = num % 10; //最低位
- num /= 10; i++;
- }
- dat[i] = num; //最高位
- ii = i; //保存dat的位數(shù)
- for(; i >= 0; i--) dat[i] += 48; //轉(zhuǎn)化成ASCII
- for(i = 0; i < num_bit; i++)
- if(num_font)LCD_printc(x, y + i, ' '); //清顯示區(qū)域
- else LCD_printcs(x, y + i, ' '); //清顯示區(qū)域
- for(i = ii; i >= 0; i--)
- if(num_font)LCD_printc(x, y++, dat[i]); //輸出數(shù)值
- else LCD_printcs(x, y++, dat[i]); //輸出數(shù)值
- }
- /*--------------------------------------------------------------*/
- //#else //(8*16字體)
- /*--------------------------------------------------------------*/
- //定位輸出數(shù)字
- //x: 0 - 3 (行)
- //y: 0 - 15 (列)
- //num: 0 - 65535 要顯示的數(shù)字
- //num_bit: 0 - 5 數(shù)字的位數(shù)
- void LCD_printn(unsigned char x, unsigned char y, unsigned int num, unsigned char num_bit)
- {
- char i;
- unsigned char ii;
- unsigned char dat[6];
- for(i = 0; i < 6; i++) dat[i] = 0; i = 0; //初始化數(shù)據(jù)
- while(num / 10) //拆位
- {
- dat[i] = num % 10; //最低位
- num /= 10; i++;
- }
- dat[i] = num; //最高位
- ii = i; //保存dat的位數(shù)
- for(; i >= 0; i--) dat[i] += 48; //轉(zhuǎn)化成ASCII
- for(i = 0; i < num_bit; i++)
- LCD_printc(x, y + i, ' '); //清顯示區(qū)域
- for(i = ii; i >= 0; i--)
- LCD_printc(x, y++, dat[i]); //輸出數(shù)值
- }
- //#endif
- /*--------------------------------------------------------------*/
- //液晶定位寫入數(shù)據(jù)一個字節(jié)
- //液晶規(guī)劃:
- //x: 0 - 7 (頁)
- //y: 0 -127 (列)
- void LCD_write_dat_pos(unsigned char x, unsigned char y, unsigned char dat)
- {
- LCD_byte_pos(x, y);
- LCD_write_dat(dat);
- }
- /*--------------------------------------------------------------*/
- //液晶定位讀出數(shù)據(jù)一個字節(jié)
- //液晶規(guī)劃:
- //x: 0 - 7 (頁)
- //y: 0 -127 (列)
- unsigned char LCD_read_dat_pos(unsigned char x, unsigned char y)
- {
- unsigned char read_dat;
- LCD_byte_pos(x, y);
- read_dat = LCD_read_dat(); //dummy讀
- read_dat = LCD_read_dat(); //數(shù)據(jù)有效
-
- return (read_dat);
- }
- /*--------------------------------------------------------------*/
- //顯示128X64圖片
- //取碼規(guī)則: 低位在前, 列行掃描, 陰碼(1-亮, 0-滅)
- void LCD_picture(unsigned char code *img_dat)
- {
- unsigned char i, j;
- for(j = 0; j < 8; j++)
- {
- for(i = 0; i < 128; i++)
- {
- LCD_write_dat_pos(j, i, img_dat[j * 128 + i]);
- }
- }
- }
- /*--------------------------------------------------------------*/
- //定位顯示指定大小圖片
- //取碼規(guī)則: 低位在前, 列行掃描, 陰碼(1-亮, 0-滅)
- //pag: 0 - 7 頁坐標(biāo)
- //col: 0 - 127 列坐標(biāo)
- //x: 0 - (127-col) 圖片寬
- //y: 0 - (63-pag*8) 圖片高
- /*void LCD_pos_picture(unsigned char pag, unsigned char col, unsigned char x, unsigned char y, unsigned char code *img_dat)
- {
- unsigned char i, j;
- y = (y + 4) >> 3; //四舍五入
- for(j = 0; j < y; j++)
- {
- for(i = 0; i < x; i++)
- {
- LCD_write_dat_pos(pag + j, col + i, img_dat[j * x + i]);
- }
- }
- }
- /*--------------------------------------------------------------*/
- //畫點函數(shù)
- //x: 0 - 127 橫坐標(biāo)
- //y: 0 - 63 列坐標(biāo)
- //attr: =1, 畫點
- // =0, 消點
- void LCD_pixel(unsigned char x, unsigned char y, unsigned char attr)
- {
- unsigned char pixel_dat, temp_dat, yy;
-
- yy = y >> 3; //劃分到頁
- pixel_dat = LCD_read_dat_pos(yy, x);//讀出數(shù)據(jù)
- temp_dat = 0x01 << (y & 0x07); //頁中的點
- if(attr) pixel_dat |= temp_dat; //畫點
- else pixel_dat &= ~temp_dat; //消點
- LCD_write_dat_pos(yy, x, pixel_dat);//寫入組合數(shù)據(jù)
- }
- /*--------------------------------------------------------------*/
- //畫橫線
- //y: 0 - 63 列坐標(biāo)
- //attr: =1, 畫線
- // =0, 消線
- void LCD_line_h(unsigned char y, unsigned char attr)
- {
- unsigned char i;
- for(i = 0; i < 128; i++) LCD_pixel(i, y, attr);
- }
- /*--------------------------------------------------------------*/
- //畫豎線
- //x: 0 - 128 橫坐標(biāo)
- //attr: =1, 畫線
- // =0, 消線
- void LCD_line_v(unsigned char x, unsigned char attr)
- {
- unsigned char i;
- for(i = 0; i < 64; i++) LCD_pixel(x, i, attr);
- }
- /*--------------------------------------------------------------*/
- //顯示直線
- //x: 0 - 127 橫坐標(biāo)
- //y: 0 - 63 縱坐標(biāo)
- //attr: =1, 畫線
- // =0, 消線
- void LCD_line(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char attr)
- {
- char dx, dy;
- char inc_x, inc_y;
- int xerr = 0, yerr = 0; //初始化變量
- unsigned char i, ds;
- dx = x2 - x1; //計算坐標(biāo)增量
- dy = y2 - y1;
- if(dx > 0) inc_x = 1; //設(shè)置單步方向
- else
- {
- if(dx == 0) {inc_x = 0; } //垂直線
- else {inc_x = -1; dx = -dx;}
- }
- if(dy > 0) inc_y = 1; //設(shè)置單步方向
- else
- {
- if(dy == 0) {inc_y = 0; } //水平線
- else {inc_y = -1; dy = -dy;}
- }
- if(dx > dy) ds = dx; //選取基本增量坐標(biāo)軸
- else ds = dy;
- for(i = 0; i <= ds+1; i++) //畫線輸出
- {
- LCD_pixel(x1, y1, attr); //畫點
- xerr += dx;
- yerr += dy;
- if(xerr > ds)
- {
- xerr -= ds;
- x1 += inc_x;
- }
- if(yerr > ds)
- {
- yerr -= ds;
- y1 += inc_y;
- }
- }
- }
- /*--------------------------------------------------------------*/
- //顯示方形
- //x: 0 - 127 橫坐標(biāo)
- //y: 0 - 63 縱坐標(biāo)
- //attr: =1, 畫方
- // =0, 刪方
- void LCD_rectangle(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char attr)
- {
- LCD_line(x1, y1, x2, y1, attr);
- LCD_line(x1, y1, x1, y2, attr);
- LCD_line(x2, y1, x2, y2, attr);
- LCD_line(x1, y2, x2, y2, attr);
- }
- /*--------------------------------------------------------------*/
- //顯示圓
- //x: 0 - 128 橫坐標(biāo)
- //y: 0 - 63 縱坐標(biāo)
- //r: 0 - 63 半徑
- //attr: =1, 畫圓
- // =0, 刪圓
- /*void LCD_circle(unsigned char x, unsigned char y, unsigned char r, unsigned char attr)
- {
- unsigned char dx, dy = r;
- for(dx = 0; dx <= r; dx++)
- {
- while((r * r + 1 - dx * dx) < (dy * dy)) dy--;
- LCD_pixel(x + dx, y - dy, attr);
- LCD_pixel(x - dx, y - dy, attr);
- LCD_pixel(x - dx, y + dy, attr);
- LCD_pixel(x + dx, y + dy, attr);
- LCD_pixel(x + dy, y - dx, attr);
- LCD_pixel(x - dy, y - dx, attr);
- LCD_pixel(x - dy, y + dx, attr);
- LCD_pixel(x + dy, y + dx, attr);
- }
- }
- /*--------------------------------------------------------------*/
- //復(fù)位LCD128*64
- void LCD_reset_12864(void)
- {
- LCD_clr_scr(ASCR); //清全屏
- LCD_write_cmd(Display_Off); //關(guān)閉顯示
- LCD_write_cmd(X_Page_Addr); //起始頁地址
- LCD_write_cmd(Start_Line); //起始行
- LCD_write_cmd(Y_Col_Addr); //起始列地址
- LCD_write_cmd(Display_On); //開啟顯示
- }
- /*--------------------------------------------------------------*/
- //初始化LCD128*64
- void LCD_init_12864(void)
- {
- LCD_reset_hard //硬件復(fù)位
- LCD_reset_soft //軟件復(fù)位
- }
-
復(fù)制代碼
|
|