📄 lcd_display.c
字号:
#include <hidef.h> /* common defines and macros */
#include <mc9s12xdt256.h> /* derivative information */
#include <math.h>
#pragma LINK_INFO DERIVATIVE "mc9s12xdt256"
#define VALUE_OVERFLOW 85
#define VALUE_OK 170
#define LCD_RS PTH_PTH0
#define LCD_RW PTH_PTH1
#define LCD_E PTH_PTH2
#define LCD_PSB PTM_PTM7
#define LCD_RESET PTM_PTM6
#define DATA_PORT PORTA
#define DATA_DDR DDRA
#define DDR_LCD_RS DDRH_DDRH0
#define DDR_LCD_RW DDRH_DDRH1
#define DDR_LCD_E DDRH_DDRH2
#define DDR_LCD_PSB DDRM_DDRM7
#define DDR_LCD_RESET DDRM_DDRM6
//command code
#define CMD_FUNCTION 0x30 //功能设置8位数据,基本指令
#define CMD_DISPLAY 0x0C //显示状态ON,游标OFF,反白OFF
#define CMD_CLEARDISP 0x01 //清除显示
#define CMD_CLEARADDR 0x02 //地址归位
#define CMD_DDRAMADDR 0x80 //DDRAM地址归位
//display chinese in sample
//uchar Chinese1[16]={0xC8,0xF0,0xCC,0xD8,0xB5,0xE7,0xD7,0xD3,0xBB,0xB6,0xD3,0xAD,0xC4,0xFA,0xEC,0xF4};
//uchar Chinese2[16]={0xD6,0xD0,0xCE,0xC4,0xD7,0xD6,0xBF,0xE2,0xD2,0xBA,0xBE,0xA7,0xCF,0xD4,0xCA,0xBE};
//uchar Chinese3[16]={0xC8,0xF0,0xCC,0xD8,0xB5,0xE7,0xD7,0xD3,0xBB,0xB6,0xD3,0xAD,0xC4,0xFA,0xEC,0xF4};
//uchar Chinese4[16]={0xD6,0xD0,0xCE,0xC4,0xD7,0xD6,0xBF,0xE2,0xD2,0xBA,0xBE,0xA7,0xCF,0xD4,0xCA,0xBE};
//uchar DIGITAL[20]={0xA3,0xB0,0xA3,0xB1,0xA3,0xB2,0xA3,0xB3,0xA3,0xB4,0xA3,0xB5,0xA3,0xB6,0xA3,0xB7,0xA3,0xB8,0xA3,0xB9};
//uchar Temperature_Chinese[4]={0xCe,0xc2,0xb6,0xc8};
//uchar Pressure_Chinese[4]={0xD1,0xb9,0xC1,0xa6};
//uchar Flux_Chinese[4]={0xC1,0xF7,0xC1,0xbf};
//uchar Displacement1_Chinese[6]={0xb5,0xb1,0xc7,0xb0,0xD6,0xB5};//当前值 //add at 8.2.2007
//uchar Displacement2_Chinese[6]={0xBC,0xC7,0xc2,0xbc,0xD6,0xB5};//记录值 //add at 8.2.2007
//uchar Measuring_Chinese[6]={0xB2,0xE2,0xCA,0xD4,0xD6,0xD0};
//uchar Recording_Count[6]={0xBC,0xC7,0xC2,0xBC,0xCA,0xFD};//记录数
//uchar Character1[3]={'.','.','.'};
//uchar Command_Error[8]={0xC3,0xFC,0xC1,0xEE,0xB4,0xED,0xCE,0xF3};//命令错误
//uchar System_Calibration[10]={0xCF,0xB5,0xCD,0xB3,0xB1,0xEA,0xB6,0xA8,0xD6,0xD0}; //系统标定中
//uchar Data_Transmiting[10]={0xCF,0xB5,0xCD,0xB3,0xB1,0xEA,0xB6,0xA8,0xD6,0xD0}; //数据传输中
//uchar DELETE_Chinese[6]= {0xC9,0xBE,0xB3,0xFD,0xD6,0xD0};
//uchar DELETE_Success_Chinese[8]= {0xC9,0xBE,0xB3,0xFD,0xB3,0xC9,0xB9,0xA6};
//uchar DELETE_Fail_Chinese[8]= {0xC9,0xBE,0xB3,0xFD,0xCA,0xA7,0xB0,0xDC};
//uchar Title[14]={0xB5,0xA5,0xCD,0xA8,0xb5,0xc0,0xCA,0xFD,0xB2,0xC9,0xCF,0xB5,0xCD,0xB3};
//uchar Title1[8]={0xB2,0xE2,0xC1,0xBF,0xCF,0xB5,0xCD,0xB3};//测量系统
//uchar HORIZON[8]={0xBA,0xC3,0xC4,0xCD,0xb5,0xE7,0xD7,0xD3}; //好耐电子
//uchar CurrentTime[9]={'2','0','0','7','/','1','0','/','1'}; //2007/8/10
//uchar GPS_array[3]={'G','P','S'};
uchar Speed_Chinese[4]={0xcb,0xd9,0xb6,0xc8}; //速度
uchar danwei1[5]="km/h"; //(km/h)
uchar Distance_chiness[4]={0xbe,0xe0,0xc0,0xeb}; //距离
uchar danwei2[3]="m";
uchar danwei3[3]="km";
uchar Height_Chinese[4]={0xba,0xa3,0xb0,0xce}; //海拔
uchar Star_Chinese[6]={0xce,0xc0,0xd0,0xc7,0xca,0xfd}; //卫星数
//uchar Cali_A[2]={'A','='};
//uchar Cali_B[2]={'B','='};
//uchar Char1=':';
//uchar Char2[2]={'m','m'};
uint Display_data_length=0;
uchar Speed_string[6]="0.00 ";
uchar Distance_string[7]="0.00 ";
uchar Height_string[6]="0.00 ";
extern uchar WDog1_Clear();
/**************************************************/
void WritePort(unsigned char data){
DATA_DDR=0xff; // Configure the corresponding I/O pin as an output
DATA_PORT=data;
return;
}
unsigned char ReadPort(void){
unsigned char i;
DATA_DDR=0x00; // Configure the corresponding I/O pin as an input
i=DATA_PORT;
return i;
}
/********延时程序**************************
DELAY:
MOV R6,#00H
MOV R7,#00H
DELAY1:
NOP
DJNZ R7,DELAY1
DJNZ R6,DELAY1
RET*/
void Delay(unsigned int counter){
unsigned int i=0;
unsigned int j;
for(j=0;j<counter;j++){
for(i=0;i<255;i++){}
WDog1_Clear();
}
return;
}
void Delay1(){
uchar i=0;
uchar j=0;
for(j=0;j<255;j++){
for(i=0;i<255;i++){}
//WDog1_Clear();
}
return;
}
/**********读BF和AC值************************
PR0:
PUSH ACC
MOV P0,#0FFH
CLR RS
SETB RW
SETB E
MOV COMMAND,P0
CLR E
POP ACC
RET*/
unsigned char ReadBF_AC(void){
unsigned char Command;
WritePort(0xff);
LCD_RS=0;
LCD_RW=1;
LCD_E=1;
Command= ReadPort();
LCD_E=0;
return Command;
}
/**********写指令代码************************
函数功能:写一条指令到液晶屏
输入参数:指令代码(见代码表)
输出参数:void
PR1:
PUSH ACC
CLR RS
SETB RW
PR11:MOV P0,#0FFH
SETB E
MOV A,P0
CLR E
JB ACC.7,PR11
CLR RW
MOV P0,COMMAND
SETB E
CLR E
POP ACC
RET*/
void WriteCommand(unsigned char cmdcode){
unsigned char i;
LCD_RS=0;
LCD_RW=1;
do{
WritePort(0xff);
LCD_E=1;
i= ReadPort();
LCD_E=0;
//WDog1_Clear();
}while(i&0x80);
LCD_RW=0;
WritePort(cmdcode);
LCD_E=1;
LCD_E=0;
return;
}
/**********写显示数据************************
函数功能:写显示数据DATA1到液晶屏
输入参数:显示数据DATA1
输出参数:void
PR2:
PUSH ACC
CLR RS
SETB RW
PR21:MOV P0,#0FFH
SETB E
MOV A,P0
CLR E
JB ACC.7,PR21
SETB RS
CLR RW
MOV P0,DATA1
SETB E
CLR E
POP ACC
RET*/
void WriteData(unsigned char data1){
unsigned char i;
LCD_RS=0;
LCD_RW=1;
do{
WritePort(0xff);
LCD_E=1;
i=ReadPort();
LCD_E=0;
//WDog1_Clear();
}while(i&0x80);
LCD_RS=1;
LCD_RW=0;
WritePort(data1);
LCD_E=1;
LCD_E=0;
return;
}
/**********读显示数据************************
PR3:
PUSH ACC
CLR RS
SETB RW
PR31:MOV P0,#0FFH
SETB E
MOV A,P0
CLR E
JB ACC.7,PR31
SETB RS
SETB RW
MOV P0,#0FFH
SETB E
MOV COMMAND,P0
CLR E
POP ACC
RET */
unsigned char ReadData(void){
unsigned char i;
unsigned char Command;
LCD_RS=0;
LCD_RW=1;
do{
WritePort(0xff);
LCD_E=1;
//Delay(1);
i=ReadPort();
LCD_E=0;
//Delay(1);
//WDog1_Clear();
}while(i&0x80);
LCD_RS=1;
LCD_RW=1;
WritePort(0xff);
LCD_E=1;
Command=ReadPort();
LCD_E=0;
return Command;
}
/*************写CGROM*************************
函数功能:写CGROM,按照点阵16*16自定义一个汉字(图案)
输入参数:cmdcode,data3,data2 //Command必须是0x40,0x50,0x60,0x70
输出参数:void
CG:
LCALL PR1
MOV R0,#8
CG1:
MOV DATA1,DATA3
LCALL PR2
LCALL PR2
MOV DATA1,DATA2
LCALL PR2
LCALL PR2
DJNZ R0,CG1
RET */
void WriteCGROM(unsigned char cmdcode,unsigned char data3,unsigned char data2){
unsigned char i;
WriteCommand(cmdcode);
for(i=0;i<8;i++) {
WriteData(data3);
WriteData(data3);
WriteData(data2);
WriteData(data2);
}
}
/************写DDRAM*************************
函数功能:写DDRAM,以显示CGRAM中自定义的字
输入参数:cmdcode,data2
输出参数:void
DD:
LCALL PR1
MOV R0,#8
MM: MOV DATA1,#00H
LCALL PR2
MOV DATA1,DATA2
LCALL PR2
DJNZ R0,MM
RET */
void WriteDDRAM(unsigned char cmdcode, unsigned char data2){
unsigned char i=0;
WriteCommand(cmdcode);
for(i=0;i<8;i++){
WriteData(0x00); //表示所要显示的是CGRAM中自定义的字
WriteData(data2); //data2的值是0x00,0x02,0x04,0x06,可显出四个自定义字
}
return;
}
/****************************************
INT:
PUSH ACC
PUSH DPH
PUSH DPL
PUSH PSW
CLR EX0
JNB P3.2,$
JB P3.2,$
JNB P3.2,$
SETB EX0
CLR IE0
POP PSW
POP DPL
POP DPH
POP ACC
RETI*/
/************显示一串字符*************************
函数功能:显示一个字符 ,首字符显示在偶数列
输入参数:row,column,字符编码(范围0x01-0x7f)
输出参数:void */
void WriteCharArray(unsigned char row, unsigned char column, unsigned char num, unsigned char * ptdata){
unsigned char cmdcode,i;
switch(row){
case 1:
cmdcode=0x80+(column-1)/2;
break;
case 2:
cmdcode=0x90+(column-1)/2;
break;
case 3:
cmdcode=0x88+(column-1)/2;
break;
case 4:
cmdcode=0x98+(column-1)/2;
break;
default:
cmdcode=0x80;
}
WriteCommand(cmdcode);
for(i=0;i<num;i++){
WriteData(*ptdata); //先写命令1xxxxxxxB,再写一个数据,可以显示字符(占半字)
ptdata++;
}
return;
}
uchar WriteCharArray1(unsigned char row, unsigned char column, unsigned char * ptdata){
unsigned char cmdcode;
uchar j;
switch(row){
case 1:
cmdcode=0x80+(column-1)/2;
break;
case 2:
cmdcode=0x90+(column-1)/2;
break;
case 3:
cmdcode=0x88+(column-1)/2;
break;
case 4:
cmdcode=0x98+(column-1)/2;
break;
default:
cmdcode=0x80;
}
WriteCommand(cmdcode);
j= column;
while((*ptdata!=' ')&&(j<=16)){
WriteData(*ptdata); //先写命令1xxxxxxxB,再写一个数据,可以显示字符(占半字)
ptdata++;
j++;
}
return j;
}
uchar WriteCharArray2(unsigned char row, unsigned char column, unsigned char * ptdata){
uchar cmdcode;
uchar j;
switch(row){
case 1:
cmdcode=0x80+(column-1)/2;
break;
case 2:
cmdcode=0x90+(column-1)/2;
break;
case 3:
cmdcode=0x88+(column-1)/2;
break;
case 4:
cmdcode=0x98+(column-1)/2;
break;
default:
cmdcode=0x80;
}
WriteCommand(cmdcode);
j= column;
while((*ptdata!=0)&&(j<=16)){
if((*ptdata>=0x30)&&(*ptdata<=0x39)) WriteData(*ptdata); //先写命令1xxxxxxxB,再写一个数据,可以显示字符(占半字)
else if(*ptdata=='.') WriteData(*ptdata);
else j=16;
ptdata++;
j++;
}
return j;
}
uchar WriteCharArray3(unsigned char row, unsigned char column, unsigned char * ptdata){
unsigned char cmdcode,i;
uchar j;
uchar k=0;
switch(row){
case 1:
cmdcode=0x80+(column-1)/2;
break;
case 2:
cmdcode=0x90+(column-1)/2;
break;
case 3:
cmdcode=0x88+(column-1)/2;
break;
case 4:
cmdcode=0x98+(column-1)/2;
break;
default:
cmdcode=0x80;
}
WriteCommand(cmdcode);
j= column;
for(i=0;i<8;i++){
WriteData(*ptdata);
if(*ptdata=='.') k=1;
if(k>0) k++;
if(k>3) i=8;
ptdata++;
}
/*while((*ptdata!=',')&&(j<=16)){
WriteData(*ptdata); //先写命令1xxxxxxxB,再写一个数据,可以显示字符(占半字)
if(*ptdata=='.') k=1;
if(k>0) k++;
if(k>3) j=17;;
ptdata++;
j++;
}*/
return j;
}
/************显示一个汉字*************************
函数功能:显示一个汉字
输入参数:row,column,汉字编码低位,汉字编码高位
输出参数:void */
void WriteWord(unsigned char row, unsigned char column, unsigned char hdata, unsigned char ldata){
unsigned char cmdcode;
switch(row){
case 1:
cmdcode=0x80+column-1;
break;
case 2:
cmdcode=0x90+column-1;
break;
case 3:
cmdcode=0x88+column-1;
break;
case 4:
cmdcode=0x98+column-1;
break;
default:
cmdcode=0x80;
}
WriteCommand(cmdcode);
WriteData(hdata); //写汉字时,按照编码,先写高位,后写低位
WriteData(ldata);
return;
}
/************显示一组汉字*************************
函数功能:显示一个汉字,长度不能超过8个(一行)
输入参数:row,column,num,ptarray(可以把数组名直接传递,数组名就是首地址)
输出参数:void */
void WriteWordArray(unsigned char row, unsigned char column,unsigned char num,unsigned char * ptarray){
unsigned char cmdcode,i;
switch(row){
case 1:
cmdcode=0x80+column-1;
break;
case 2:
cmdcode=0x90+column-1;
break;
case 3:
cmdcode=0x88+column-1;
break;
case 4:
cmdcode=0x98+column-1;
break;
default:
cmdcode=0x80;
}
WriteCommand(cmdcode);
for(i=0;i<num;i++) {
WriteData(*ptarray); //写汉字时,按照编码,先写高位,后写低位
ptarray++;
WriteData(*ptarray);
ptarray++;
}
return;
}
/****************液晶屏复位************************/
void LCD_Reset(void){
DDR_LCD_PSB = 1;
LCD_PSB=1;
//reset display
DDR_LCD_RESET= 1;
LCD_RESET=0;
//LCD_E=1;
Delay1();
LCD_RESET=1;
return;
}
/****************液晶屏初始化**********************/
void LCD_Init(void){
unsigned char i;
DDR_LCD_RS = 1;
DDR_LCD_RW = 1;
DDR_LCD_E = 1;
DDR_LCD_PSB = 1;
DDR_LCD_RESET= 1;
LCD_RS=0;
LCD_RW=1;
WritePort(0xff);
LCD_E=1;
i=0x30;
i=ReadPort();
LCD_E=0;
Delay1();
LCD_RS=0;
LCD_RW=1;
WritePort(0xff);
LCD_E=1;
i=0x30;
i=ReadPort();
LCD_E=0;
Delay1();
WriteCommand(CMD_FUNCTION) ; //功能设置8位数据,基本指令
WriteCommand(CMD_DISPLAY) ; //显示状态ON,游标OFF,反白OFF
WriteCommand(CMD_CLEARDISP); //清除显示
WriteCommand(CMD_CLEARADDR); //地址归位
WriteCommand(CMD_DDRAMADDR); //DDR地址归0
Delay1();
return;
}
/*****************显示HCGROM***********************/
/*void Write_HCGROM(void){
unsigned char mydata,i;
//WriteCommand(0x80);
mydata=0x02;
for (i=0;i<16;i++){
WriteData(mydata);
mydata++;
}
WriteCommand(0x90);
mydata=0x41;
for (i=0;i<16;i++){
WriteData(mydata);
mydata++;
}
WriteCommand(0x88);
mydata=0x51;
for (i=0;i<16;i++){
WriteData(mydata);
mydata++;
}
WriteCommand(0x98);
mydata=0x61;
for (i=0;i<16;i++){
WriteData(mydata);
mydata++;
}
Delay(255);
Delay(255);
Delay(255);
}*/
/*****************显示CGRAM***********************/
/*void Write_CGRAM(void){
unsigned char mydata,i;
WriteCGROM(0x40,0xff,0x00);
WriteCGROM(0x50,0x00,0xff);
WriteCGROM(0x60,0xaa,0xaa);
WriteCGROM(0x70,0x55,0x55);
WriteDDRAM(0x80, 0x00);
WriteDDRAM(0x90, 0x00);
WriteDDRAM(0x88, 0x00);
WriteDDRAM(0x98, 0x00);
Delay(255);
Delay(255);
Delay(255);
WriteDDRAM(0x80, 0x02);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -