📄 lcd.c
字号:
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#include "funtion.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define cs_s PTH|=0x08
#define cs_c PTH&=~0x08
#define ck_s PTH|=0x40
#define ck_c PTH&=~0x40
#define da_s PTH|=0x20
#define da_c PTH&=~0x20
#define rd_p PTIH&0x10 //read PH4
volatile uchar kp=0;
void dy(uint t) //delay t uS
{
uchar i;
while(t--)
{
for(i=0;i<3;i++)
;
asm(nop);
}
}
void delay(uint t) //delay t mS
{
while(t--) //
{
dy(1200);
}
}
interrupt 25 void ph(void) //port H
{
if(PIFH&0x80) //遥控中断
{
dy(100);
if(m_en&&(PTIT&0xB0)==0x10) //stop
m_en=0;
}
else if(PIFH&0x01) //车上键盘
{
delay(1);
if((PTIH&0x01)==0)
m_en=0;
}
PIFH=0xff; //clean flag
}
uchar rk(void) //read keyboard
{
uchar ret=0;
uchar i;
ret=(PTIH|0xf8); //读取PH0-PH2
if(ret!=0xff)
return(ret&0x07); //有键按下,返回数据位
else //读液晶键盘
{
ret=0;
if(rd_p)
ret|=0x01;
cs_s; //hold the line
dy(10);
for(i=0;i<7;i++)
{
ret<<=1;
ck_s;
dy(10);
if(rd_p)
ret|=0x01;
ck_c;
dy(10);
}
dy(10);
cs_c;
return ret;
}
}
uchar key(void) //get keyboard value
{
uchar ret;
if(kp) //some key press condition
{
if(rk()!=0xff) //some key press conditon
return(0x80); //
else //no key press condition
{
delay(20);
if(rk()==0xff) //no key press
{
kp=0;
return(0xff);
} //
else
return(0x80);
}
}
else //no key press condition'
{
if(rk()!=0xff) //
{
delay(20);
ret=rk();
if(ret!=0xff) //some key press cfonditon]
{
if(ret==0xDF) //1-8为液晶键盘
ret=1;
else if(ret==0xBF)
ret=2;
else if(ret==0xF7)
ret=3;
else if(ret==0x7F)
ret=4;
else if(ret==0xEF)
ret=5;
else if(ret==0xFB)
ret=6;
else if(ret==0xFD)
ret=7;
else if(ret==0xFE)
ret=8;
else if(ret==0x05) //9-11为车上键盘
ret=9;
else if(ret==0x06)
ret=10;
/* else if(ret==0x03)
ret=11; //按键11被拆除*/
kp=1;
return ret;
}
else
return 0xff;
}
else
return 0xff;
}
}
void w_lcd(uchar dat_com,uchar cont) //向LCD写命令或数据,由dat_com决定
{
uchar tp[3];
uchar i,j,tmp;
tp[0]=0xf8;
if(dat_com)
tp[0]|=0x02;
tp[1]=cont&0xf0;
tp[2]=cont&0x0f;
tp[2]<<=4;
dy(10);
for(i=0;i<3;i++)
{
tmp=tp[i];
for(j=0;j<8;j++)
{
if(tmp&0x80)
da_s;
else
da_c;
tmp<<=1;
ck_s;
dy(1);
ck_c;
dy(1);
}
}
if(dat_com==0&&cont==0x01)
dy(1600);
else
dy(60); //data
}
void set(uchar sway) //seting display way
{
if(sway==0x00)
w_lcd(com,0x32), w_lcd(com,0x08); //not display
else if(sway==0x01)
w_lcd(com,0x32), w_lcd(com,0x0c), w_lcd(com,0x06); //cursor not flash, not move
else if(sway==0x02)
w_lcd(com,0x32), w_lcd(com,0x0d), w_lcd(com,0x06); //cursor flash, not move
else if(sway==0x03)
w_lcd(com,0x32), w_lcd(com,0x0c), w_lcd(com,0x07); //cursor not flash, move left when writing
else if(sway==0x04)
w_lcd(com,0x32), w_lcd(com,0x0d), w_lcd(com,0x07); //cursor flash, move ledt wehn writing
}
/*光标定位*/
void go(uchar xxx, uchar yyy)
{
w_lcd(com,0x32);
if(yyy==0)
w_lcd(com,0x80+xxx);
else if(yyy==1)
w_lcd(com,0x90+xxx);
else if(yyy==2)
w_lcd(com,0x88+xxx);
else if(yyy==3)
w_lcd(com,0x98+xxx);
}
void wc(uchar *chan) //写N个字符
{
uchar i;
for(i=0;chan[i]!='\0';i++)
w_lcd(dat,chan[i]);
}
void wn(uchar num1,uchar num2) //wtite number or leter
{
if(num1<10)
w_lcd(dat,num1+0x30);
else if(num1>10)
w_lcd(dat,num1);
if(num2<10)
w_lcd(dat,num2+0x30);
else if(num2>10)
w_lcd(dat,num2);
}
void wh(uchar const *chan) //写入N个字符(汉字) 到/x0
{
uchar i;
uchar ttp;
ttp=0xff;
for(i=0;ttp!='\0';i++)
{
ttp=*(chan+i);
w_lcd(dat,ttp);
}
}
void wu (uchar const *ch0, uchar const *ch1, uchar const *ch2, uchar const *ch30)
{
w_lcd(com,0x32); //切换到基本指令集
w_lcd(com,0x01);
set(1);
go(0,0);
wh(ch0); //write line 0
go(0,1);
wh(ch1); //write line 1
go(0,2);
wh(ch2);
go(0,3);
wh(ch30);
}
void clr_pr(void) //清屏
{
uchar i,j;
w_lcd(com,0x32); //切换到基本指令集
w_lcd(com,0x01); //CLR
set(0); //不显示光标
w_lcd(com,0x34);
for(j=0;j<32;j++)
{
for(i=0;i<8;i++)
{
w_lcd (com,0x80+j); //写Y地址
w_lcd (com,0x80+i); //写X地址
w_lcd(dat,0x00); //全部数据写0
w_lcd(dat,0x00); //全部数据写0
}
}
for(j=0;j<32;j++)
{
for(i=0;i<8;i++)
{
w_lcd (com,0x80+j); //写Y地址
w_lcd (com,0x88+i); //写X地址
w_lcd(dat,0x00); //全部数据写0
w_lcd(dat,0x00); //全部数据写0
}
}
}
void dr(void) //画画
{
uchar i=0;
uchar j=0;
uchar *pd;
uchar tmp[128]={
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
}; //显存
if(vc) //正在采集第二场,使用第一场
pd=rdd1;
else //正在采集第一场,使用第二场
pd=rdd2;
//将CCD采集到的数据转化为LCD的点阵数据
for(j=0;j<16;j++) //行计数
{
for(i=0;i<8;i++) //行内计数
{
if(*(pd+j*64+i*8)<GATE0)
*(tmp+j*8+i)|=0x80;
if(*(pd+j*64+i*8+1)<GATE0)
*(tmp+j*8+i)|=0x40;
if(*(pd+j*64+i*8+2)<GATE0)
*(tmp+j*8+i)|=0x20;
if(*(pd+j*64+i*8+3)<GATE0)
*(tmp+j*8+i)|=0x10;
if(*(pd+j*64+i*8+4)<GATE0)
*(tmp+j*8+i)|=0x08;
if(*(pd+j*64+i*8+5)<GATE0)
*(tmp+j*8+i)|=0x04;
if(*(pd+j*64+i*8+6)<GATE0)
*(tmp+j*8+i)|=0x02;
if((*(pd+j*64+i*8+7)<GATE0)&&(i!=7)) //一行63个点,最后一个不画
*(tmp+j*8+i)|=0x01; //*/
}
}
//在LCD 画下点阵数据
w_lcd (com,0x36); //切换到扩展指令
for(j=0;j<32;j++)
{
for(i=0;i<4;i++)
{
w_lcd(com,0x80+j); //写Y地址
w_lcd(com,0x80+i); //写X地址
w_lcd(dat,*(tmp+(j/2)*8+i*2));// (dat,imge[j*16+i*2]); //写数据
w_lcd(dat,*(tmp+(j/2)*8+i*2+1));
}
}
}
void dg(void) //画重心
{
uchar i,j;
ulong tmp[32]={ //显存
0};
char tmp1;
//将重心数据转化为LCD的点阵数据
for(i=0;i<16;i++) //一场16行
{
tmp1=*(gg1+i);
if(-32==tmp1) //左边看不到有效点
tmp1=-31;
else if(32==tmp1) //右边看不到有效点
tmp1=31;
if(tmp1<0)
{
*(tmp+(2*i))=0x80000000>>(tmp1+31);
*(tmp+(2*i)+1)=0;
}
else if(tmp1==0) //
{
*(tmp+(2*i))=1;
*(tmp+(2*i)+1)=0x80000000;
}
else //正
{
*(tmp+(2*i))=0;
*(tmp+(2*i)+1)=0x80000000>>(tmp1);
}
} //*/
//将点阵数据显示到LCD上
w_lcd (com,0x36); //切换到扩展指令
for(j=0;j<32;j++)
{
w_lcd(com,0x80+j); //写Y地址
w_lcd(com,0x88); //写X地址
w_lcd(dat,((*(tmp+(j&0xfe)))>>24)&0x00ff);// (dat,imge[j*16+i*2]); //写数据
w_lcd(dat,((*(tmp+(j&0xfe)))>>16)&0x00ff);
w_lcd(dat,((*(tmp+(j&0xfe)))>>8)&0x00ff);
w_lcd(dat,((*(tmp+(j&0xfe))))&0x00ff);
w_lcd(dat,((*(tmp+(j&0xfe)+1))>>24)&0xff);// (dat,imge[j*16+i*2]); //写数据
w_lcd(dat,((*(tmp+(j&0xfe)+1))>>16)&0x00ff);
w_lcd(dat,((*(tmp+(j&0xfe)+1))>>8)&0x00ff);
w_lcd(dat,((*(tmp+(j&0xfe)+1)))&0x00ff);
}
} //*/
void wgc(uchar *fr) //向液晶写入重心和曲率
{
uchar tmp;
/* go(4,1); //曲率
wn(' ',' ');
wn((cu%100)/10,cu%10);
//不呆见点数
go(7,1);
wn(' ',*us%10);
go(4,2); //重心
if(*gx<0)
wc(" -");
else
wc(" +");
tmp=abs(*gx);
wn(tmp/10,tmp%10); */
go(5,2);
wn(*(fr)/10,*(fr)%10);
go(7,2);
wn(*(fr+1)/10,*(fr+1)%10);
go(4,3);
wn(GATE0/10,GATE0%10);
go(7,3);
wn(GATE1/10,GATE1%10); //门槛
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -