本帖最后由 zhjb1 于 2016-9-1 16:49 编辑
FRDM_KL25Z 实验二 KS0713 黑白LCD实验
先声明,KS0713属于无背光LCD,可以从2.5V以上开始显示,光线有的情况下,可视性很好,并且字符较大本身面积不太大,大约是102X32点阵,当数据较多时需要良好地设计屏幕。可以8位并口和串口,本例采用串口,一共6根线。
为了适应用法,采用函数模块的方式——LCD单独两个lcd.c和lcd.h
lcd.h:
//KS0713 LCD
#ifdef __cplusplus
extern "C" {
#endif
//Set LCD Ctrl IO
#define ck MKL_PORTD
#define ckPin 0
#define da MKL_PORTD
#define daPin 1
#define cd MKL_PORTD
#define cdPin 2
#define res MKL_PORTD
#define resPin 3
#define key PORTE
#define keyPin 25
//Delayer
void DelayMs(int counter);
//Write Plus
void wri(void);
//a B Data to LCD,dt:data,com:1-data/0-command
void b2l(unsigned char dt,unsigned char com);
//Set LCD col:0-102 pag:0-8
void setXY(unsigned char pag,unsigned char col);
//LCD Clear
void lcdClear(void);
//Display a ASCII 8X8,c:Char in cha[]
void c2lx(unsigned char pag,unsigned char col,unsigned char c);
//Display a ASCII 8X16,c:Char in cha[]
void c2l(unsigned char pag,unsigned char col,unsigned char c);
//12X12 dots LCD disp,row,page:,c:,han
void h2l(unsigned char pag, unsigned char col,unsigned char c);
//LCD Initial
void lcdInit(void);
//Display BaseData
void dispBase(void);
//Disp Mesuger
void dispMes(void);
//Chinese
void disHz(void);
//Display ASCiI Test
void disAsc(void);
#ifdef __cplusplus
}
#endif
lcd.c
//KS0713 LCD
#include "includes.h"
#include "lcd.h"
extern INT32U t0,tt,k,js,duty,duty1,duty2,speed,js;
extern INT16U adcVal,value,value2,value3,dir1,dir2,ctrl,ford,left,right,x,y,z;
extern INT8U status0_value;
//上述的许多变量还没有用,以后会用的
//0713 LCD 非标ASCII!!!
const unsigned char asc2[][6]={//宋体字:宽x高=7x12
{0x00,0x3E,0x45,0x49,0x51,0x3E},//0
{0x00,0x00,0x21,0x7F,0x01,0x00},//1
{0x00,0x31,0x43,0x45,0x49,0x31},//2
{0x00,0x22,0x49,0x49,0x49,0x36},//3
{0x00,0x04,0x0C,0x14,0x7F,0x04},//4
{0x00,0x72,0x51,0x51,0x51,0x4E},//5-5
{0x00,0x3E,0x49,0x49,0x49,0x06},//6
{0x00,0x40,0x43,0x4C,0x50,0x60},//7
{0x00,0x36,0x49,0x49,0x49,0x36},//8
{0x00,0x30,0x48,0x48,0x48,0x3F},//9
{0x00,0x1F,0x24,0x64,0x24,0x1F},//A-10
{0x00,0x41,0x7F,0x49,0x49,0x36},//B
{0x00,0x3E,0x41,0x41,0x41,0x22},//C
{0x00,0x41,0x7F,0x41,0x41,0x3E},//D
{0x00,0x41,0x7F,0x49,0x49,0x63},//E
{0x00,0x41,0x7F,0x49,0x5C,0x60},//F-15
{0x00,0x3E,0x41,0x45,0x47,0x24},//G
{0x41,0x7F,0x08,0x08,0x08,0x7F},//H
{0x00,0x00,0x41,0x7F,0x41,0x00},//I
{0x00,0x42,0x41,0x7F,0x40,0x40},//J
{0x00,0x41,0x7F,0x59,0x24,0x43},//K-20
{0x00,0x40,0x7F,0x41,0x01,0x03},//L
{0x00,0x7F,0x20,0x1E,0x20,0x7F},//M
{0x00,0x7F,0x30,0x18,0x06,0x7F},//N
{0x00,0x3E,0x41,0x41,0x41,0x3E},//O
{0x00,0x41,0x7F,0x49,0x48,0x30},//P-25
{0x00,0x3E,0x41,0x47,0x42,0x3D},//Q
{0x00,0x41,0x7F,0x49,0x4C,0x33},//R
{0x00,0x32,0x49,0x49,0x49,0x26},//S
{0x00,0x60,0x41,0x7F,0x41,0x60},//T
{0x00,0x7E,0x01,0x01,0x01,0x7E},//U-30
{0x00,0x7C,0x02,0x01,0x02,0x7C},//V
{0x00,0x7C,0x03,0x3C,0x03,0x7C},//W
{0x00,0x43,0x24,0x18,0x24,0x43},//X
{0x00,0x60,0x18,0x07,0x18,0x60},//Y
{0x00,0x63,0x45,0x49,0x51,0x63},//Z-35
{0x00,0x00,0x00,0x01,0x00,0x00},//.
{0x00,0x14,0x14,0x14,0x14,0x14},//=
{0x00,0x08,0x08,0x3E,0x08,0x08},//+
{0x00,0x80,0x80,0x80,0x80,0x80},//-
{0x00,0x00,0x00,0x24,0x00,0x00},//:-40
};
const unsigned char hanzi[][24]={//12X12 Chinese Point code 玩园地单片机频率电压测量
{0x00,0x44,0x44,0x7F,0x44,0x08,0x48,0x4F,0x48,0x4F,0x48,0x08,0x00,0x20,0x20,0xC0,0x40,0x10,0x60,0x80,0x00,0xE0,0x10,0x70},
{0x00,0x00,0xFF,0x84,0xA4,0xA7,0xA4,0xA7,0xA4,0x84,0x80,0xFF,0x00,0x00,0xF0,0x50,0x90,0x10,0x10,0x90,0x50,0xD0,0x10,0xF0},
{0x00,0x08,0x08,0xFF,0x08,0x04,0x3F,0x08,0xFF,0x10,0x21,0x3F,0x00,0x20,0x20,0xC0,0x40,0x00,0xE0,0x10,0x90,0x10,0x10,0x70},
{0x00,0x00,0x3E,0xAA,0x6A,0x2A,0x3F,0x2A,0x6A,0xAA,0x3E,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0xF0,0x80,0x80,0x80,0x80,0x80},
{0x00,0x00,0x00,0x7F,0x09,0x09,0x09,0x09,0xF9,0x09,0x08,0x08,0x00,0x10,0x60,0x80,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00},
{0x00,0x11,0x16,0xFF,0x14,0x02,0x7F,0x40,0x40,0x7F,0x00,0x00,0x00,0x00,0x00,0xF0,0x10,0x20,0xC0,0x00,0x00,0xE0,0x10,0x70},
{0x00,0x08,0x7B,0x08,0xFF,0x48,0x49,0x9F,0xB0,0xD7,0x90,0x9F,0x00,0x90,0x10,0x20,0x40,0x80,0x00,0x90,0x20,0xC0,0x20,0x90},
{0x00,0x40,0x51,0x4A,0x59,0x6B,0xCD,0x4B,0x51,0x4A,0x51,0x40,0x00,0x40,0x40,0x40,0x40,0x40,0xF0,0x40,0x40,0x40,0x40,0x40},
{0x00,0x3F,0x24,0x24,0x24,0xFF,0x24,0x24,0x24,0x3F,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0x10,0x70},
{0x00,0x00,0x7F,0x40,0x42,0x42,0x42,0x5F,0x42,0x42,0x42,0x40,0x00,0x10,0xE0,0x10,0x10,0x10,0x10,0xF0,0x10,0x90,0x50,0x10},
{0x00,0x44,0x22,0x7F,0x40,0x5F,0x40,0x7F,0x00,0x3F,0x00,0xFF,0x00,0x20,0x40,0x90,0x20,0xC0,0x20,0x90,0x00,0x80,0x10,0xF0},
{0x00,0x10,0xFF,0x95,0x95,0x95,0xDF,0xB5,0x95,0x95,0xFF,0x10,0x00,0x10,0x50,0x50,0x50,0x50,0xF0,0x50,0x50,0x50,0x50,0x10},
};
//Write Plus
void wri(){
GPIO_CLR(MKL_PORTD,0);
GPIO_SET(MKL_PORTD,0);
}
//Write 1 byte to LCD,dt:data/com ata-1,Command-0
void b2l(unsigned char dt,unsigned char com){
unsigned char i;
if(com==1){GPIO_SET(MKL_PORTD,2);}else{GPIO_CLR(MKL_PORTD,2);}
for(i=0;i<8;i++){
if(dt&0x80){GPIO_SET(MKL_PORTD,1);}else{GPIO_CLR(MKL_PORTD,1);}
dt=dt<<1;
wri();
}
}
//Set LCD col:0-102 pag:0-8
void setXY(unsigned char pag,unsigned char col){
b2l(0xB0+pag,0);//page
col+=0x04;//+4-->4bit||正向显示时,注释掉
b2l(0x10+((col&0xF0)>>4),0);//row-H4
b2l(col&0x0F,0);//row-L4
}
//LCD Clear
void lcdClear(void){
unsigned char pag,col;
for(pag=0;pag<8;pag++){setXY(pag,0);
for(col=0;col<132;col++){b2l(0x00,1);};}
}
//c:Char,cha[]
void c2l(unsigned char pag,unsigned char col,unsigned char c){
unsigned char line;
setXY(pag,col*6);
for (line=0;line<6;line++) b2l(asc2[c][line],1);
}
//12X12 dots LCD disp,row,page:,c:,han
void h2l(unsigned char pag, unsigned char col,unsigned char c){
unsigned char i;
setXY(pag,col*6);
for(i=0;i<12;i++){b2l(hanzi[c],1);}
setXY(pag-1,col*6);
for(i=12;i<24;i++){b2l(hanzi[c],1);}
}
//Like 0108LCD Initial
void lcdInit(void){
DelayMs(1000);
GPIO_CLR(MKL_PORTD,3);//Reset LCD
DelayMs(1000);
GPIO_SET(MKL_PORTD,3);
DelayMs(1000);
b2l(0xAE,0);//AE=关闭显示/AF=开显示
b2l(0xE2,0);//LCD初始化
b2l(0xA0,0);//刷新行顺序A0=1~132列/A1=132~1
b2l(0xC0,0);//刷新纵顺序C0=1~64行/C8=64~1||A0+C8下句col去掉4
b2l(0xA2,0);//A2=1/65=1/7__A3=1/65=1/9速率
DelayMs(1);
b2l(0x2F,0);//电源模式28+VC+VR+VF
DelayMs(50);
b2l(0x23,0);//20~27=1.9,2.19,2.55,3.02,3.61,4.35,5.29,6.48V/偏压
DelayMs(50);
b2l(0x81,0);//V0电压,后跟参数
b2l(0x28,0);//000000~111111=0~63=8.83~11.17V/30=10V
DelayMs(50);
b2l(0xA4,0);//A4-全显Off/A5-全显On[全黑]
b2l(0x10,0);//显示列Column高4开始0x10+0000~1111
b2l(0x00,0);//显示列Column低4开始0x10+0000~1111
b2l(0xAF,0);//开始显示
DelayMs(200);
}
//Display BaseData
void dispBase(void){
c2l(3,5,29);c2l(3,6,14);c2l(3,7,28);c2l(3,8,29);c2l(3,10,10);c2l(3,11,13);c2l(3,12,12);//Test ADC
c2l(3,14,19);c2l(3,15,28);c2l(3,16,26);c2l(3,18,25);c2l(3,19,32);c2l(3,20,22);//JSQ PWM
c2l(2,5,19);c2l(2,6,28);c2l(2,7,26);c2l(2,8,40);//JSQ
c2l(1,5,10);c2l(1,6,0);c2l(1,7,40);c2l(1,13,10);c2l(1,14,1);c2l(1,15,40);//A0:A1:
c2l(0,5,10);c2l(0,6,2);c2l(0,7,40);c2l(0,13,10);c2l(0,14,3);c2l(0,15,40);//A2:A3:
}
//Display Messege data
void dispMes(void){
c2l(2,9,(t0/100000)%10);c2l(2,10,(t0/10000)%10);c2l(2,11,(t0/1000)%10);c2l(2,12,(t0/100)%10);c2l(2,13,(t0/10)%10);c2l(2,14,t0%10);
//c2l(6,40,(tData[1]/10000)%10+16);c2l(6,41,(tData[1]/1000)%10+16);c2l(6,42,(tData[1]/100)%10+16);c2l(6,43,(tData[1]/10)%10+16);c2l(6,44,(tData[1])%10+16);
//c2l(8,40,(tData[2]/10000)%10+16);c2l(8,41,(tData[2]/1000)%10+16);c2l(8,42,(tData[2]/100)%10+16);c2l(8,43,(tData[2]/10)%10+16);c2l(8,44,(tData[2])%10+16);
//c2l(10,40,(tt0/10000)%10+16);c2l(10,41,(tt0/1000)%10+16);c2l(10,42,(tt0/100)%10+16);c2l(10,43,(tt0/10)%10+16);c2l(10,44,(tt0)%10+16);
//c2l(12,40,(tdin/1000)%10+16);c2l(12,41,(tdin/100)%10+16);c2l(12,42,(tdin/10)%10+16);c2l(12,43,(tdin)%10+16);
//c2l(4,11,(tt[0])%10+16);c2l(6,11,(tt[1])%10+16);c2l(8,11,(tt[2])%10+16);
}
//Chinese
void disHz(void){
int i,j,k=0;
for(i=0;i<2;i++){
for(j=5;j<20;j+=2){
h2l(4-(i*2+1),j,k);
if(k>10){k=0;}else{k++;}
}
}
}
//ASCII
void disAsc(void){
int i,j,k=0;
for(i=0;i<4;i++){
for(j=5;j<21;j++){
c2l(3-i,j,k);
if(k>39){k=0;}else{k++;}
}
}
}
//Delayer
void DelayMs(int counter){
int i,j;
for(i=0;i<counter;i++){for(j=0;j<i;j++){;}}
}
主程序main.c
//102x32 KS0713 BL-LCD Test I/O for SPI
#include "includes.h"
#include "lcd.h"
#define da1 1U
#define da0 0U
INT32U t0,tt,k,js,duty,duty1,duty2,speed,js;
INT16U adcVal,value,value2,value3,dir1,dir2,ctrl,ford,left,right,x,y,z;
INT8U status0_value;
//Delayer moster 65536X65535 system clock
void delay(INT16U count){
INT16U i,j;
for(i=0;i<count;i++){for(j=0;j<i;j++);}
}
//I/O Instial
void ioInit(void){
//All IO Clock Enable
SIM_SCGC5 |=(SIM_SCGC5_PORTA_MASK|SIM_SCGC5_PORTB_MASK|SIM_SCGC5_PORTC_MASK|SIM_SCGC5_PORTD_MASK|SIM_SCGC5_PORTE_MASK);
//IO Selected
IO_FUN_SEL(ck,ckPin,da1);//LCD Clock
IO_FUN_SEL(da,daPin,da1);//LCD Data
IO_FUN_SEL(cd,cdPin,da1);//Cmd:1=Data & 0=Command
IO_FUN_SEL(res,resPin,da1);//Reset LCD
//IO Director
GPIO_DDR_OUTPUT(ck,ckPin);//LCD Clock
GPIO_DDR_OUTPUT(da,daPin);//LCD Data
GPIO_DDR_OUTPUT(cd,cdPin);//Cmd:1=Data & 0=Command
GPIO_DDR_OUTPUT(res,resPin);//Reset LCD:- Enable*/
}
//MAIN Program
int main(void){
SystemInit();
ioInit();
lcdInit();
lcdClear();
dispBase();
delay(200);
while(1){
disAsc();
t0++;
delay(4000);
lcdClear();
t0++;
disHz();
t0++;
delay(4000);
lcdClear();
dispBase();
dispMes();
t0++;
delay(4000);
lcdClear();
}
}
以上程序拷贝到各自的文件中,include他们就可以正确运行。因为还没有做低功耗测试,所以不给工作电流。上述测试的主频大约为48MHz,将来低功耗测试会采用主频低于24MHz或采用RTC时钟——32768Hz。附带KS0713LCD资料。
照片如下:
|