在我们的这次测试中,计划采用ARMmbed的过程来开发,为了验证网上有许多人认为ARMmbed是小儿科的东西,只能做些简单的玩意——没有任何恶意,仅仅是验证;其次,看看mbed到底能完成什么类型的工程项目。我们的预设方案中包括:ADC、PWM、脉冲产生和检测、光信号采集和计算处理、控制运动体跟踪——最后一点有点难,就像二中学习了环境采样芯片VEML6040资料后,它的响应范围很宽,但灵敏度和散射角都不十分理想,只能实验后决定。
计划采用Embeded Workbench IAR7.x开发软件,工程采用ARMmbed库文件。
在我们的应用中,此款开发板需要面临的任务较多,因此首先需要将显示改成设计需要的内容:有程序计数器、ADC、PWM、等,再加上RGB+W,重新设计后按照要求更改LCD显示和编程。看资料,这款LCD属于常用的那种小型128x64的LCD,应用很简单。为了模块化,将与LCD有关的单独设置一个文档:lcm.h,下边直接给出代码:
lcm.h:
DigitalOut sres(P0_13);
DigitalOut sreg(P0_26);
DigitalOut sclk(P0_25);
DigitalOut sdat(P0_24);
DigitalOut schi(P0_17);
//128x64 LCD ASCII Codes
const unsigned char asc2[][8]={//8x8 Dots 32 to 127 + caratteri alfa_omega a seguire
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//space
{0x00,0x1c,0x22,0x24,0x18,0x16,0x00,0x00},//!-1=32
{0x00,0x00,0x07,0x00,0x07,0x00,0x00,0x00},//"
{0x00,0x02,0x04,0x78,0x10,0x0c,0x02,0x00},//#
{0x00,0x7e,0x15,0x15,0x15,0x0a,0x00,0x00},//$
{0x00,0x23,0x13,0x08,0x64,0x62,0x00,0x00},//%
{0x00,0x36,0x49,0x55,0x22,0x50,0x00,0x00},//&
{0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00},//'
{0x00,0x00,0x1C,0x22,0x41,0x00,0x00,0x00},//(
{0x00,0x00,0x41,0x22,0x1C,0x00,0x00,0x00},//)
{0x00,0x14,0x08,0x3E,0x08,0x14,0x00,0x00},// /-10=42
{0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00},//+
{0x00,0x00,0x50,0x30,0x00,0x00,0x00,0x00},//;
{0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00},//-
{0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00},//.
{0x00,0x20,0x10,0x08,0x04,0x02,0x00,0x00},///
{0x00,0x3E,0x51,0x49,0x45,0x3E,0x00,0x00},//0
{0x00,0x00,0x42,0x7F,0x40,0x00,0x00,0x00},//1
{0x00,0x42,0x61,0x51,0x49,0x46,0x00,0x00},//2
{0x00,0x21,0x41,0x45,0x4B,0x31,0x00,0x00},//3
{0x00,0x18,0x14,0x12,0x7F,0x10,0x00,0x00},//4-20
{0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00},//5
{0x00,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00},//6
{0x00,0x01,0x01,0x79,0x05,0x03,0x00,0x00},//7
{0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00},//8
{0x00,0x06,0x49,0x49,0x29,0x1E,0x00,0x00},//9
{0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00},//:
{0x00,0x00,0x56,0x36,0x00,0x00,0x00,0x00},//;
{0x00,0x08,0x14,0x22,0x41,0x00,0x00,0x00},//<
{0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00},//=
{0x00,0x00,0x41,0x22,0x14,0x08,0x00,0x00},//>-30
{0x00,0x02,0x01,0x51,0x09,0x06,0x00,0x00},//?
{0x00,0x32,0x49,0x79,0x41,0x3E,0x00,0x00},//@
{0x00,0x7E,0x11,0x11,0x11,0x7E,0x00,0x00},//A
{0x00,0x41,0x7F,0x49,0x49,0x36,0x00,0x00},//B
{0x00,0x3E,0x41,0x41,0x41,0x22,0x00,0x00},//C
{0x00,0x41,0x7F,0x41,0x41,0x3E,0x00,0x00},//D
{0x00,0x7F,0x49,0x49,0x49,0x49,0x00,0x00},//E
{0x00,0x7F,0x09,0x09,0x09,0x01,0x00,0x00},//F
{0x00,0x3E,0x41,0x41,0x49,0x7A,0x00,0x00},//G
{0x00,0x7F,0x08,0x08,0x08,0x7F,0x00,0x00},//H-40
{0x00,0x00,0x41,0x7F,0x41,0x00,0x00,0x00},//I
{0x00,0x20,0x40,0x41,0x3F,0x01,0x00,0x00},//J
{0x00,0x7F,0x08,0x14,0x22,0x41,0x00,0x00},//K
{0x00,0x7F,0x40,0x40,0x40,0x40,0x00,0x00},//L
{0x00,0x7F,0x02,0x0C,0x02,0x7F,0x00,0x00},//M
{0x00,0x7F,0x06,0x08,0x30,0x7F,0x00,0x00},//N
{0x00,0x3E,0x41,0x41,0x41,0x3E,0x00,0x00},//O
{0x00,0x7F,0x09,0x09,0x09,0x06,0x00,0x00},//P
{0x00,0x3E,0x41,0x51,0x21,0x5E,0x00,0x00},//Q
{0x00,0x7F,0x09,0x19,0x29,0x46,0x00,0x00},//R-50
{0x00,0x26,0x49,0x49,0x49,0x32,0x00,0x00},//S
{0x00,0x01,0x01,0x7F,0x01,0x01,0x00,0x00},//T
{0x00,0x3F,0x40,0x40,0x40,0x3F,0x00,0x00},//U
{0x00,0x1F,0x20,0x40,0x20,0x1F,0x00,0x00},//V
{0x00,0x7F,0x20,0x18,0x20,0x7F,0x00,0x00},//W
{0x00,0x63,0x14,0x08,0x14,0x63,0x00,0x00},//X
{0x00,0x07,0x08,0x70,0x08,0x07,0x00,0x00},//Y
{0x00,0x61,0x51,0x49,0x45,0x43,0x00,0x00},//Z
{0x00,0x00,0x7F,0x41,0x41,0x00,0x00,0x00},//[
{0x00,0x02,0x04,0x08,0x10,0x20,0x00,0x00},////-60
{0x00,0x00,0x41,0x41,0x7F,0x00,0x00,0x00},//]
{0x00,0x04,0x02,0x01,0x02,0x04,0x00,0x00},//^
{0x00,0x40,0x40,0x40,0x40,0x40,0x00,0x00},//_
{0x00,0x00,0x00,0x07,0x05,0x07,0x00,0x00},//' Insty
{0x00,0x20,0x54,0x54,0x54,0x78,0x00,0x00},//a
{0x00,0x7F,0x48,0x44,0x44,0x38,0x00,0x00},//b
{0x00,0x38,0x44,0x44,0x44,0x28,0x00,0x00},//c
{0x00,0x38,0x44,0x44,0x48,0x7F,0x00,0x00},//d
{0x00,0x38,0x54,0x54,0x54,0x18,0x00,0x00},//e
{0x00,0x00,0x08,0x7E,0x09,0x02,0x00,0x00},//f-70
{0x00,0x0C,0x52,0x52,0x4C,0x3E,0x00,0x00},//g
{0x00,0x7F,0x08,0x04,0x04,0x78,0x00,0x00},//h
{0x00,0x00,0x44,0x7D,0x40,0x00,0x00,0x00},//i
{0x00,0x20,0x40,0x44,0x3D,0x00,0x00,0x00},//j
{0x00,0x00,0x7F,0x10,0x28,0x44,0x00,0x00},//k
{0x00,0x00,0x41,0x7F,0x40,0x00,0x00,0x00},//l
{0x00,0x7C,0x04,0x78,0x04,0x78,0x00,0x00},//m
{0x00,0x7C,0x08,0x04,0x04,0x78,0x00,0x00},//n
{0x00,0x38,0x44,0x44,0x44,0x38,0x00,0x00},//o
{0x00,0x7E,0x0C,0x12,0x12,0x0C,0x00,0x00},//p-80
{0x00,0x0C,0x12,0x12,0x0C,0x7E,0x00,0x00},//q
{0x00,0x7C,0x08,0x04,0x04,0x08,0x00,0x00},//r
{0x00,0x58,0x54,0x54,0x54,0x64,0x00,0x00},//s
{0x00,0x04,0x3F,0x44,0x40,0x20,0x00,0x00},//t
{0x00,0x3C,0x40,0x40,0x3C,0x40,0x00,0x00},//u
{0x00,0x1C,0x20,0x40,0x20,0x1C,0x00,0x00},//v
{0x00,0x3C,0x40,0x30,0x40,0x3C,0x00,0x00},//w
{0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00},//x
{0x00,0x1C,0xA0,0xA0,0x90,0x7C,0x00,0x00},//y
{0x00,0x44,0x64,0x54,0x4C,0x44,0x00,0x00},//z-90
{0x00,0x00,0x08,0x36,0x41,0x00,0x00,0x00},//{
{0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x00},//|
{0x00,0x00,0x41,0x36,0x08,0x00,0x00,0x00},//}
{0x00,0x08,0x04,0x08,0x10,0x08,0x00,0x00} //~
};
//Delayer
void delay0(int counter){
int i;
for(i=0;i
}
//Write Plus
void wri(void){ sclk=0;sclk=1;}
//a B Data to LCD,dt:data,com:1-data/0-command
void b2l(unsigned char dt,unsigned char com){
unsigned char i;
schi=0;
if(com) sreg=1;else sreg=0;
for(i=0;i<8;i++){
if(dt&0x80){sdat=1;}else{sdat=0;};
dt=dt<<1;
wri();
}
schi=1;
}
//Set X,Y
void setXY(unsigned char pag,unsigned char col){
b2l(0xB0+pag,0);//page3~0第1~第3行
b2l(0x10+((col&0xF0)>>4),0);//row-H4
b2l(col&0x0F,0);//row-L4
}
//Display a ASCII code
void c2l(unsigned char pag,unsigned char col,unsigned char c){
unsigned char line;
setXY(pag,col*8);
for(line=0;line<8;line++) b2l(asc2[c][line],1);
}
//LCD Clear
void lcdClear(void){
unsigned char pag,col;
for(pag=0xB8;pag>=0xB0;pag--){
b2l(pag,0);
b2l(0x10,0);
b2l(0x00,0);
for(col=0;col<132;col++){b2l(0x00,1);}
}
}
//12864LCD Initial
void lcdInit(void){
sres=0;
delay0(10000);
sres=1;
delay0(10000);
b2l(0xAE,0);//AE=Disp Off/AF=Disp On
b2l(0xE2,0);//LCD Initial
delay0(1000);
b2l(0xA0,0);//Refresh Colum:A0=1-->132/A1=132-->1
b2l(0xC8,0);//Refresh COM:C0=1-->64/C8=64-->1||A0+C8:col--X-->4
b2l(0xA2,0);//A2=1/65=1/7__A3=1/65=1/9
b2l(0x2F,0);//Power Mode:28+VC+VR+VF
delay0(500);
b2l(0x24,0);//20->27=1.9,2.19,2.55,3.02,3.61,4.35,5.29,6.48V/Bian Vol
delay0(500);
b2l(0x81,0);//V0 Vol,After:Num
b2l(0x20,0);//000000~111111=0~63=8.83~11.17V/30=10V
delay0(500);
b2l(0xA4,0);//A4-All Off/A5-All On
b2l(0x10,0);//Column High 4 start:0x10+0000->1111
b2l(0x00,0);//Column Low 4 start:0x10+0000->1111
b2l(0x40,0);//40+xxxxxx=Disp From 0->63
b2l(0x10,0);//10+xxxx=Disp Column Migh 4 bts
b2l(0x00,0);//00+xxxx=Disp Column low bits xxxxxxxx=0->131
b2l(0xAD,0);//AC=Corser Off/AD=Corser On/After Num
b2l(0x03,0);//00=OFF/01=1S/02=0.5S/03=All On
b2l(0xAF,0);//Start Display
}
主函数中目前只编写了显示驱动和部分预设代码:
#include "mbed.h"
#include "lcm.h"
DigitalOut myled0(P0_16);//程序运行测试LED
//Define ADC
AnalogIn adc0(P0_20);
AnalogIn adc1(P0_21);
PwmOut pwm0(P0_0);
PwmOut pwm1(P0_1);
Ticker tick;//Time Interupt Clock
DigitalOut plus27(P0_27);//P0_27 Pull Output
int32_t js;
int16_t pj28,val0,val1,dut0=900,dut1=800,ddt0=3,ddt1=2;
void tipInt(void){plus27 =!plus27;}
void dispBase(void){
c2l(0,0,42);c2l(0,1,51);//JS
c2l(1,0,33);c2l(1,1,16);c2l(1,8,33);c2l(1,9,17);//A0,A1
c2l(2,0,48);c2l(2,1,55);c2l(2,2,17);c2l(2,8,48);c2l(2,9,55);c2l(2,10,18);//PW0PW1
c2l(3,0,48);c2l(3,1,42);c2l(3,2,18);c2l(3,3,24);//PJ28
c2l(6,0,50);c2l(6,1,26);c2l(6,8,39);c2l(6,9,26);//R:G:
c2l(7,0,34);c2l(7,1,26);c2l(7,8,55);c2l(7,9,26);//b:W:
}
void dispMes(void){
c2l(0,3,16+(js/100000)%10);c2l(0,4,16+(js/10000)%10);c2l(0,5,16+(js/1000)%10);c2l(0,6,16+(js/100)%10);c2l(0,7,16+(js/10)%10);c2l(0,8,16+(js)%10);
c2l(1,3,16+(val0/1000)%10);c2l(1,4,16+(val0/100)%10);c2l(1,5,16+(val0/10)%10);c2l(1,6,16+(val0)%10);
c2l(1,11,16+(val1/1000)%10);c2l(1,12,16+(val1/100)%10);c2l(1,13,16+(val1/10)%10);c2l(1,14,16+(val1)%10);
c2l(2,4,16+(dut0/100)%10);c2l(2,5,16+(dut0/10)%10);c2l(2,6,16+(dut0)%10);
c2l(2,12,16+(dut1/100)%10);c2l(2,13,16+(dut1/10)%10);c2l(2,14,16+(dut1)%10);
//c2l(5,4,(pj28/100)%10);c2l(6,4,(pj28/10)%10);c2l(7,4,(pj28)%10);
}
void ioInit(void){
pwm0.period(0.002f);//pwm0
pwm1.period(0.001f);//pwm1
myled0=0;
}
int main(){
ioInit();
lcdInit();
lcdClear();
dispBase();
tick.attach(&tipInt,0.005f);
while(true){
val0=adc0.read();
val1=adc1.read();
if(dut0>900){dut0=0;}
dut0 +=ddt0;pwm0=dut0;
if(dut1>800){dut1=0;}
dut1 +=ddt1;pwm1=dut1;
myled0=!myled0;
js++;
dispMes();
wait(0.2);
}
}
上述程序中,主要是验证显示结果,其他的都没有真正实现,只是演示效果而已。结果见照片31,32,33。
|