|
lcd.c- #include "lcd.h"
- #include "delay.h"
- #include "font.h"
- void LCD_DATA(u8 i)
- {
- if((i | 0xfe) == 0xfe) DB0 = 0; else DB0 = 1;
- if((i | 0xfd) == 0xfd) DB1 = 0; else DB1 = 1;
- if((i | 0xfb) == 0xfb) DB2 = 0; else DB2 = 1;
- if((i | 0xf7) == 0xf7) DB3 = 0; else DB3 = 1;
- if((i | 0xef) == 0xef) DB4 = 0; else DB4 = 1;
- if((i | 0xdf) == 0xdf) DB5 = 0; else DB5 = 1;
- if((i | 0xbf) == 0xbf) DB6 = 0; else DB6 = 1;
- if((i | 0x7f) == 0x7f) DB7 = 0; else DB7 = 1;
- }
- void LCD_Init(void)
- {
- u8 i, j;
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 |GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- delay_us(10);
- RST = 0;
- delay_us(2);
- RST = 1; /*復(fù)位*/
- LCM_WRITE(com1, base);
- LCM_WRITE(com2, base);
- LCM_WRITE(com1, on);
- LCM_WRITE(com2, on);
- for (j = 0; j < 8; j++) /*清屏*/
- {
- LCM_WRITE(com1, 0xB8+j); /*清左半屏*/
- LCM_WRITE(com1, 0x40);
- LCM_WRITE(com2, 0xB8+j); /*清左半屏*/
- LCM_WRITE(com2, 0x40);
- for(i = 0;i < 64; i++)
- {
- LCM_WRITE(data1, 0x00);
- LCM_WRITE(data2, 0x00);
- }
- }
- }
- void LCM_WRITE(u8 cord, u8 ch)
- {
- switch(cord)
- {
- case 0:
- {
- delay_us(10);
- CS1=0;
- RS=0;
- RW=0;
- E=1;
- LCD_DATA(ch);
- delay_us(2);
- E=0;
- delay_us(2);
- CS1=1;
- }break;
- case 1:
- {
- delay_us(10);
- CS2=0;
- RS=0;
- RW=0;
- E=1;
- LCD_DATA(ch);
- delay_us(2);
- E=0;
- delay_us(2);
- CS2=1;
- }break;
- case 2:
- {
- delay_us(10);
- CS1=0;
- RS=1;
- RW=0;
- E=1;
- LCD_DATA(ch);
- delay_us(2);
- E=0;
- delay_us(2);
- CS1=1;
- }break;
- case 3:
- {
- delay_us(30);
- CS2=0;
- RS=1;
- RW=0;
- E=1;
- LCD_DATA(ch);
- delay_us(2);
- E=0;
- delay_us(2);
- CS2=1;
- }break;
- default : break;
- }
- }
- void Clr_Scr(u8 i)
- {
- u8 j, k;
- LCM_WRITE(com1, 0x40);
- LCM_WRITE(com2, 0x40);
- for(k = 0; k < 8; k++)
- {
- LCM_WRITE(com1, x_addr(k));
- LCM_WRITE(com2, x_addr(k));
- for(j = 0; j < 64; j++)
- {
- LCM_WRITE(data1, i);
- LCM_WRITE(data2, i);
- }
- }
- }
- void show_hanzi1212(u8 page, u8 colum, u8 c[2])
- {
- u8 zimo[24];
- u8 i, j, k, l;
-
- for(j = 0; j < (sizeof(codeGB_12) / sizeof(typFNT_GB12)); j++) //查找漢字位置
- {
- if((codeGB_12[j].Index[0] == c[0]) && (codeGB_12[j].Index[1] == c[1]))
- {
- for(i = 0; i < 24; i++) //讀出一個(gè)漢字的數(shù)據(jù)
- {
- zimo[i] = codeGB_12[j].Msk[i];//將漢字?jǐn)?shù)據(jù)存入顯示緩存區(qū)
- }
- }
- }
- for(l = 0; l < 2; l++)
- {
- for(k = 0; k < 12; k++)
- {
- if((colum + k) < 64)
- {
- LCM_WRITE(com1, y_addr(colum + k));
- LCM_WRITE(com1, x_addr(page + l));
- LCM_WRITE(data1, zimo[l * 12 + k]);
- }
- else if((colum + k) > 127)
- {
- LCM_WRITE(com1, y_addr(colum - 127 + k));
- LCM_WRITE(com1, x_addr(page + l));
- LCM_WRITE(data1, zimo[l * 12 + k]);
- }
- else
- {
- LCM_WRITE(com2, y_addr(colum - 64 + k));
- LCM_WRITE(com2, x_addr(page + l));
- LCM_WRITE(data2, zimo[l * 12 + k]);
- }
- }
- }
- }
- void show_hanzi1616(u8 page, u8 colum, u8 c[2])
- {
- u8 zimo[32];
- u8 i, j, k, l;
-
- for(j = 0; j < (sizeof(codeGB_16) / sizeof(typFNT_GB16)); j++)
- {
- if((codeGB_16[j].Index[0] == c[0]) && (codeGB_16[j].Index[1] == c[1]))
- {
- for(i = 0; i < 32; i++)
- {
- zimo[i] = codeGB_16[j].Msk[i];
- }
- }
- }
- for(l = 0; l < 2; l++)
- {
- for(k = 0; k < 16; k++)
- {
- if((colum + k) < 64)
- {
- LCM_WRITE(com1, y_addr(colum + k));
- LCM_WRITE(com1, x_addr(page + l));
- LCM_WRITE(data1, zimo[l * 16 + k]);
- }
- else if((colum + k) > 127)
- {
- LCM_WRITE(com1, y_addr(colum - 127 + k));
- LCM_WRITE(com1, x_addr(page + l));
- LCM_WRITE(data1, zimo[l * 16 + k]);
- }
- else
- {
- LCM_WRITE(com2, y_addr(colum - 64 + k));
- LCM_WRITE(com2, x_addr(page + l));
- LCM_WRITE(data2, zimo[l * 16 + k]);
- }
- }
- }
- }
- void show_hanzi2424(u8 page, u8 colum, u8 c[2])
- {
- u8 zimo[72];
- u8 i, j, k, l;
-
- for(j = 0; j < (sizeof(codeGB_24) / sizeof(typFNT_GB24)); j++) //查找漢字位置
- {
- if((codeGB_24[j].Index[0] == c[0]) && (codeGB_24[j].Index[1] == c[1]))
- {
- for(i = 0; i < 72; i++) //讀出一個(gè)漢字的數(shù)據(jù)
- {
- zimo[i] = codeGB_24[j].Msk[i];//將漢字?jǐn)?shù)據(jù)存入顯示緩存區(qū)
- }
- }
- }
- for(l = 0; l < 3; l++)
- {
- for(k = 0; k < 24; k++)
- {
- if((colum + k) < 64)
- {
- LCM_WRITE(com1, y_addr(colum + k));
- LCM_WRITE(com1, x_addr(page + l));
- LCM_WRITE(data1, zimo[l * 24 + k]);
- }
- else if((colum + k) > 127)
- {
- LCM_WRITE(com1, y_addr(colum - 127 + k));
- LCM_WRITE(com1, x_addr(page + l));
- LCM_WRITE(data1, zimo[l * 24 + k]);
- }
- else
- {
- LCM_WRITE(com2, y_addr(colum - 64 + k));
- LCM_WRITE(com2, x_addr(page + l));
- LCM_WRITE(data2, zimo[l * 24 + k]);
- }
- }
- }
- }
- void display_hanzi(u8 page, u8 colum, u8 *c, u8 size)
- {
- switch(size)
- {
- case 12:
- while(*c)
- {
- show_hanzi1212(page,colum,c);
- colum += 12;
- c += 2;
- }
- break;
- case 16:
- while(*c)
- {
- show_hanzi1616(page,colum,c);
- colum += 16;
- c += 2;
- }
- break;
- case 24:
- while(*c)
- {
- show_hanzi2424(page,colum,c);
- colum += 24;
- c += 2;
- }
- break;
- default:break;
- }
- }
- void show_letter_s(u8 page, u8 colum, u8 uletter[1])
- {
- u8 zimo[12];
- u8 i, j, k, l;
-
- for(i = 0; i < (sizeof(codeZF_12) / sizeof(typFNT_ZF12)); i++) //查找數(shù)字位置
- {
- if(codeZF_12[i].Index[0] == uletter[0])
- {
- for(j = 0; j < 12; j++) //讀出一個(gè)數(shù)字的數(shù)據(jù)
- {
- zimo[j] = codeZF_12[i].Msk[j];//將數(shù)字?jǐn)?shù)據(jù)存入顯示緩存區(qū)
- }
- }
- }
- for(l = 0; l < 2; l++)
- {
- for(k = 0; k < 6; k++)
- {
- if((colum + k) < 64)
- {
- LCM_WRITE(com1, y_addr(colum + k));
- LCM_WRITE(com1, x_addr(page + l));
- LCM_WRITE(data1, zimo[l * 6 + k]);
- }
- else if((colum + k) > 127)
- {
- LCM_WRITE(com1, y_addr(colum - 127 + k));
- LCM_WRITE(com1, x_addr(page + l));
- LCM_WRITE(data1, zimo[l * 6 + k]);
- }
- else
- {
- LCM_WRITE(com2, y_addr(colum - 64 + k));
- LCM_WRITE(com2, x_addr(page + l));
- LCM_WRITE(data2, zimo[l * 6 + k]);
- }
- }
- }
- }
- void show_letter_m(u8 page, u8 colum, u8 uletter[1])
- {
- u8 zimo[16];
- u8 i, j, k, l;
-
- for(i = 0; i < (sizeof(codeZF_16) / sizeof(typFNT_ZF16)); i++) //查找數(shù)字位置
- {
- if(codeZF_16[i].Index[0] == uletter[0])
- {
- for(j = 0;j < 16; j++) //讀出一個(gè)數(shù)字的數(shù)據(jù)
- {
- zimo[j] = codeZF_16[i].Msk[j];//將數(shù)字?jǐn)?shù)據(jù)存入顯示緩存區(qū)
- }
- }
- }
- for(l = 0; l < 2; l++)
- {
- for(k = 0; k < 8; k++)
- {
- if((colum + k) < 64)
- {
- LCM_WRITE(com1, y_addr(colum + k));
- LCM_WRITE(com1, x_addr(page + l));
- LCM_WRITE(data1, zimo[l * 8 + k]);
- }
- else if((colum + k) > 127)
- {
- LCM_WRITE(com1, y_addr(colum - 127 + k));
- LCM_WRITE(com1, x_addr(page + l));
- LCM_WRITE(data1, zimo[l * 8 + k]);
- }
- else
- {
- LCM_WRITE(com2, y_addr(colum - 64 + k));
- LCM_WRITE(com2, x_addr(page + l));
- LCM_WRITE(data2, zimo[l * 8 + k]);
- }
- }
- }
- }
- void show_letter_l(u8 page, u8 colum, u8 uletter[1])
- {
- u8 zimo[36];
- u8 i, j, k, l;
- for(i = 0; i < (sizeof(codeZF_24) / sizeof(typFNT_ZF24)); i++) //查找數(shù)字位置
- {
- if(codeZF_24[i].Index[0] == uletter[0])
- {
- for(j = 0; j < 36; j++) //讀出一個(gè)數(shù)字的數(shù)據(jù)
- {
- zimo[j] = codeZF_24[i].Msk[j];//將數(shù)字?jǐn)?shù)據(jù)存入顯示緩存區(qū)
- }
- }
- }
- for(l = 0; l < 3; l++)
- {
- for(k = 0; k < 12; k++)
- {
- if((colum + k) < 64)
- {
- LCM_WRITE(com1, y_addr(colum + k));
- LCM_WRITE(com1, x_addr(page + l));
- LCM_WRITE(data1, zimo[l * 12 + k]);
- }
- else if((colum + k) > 127)
- {
- LCM_WRITE(com1, y_addr(colum - 127 + k));
- LCM_WRITE(com1, x_addr(page + l));
- LCM_WRITE(data1, zimo[l * 12 + k]);
- }
- else
- {
- LCM_WRITE(com2, y_addr(colum - 64 + k));
- LCM_WRITE(com2, x_addr(page + l));
- LCM_WRITE(data2, zimo[l * 12 + k]);
- }
- }
- }
- }
- void display_letter(u8 page, u8 colum, u8 *uletter, u8 size)
- {
- switch(size)
- {
- case 12:
- while(*uletter)
- {
- show_letter_s(page, colum, uletter);
- colum += 6;
- uletter++;
- }
- break;
- case 16:
- while(*uletter)
- {
- show_letter_m(page, colum, uletter);
- colum += 8;
- uletter++;
- }
- break;
- case 24:
- while(*uletter)
- {
- show_letter_l(page, colum, uletter);
- colum += 12;
- uletter++;
- }
- break;
- default : break;
- }
- }
- void show_bitmap(u8 page, u8 colum, u8 c[1])
- {
- u8 zimo[32];
- u8 i, j, k, l;
-
- for(j = 0; j < (sizeof(weitu) / sizeof(typFNT_ZF16)); j++)
- {
- if((weitu[j].Index[0] == c[0]))
- {
- for(i = 0; i < 32; i++)
- {
- zimo[i] = weitu[j].Msk[i];
- }
- }
- }
- for(l = 0; l < 2; l++)
- {
- for(k = 0; k < 16; k++)
- {
- if((colum + k) < 64)
- {
- LCM_WRITE(com1, y_addr(colum + k));
- LCM_WRITE(com1, x_addr(page + l));
- LCM_WRITE(data1, zimo[l * 16 + k]);
- }
- else if((colum + k) > 127)
- {
- LCM_WRITE(com1, y_addr(colum - 127 + k));
- LCM_WRITE(com1, x_addr(page + l));
- LCM_WRITE(data1, zimo[l * 16 + k]);
- }
- else
- {
- LCM_WRITE(com2, y_addr(colum - 64 + k));
- LCM_WRITE(com2, x_addr(page + l));
- LCM_WRITE(data2, zimo[l * 16 + k]);
- }
- }
- }
- }
復(fù)制代碼 lcd.h- #ifndef __LCD_H
- #define __LCD_H
- #include "sys.h"
- #define RS PBout(15) //寄存器選擇端 H:數(shù)據(jù)寄存器,L:命令寄存器
- #define RW PBout(14) //讀/寫(xiě)選擇信號(hào),R/W=1:讀選通,R/W=0:寫(xiě)選通
- #define E PBout(13) //讀寫(xiě)使能信號(hào),在E下降沿,數(shù)據(jù)被鎖存(寫(xiě))入,在E高電平器件,數(shù)據(jù)被讀出
- #define CS1 PBout(10) //前64點(diǎn)選擇,1有效
- #define CS2 PBout(11) //后64點(diǎn)選擇,1有效
- #define RST PBout(12) //復(fù)位信號(hào)
- #define DB0 PAout(0)
- #define DB1 PAout(1)
- #define DB2 PAout(2)
- #define DB3 PAout(3)
- #define DB4 PAout(4)
- #define DB5 PAout(5)
- #define DB6 PAout(6)
- #define DB7 PAout(7)
- #define com 0x00
- #define data 0x01
- #define com1 0x00
- #define com2 0x01
- #define data1 0x02
- #define data2 0x03
- #define on 0x3f
- #define off 0x3e
- #define base 0xc0
- #define x_addr(x) 0xb8+x
- #define y_addr(y) 0x40+y
- void LCD_DATA(u8 i);
- void LCD_Init(void);
- void LCM_WRITE(u8 cord, u8 ch);
- void Clr_Scr(u8 i);
- void show_hanzi1212(u8 page, u8 colum, u8 c[2]);
- void show_hanzi1616(u8 page, u8 colum, u8 c[2]);
- void show_hanzi2424(u8 page, u8 colum, u8 c[2]);
- void display_hanzi(u8 page, u8 colum, u8 *c, u8 size);
- void show_letter_s(u8 page, u8 colum, u8 uletter[1]);
- void show_letter_m(u8 page, u8 colum, u8 uletter[1]);
- void show_letter_l(u8 page, u8 colum, u8 uletter[1]);
- void display_letter(u8 page, u8 colum, u8 *uletter, u8 size);
- void show_bitmap(u8 page, u8 colum, u8 c[2]);
- #endif
復(fù)制代碼 驅(qū)動(dòng)自己改,沒(méi)什么可說(shuō)的都會(huì)。
字體都是pctolcd2002扣的,
扣好的字
0x10,0x10,0x10,0xFF,0x10,0x90,0x00,0xFC,0x04,0x04,0x04,0x04,0x04,0xFC,0x00,0x00,
0x04,0x44,0x82,0x7F,0x01,0x00,0x00,0x7F,0x20,0x20,0x20,0x20,0x20,0x7F,0x00,0x00,/*"扣",0*/
放到數(shù)組里面要改為- "扣",0x10,0x10,0x10,0xFF,0x10,0x90,0x00,0xFC,0x04,0x04,0x04,0x04,0x04,0xFC,0x00,0x00,0x04,0x44,0x82,0x7F,0x01,0x00,0x00,0x7F,0x20,0x20,0x20,0x20,0x20,0x7F,0x00,0x00,/*0*
復(fù)制代碼 把索引放到前邊
放個(gè)片段吧,免得你們說(shuō)虎頭蛇尾
- #ifndef __FONT_H_
- #define __FONT_H_
- // ------------------ 漢字字模的數(shù)據(jù)結(jié)構(gòu)定義 ------------------------ //
- typedef struct // 漢字字模數(shù)據(jù)結(jié)構(gòu)
- {
- unsigned char Index[3]; // 漢字內(nèi)碼索引
- unsigned char Msk[24]; // 點(diǎn)陣碼數(shù)據(jù)
- }typFNT_GB12;
- typedef struct // 漢字字模數(shù)據(jù)結(jié)構(gòu)
- {
- unsigned char Index[3]; // 漢字內(nèi)碼索引
- unsigned char Msk[32]; // 點(diǎn)陣碼數(shù)據(jù)
- }typFNT_GB16;
- typedef struct // 漢字字模數(shù)據(jù)結(jié)構(gòu)
- {
- unsigned char Index[3]; // 漢字內(nèi)碼索引
- unsigned char Msk[72]; // 點(diǎn)陣碼數(shù)據(jù)
- }typFNT_GB24;
復(fù)制代碼
- const typFNT_GB16 codeGB_16[] =
- {
- "扣",0x10,0x10,0x10,0xFF,0x10,0x90,0x00,0xFC,0x04,0x04,0x04,0x04,0x04,0xFC,0x00,0x00,0x04,0x44,0x82,0x7F,0x01,0x00,0x00,0x7F,0x20,0x20,0x20,0x20,0x20,0x7F,0x00,0x00,/*0*
- };
復(fù)制代碼
最后附上接線圖
|
評(píng)分
-
查看全部評(píng)分
|