在线时间613 小时
UID252169
注册时间2010-12-5
NXP金币0
TA的每日心情 | 开心 2019-2-14 16:49 |
---|
签到天数: 296 天 连续签到: 1 天 [LV.8]以坛为家I
金牌会员
 
- 积分
- 4473
- 最后登录
- 2020-4-14
|
本帖最后由 zhjb1 于 2019-2-16 07:43 编辑
首先认为J_VFD接口的逻辑定义是正确的,见截图0_21。
这是8位并口的4X20字符LCD,是否点阵LCD需要驱显后再看。
1,2脚是电源,3脚是对比度调整不用,4是数据/命令寄存器选择——sreg,5是读写——srws,6相当于E写信号——sclk,7~14是8位数据线。需要定义8位宽的BUS和3个控制信号引脚。为此定义一个2004.h的文档,创建一个文件夹incs,将文件夹设置进来,将文件导入。2004.h内容如下,下边的代码是驱显1602的,需要改:
//LCD1602 Include
DigitalOut sreg(P2_8);//sreg=1Data/=0Command
DigitalOut srws(P2_9);//srws=1Read/=0Write
DigitalOut sclk(P2_10);//sclk=1->0Write
BusOut myBus(P2_0,P2_1,P2_2,P2_3,P2_4,P2_5,P2_6,P2_7);//LSB->MSB
//LCD Write,Num:0
void wri(void){sclk=0;wait(0.00001);sclk=1;}//wait(0.00001);sclk=0;}
//Send one word of data to the LCD,then clock it
void b2l(char dat,char com){//dat-Data,com=0-Command,=1Data
srws=0;
wait(0.00001);
sreg=com;//If com is high
myBus=dat;
wait(0.00001);
wri();
srws=1;
}
//Set X,Y
void setXY(char x,char y){
char addr;
if(y==0)addr=0x80;else addr=0xC0;
b2l(addr+x,0);
}
//Data Write to LCD,Num:x-,y-,c-ASCII Table
void c2l(char x,char y,char c){
setXY(x,y);
b2l(c,1);
}
//LCD Initial
void lcdInit(void){//Set to 4-bit mode
b2l(0x02,0);//Reset LCD
wait(0.1);
b2l(0x38,0);//28=High 4bits Data/38=8bits Data=5X7 Dots ASCII
wait(0.001);
b2l(0x06,0);//L2=1|L1=1+Up/L1=0-Dw//L0=1Move/L0=0Fix
wait(0.001);
b2l(0x0C,0);//L3=1|L2=1CorsDisp/L2=0Not//L1=1CousOn/L1=0Off//L0=1Flash/L0=9NotFlash
wait(0.001);
//b2l(0x80,0);//DD ram=00
//wait(0.001);
b2l(0x38,0);//L4=1Move word/L4=0move Cursor//L3=1 Right/L3=0 Left
wait(0.001);
b2l(0x01,0);//LCD Clear
wait(0.01);
}
一点动静也没有,于是静态测量引脚,发现截图0_21的5脚不是连接在P2_9上,而是连接在P0_22上!不知是因为什么,图纸与硬件对不上!以后的测试就会想抄板一样每个引脚都静态测试吗?测试的热情很受打击!
改过来在经过一番计算和测试最终的代码如下:
//LCD2004 Include
DigitalOut sreg(P2_8);//sreg=1Data/=0Command
DigitalOut srws(P0_22);//srws=1Read/=0Write
DigitalOut sclk(P2_10);//sclk=1->0Write
BusOut myBus(P2_0,P2_1,P2_2,P2_3,P2_4,P2_5,P2_6,P2_7);//LSB->MSB
extern int k;
//LCD Write,Num:0
void wri(void){sclk=0;wait(0.00001);sclk=1;}//wait(0.00001);sclk=0;}
//Send one word of data to the LCD,then clock it
void b2l(char dat,char com){//dat-Data,com=0-Command,=1Data
srws=0;
wait(0.00001);
sreg=com;//If com is high
myBus=dat;
wait(0.00001);
wri();
srws=1;
}
//Set X,Y
void setXY(char x,char y){
char addr;
/*if(y==0)addr=0x80;else addr=0xC0;*/
switch(y){
case 1:
addr=0xC0;break;
case 2:
addr=0x94;break;
case 3:
addr=0xD4;break;
default:
addr=0x80;break;
}
b2l(addr+x,0);
}
//Data Write to LCD,Num:x-,y-,c-ASCII Table
void c2l(char x,char y,char c){
setXY(x,y);
b2l(c,1);
}
//LCD Initial
void lcdInit(void){//Set to 4-bit mode
b2l(0x02,0);//Reset LCD
wait(0.1);
b2l(0x38,0);//28=High 4bits Data/38=8bits Data=5X7 Dots ASCII
wait(0.001);
b2l(0x06,0);//L2=1|L1=1+Up/L1=0-Dw//L0=1Move/L0=0Fix
wait(0.001);
b2l(0x0C,0);//L3=1|L2=1CorsDisp/L2=0Not//L1=1CousOn/L1=0Off//L0=1Flash/L0=9NotFlash
wait(0.001);
//b2l(0x80,0);//DD ram=00
//wait(0.001);
b2l(0x38,0);//L4=1Move word/L4=0move Cursor//L3=1 Right/L3=0 Left
wait(0.001);
b2l(0x01,0);//LCD Clear
wait(0.01);
}
//Display AscII
void dispAsc2(void){
int i,lineDisp;
for(lineDisp=0;lineDisp<4;lineDisp++){
for(i=0;i<20;i++){
c2l(i,lineDisp,k);
wait(0.00001);
if(k<=0x80)k++;else if(k<0xA0)k=0xA0;
if(k>=0xA0 & k<=0xFF)k++;else if(k>0xFF)k=0x20;
}
}
}
最后一个函数使用内置ASCII码刷屏,将高端的扩展ASCII码都刷屏。
main主程序代码:
#include "mbed.h"
#include "2004.h"
DigitalOut led1(LED1);
DigitalOut led4(LED4);
int k=0x20;
//Led Test
void ledTest(void){
led1=!led1;led4=!led4;
wait(0.1);
}
int main(){
led1=1;led4=1;
lcdInit();
b2l(0x01,0);//Clear LCD
while(1){
dispAsc2();
//c2l(0,0,0x31);c2l(1,1,0x32);c2l(2,2,0x33);c2l(3,3,0x34);//Test Row & Col
ledTest();
wait(2);
b2l(0x01,0);//Clear LCD
wait(0.01);
}
}
结果见动画照片0_22。
下边将板载ADC的测试结果显示在LCD上。
主程序main前边增加两个函数:
//Distply Base Mes,Num:x-,y-,c-ASCII Table
void dispBase(void){
c2l(0,0,0x4E);c2l(1,0,0x58);c2l(2,0,0x50);c2l(3,0,0x20);c2l(4,0,0x4C);c2l(5,0,0x50);//NXP LP
c2l(6,0,0x43);c2l(7,0,0x31);c2l(8,0,0x37);c2l(9,0,0x36);c2l(10,0,0x38);//c2l(11,0,0x20);//C1768
c2l(12,0,0x54);c2l(13,0,0x65);c2l(14,0,0x73);c2l(15,0,0x74);//c2l(16,0,0x20);//Test
c2l(17,0,0x5F);c2l(18,0,0x5A);c2l(19,0,0x4C);//ZL
c2l(0,1,0x4A);c2l(1,1,0x53);c2l(2,1,0x51);c2l(3,2,0x3D);//jsq=
c2l(0,2,0x41);c2l(1,2,0x44);c2l(2,2,0x43);c2l(3,2,0x3A);c2l(4,2,0x3D);//ADC0=
}
//Display Measerge
void dispMes(void){
c2l(4,1,(jsq/100000)%10+48);c2l(5,1,(jsq/10000)%10+48);c2l(6,1,(jsq/1000)%10+48);c2l(7,1,(jsq/100)%10+48);c2l(8,1,(jsq/10)%10+48);c2l(9,1,(jsq)%10+48);//JSQ
c2l(5,2,int(val0*10)%10+48);c2l(6,2,int(val0*100)%10+48);c2l(7,2,int(val0*100)%10+48);c2l(8,2,int(val0*1000)%10+48);//ADC0
}
主程序改为:
int main(){
led1=1;led4=1;
lcdInit();
b2l(0x01,0);//Clear LCD
wait(0.02);
dispBase();
while(1){
jsq++;
val0=adc0.read();
dispMes();
ledTest();
//wait(0.02);
}
}
运行结果见照片0_23,0_24。结果发现其ADC的值非常非常稳定!分析原因:因为是浮点数,按照取前有效4位数值转换成十进制数的结果吧。照片0_25是LCD驱显特写。
|
|