機(jī)電之家資源網(wǎng)
單片機(jī)首頁(yè)|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
基于PIC MG-12232模塊的編程液晶顯示(C程序)
基于PIC MG-12232模塊的編程液晶顯示(C程序)
 更新時(shí)間:2008-7-26 17:03:38  點(diǎn)擊數(shù):3
【字體: 字體顏色
MG-12232模塊的編程
 下面以圖15.1的接口電路為例。液晶顯示區(qū)域分成E1邊和E2邊,下面只含E1邊的程序(表15.1中E1=1,E2=0),E2邊(表15.1中E1=0,E2=1)類推。
在系統(tǒng)程序的初始化部分,應(yīng)對(duì)程序中用到的寄存器和臨時(shí)變量作說(shuō)明,如:
unsigned char  TRANS;
unsigned char  PAGEADD; //存放頁(yè)地址寄存器
unsigned char  PAGENUM; //存放總頁(yè)數(shù)寄存器
unsigned char  CLMSUM; //存放總列數(shù)寄存器
unsigned char  CLMADD; //存放列地址寄存器
unsigned char  WRITE; //存放顯示數(shù)據(jù)寄存器
unsigned char  row;  //存放顯示起始行寄存器
unsigned char  i,k;  //通用寄存器
//系統(tǒng)各口的輸入輸出狀態(tài)初始化子程序
void INITIAL()
{
 ADCON1=0X87;      //設(shè)置PORTA口和PORTE口為數(shù)字I/O口
 TRISA3=0;
 TRISB0=0;
 TRISE=0X00;      //設(shè)置液晶的4個(gè)控制腳為輸出
}
//讀液晶顯示器狀態(tài)子程序
void LCDSTA1()
{
 while(1)  {
  TRISD=0XFF;   //設(shè)置D口為輸入
  RB0=1;     //E1=1
  RA3=0;     //E2=0
  RE0=1;     //R/W=1
  RE1=0;     //A0=0
   if(RD7==0) break;  //為忙狀態(tài),則繼續(xù)等待其為空閑
  }
}
//對(duì)液晶顯示器發(fā)指令子程序(指令保存在TRANS寄存器中)
void TRANS1()
{
 LCDSTA1();    //判斷液晶是否為忙
 TRISD=0X00;   //置D口為輸出
 RB0=1;     //E1=1
 RA3=0;     //E2=0
 RE0=0;     //R/W=0
 RE1=0;     //A0=0
 PORTD=TRANS;   //需要寫入的命令字送入數(shù)據(jù)線
 RB0=0;     //E1=0寫入指令
 RE0=1;     //R/W=1

//對(duì)液晶顯示器寫數(shù)據(jù)子程序(數(shù)據(jù)保存在WRITE寄存器中)
void WRITE1()
{
 TRANS=CLMADD;  //設(shè)置列地址
 TRANS1();
 LCDSTA1();    //查詢液晶是否為空閑
 TRISD=0X00;   //D口為輸出
 RB0=1;//E1=1
 RA3=0;//E2=0
 RE0=0;//R/W=0
 RE1=1;//A0=1
 PORTD=WRITE;   //需要寫入的數(shù)據(jù)放入D口
 RB0=0;     //E1=0,寫入數(shù)據(jù)
 CLMADD++;   //列地址加1
 RE0=1;     //R/W=1
}
//開E1顯示子程序
void DISP1()
{
while(1)
  {
 TRANS=0XAF;
 TRANS1();    //送出控制命令
 LCDSTA1();    //判斷液晶是否為空閑
 TRISD=0XFF;   //設(shè)置D口為輸入
 RB0=1;     //E1=1
 RA3=0;     //E2=0
 RE0=1;     //R/W=1
 RE1=0;     //A0=0
 if(RD5==0) break;  //如果液晶沒(méi)被關(guān)閉,則繼續(xù)關(guān)
    }
}
//E1邊清屏子程序
void CLEAR1()
{
 PAGEADD=0xB8;  //設(shè)置頁(yè)地址代碼
 for(PAGENUM=0X04;PAGENUM>0;PAGENUM--){
  TRANS=PAGEADD;
  TRANS1();
  CLMADD=0x00;   //設(shè)置起始列
 for(CLMSUM=0X50;CLMSUM>0;CLMSUM--){
   LCDSTA1();   //判斷液晶是否為空閑
   WRITE=0X00;
   WRITE1();   //寫入00H以清屏
    }
  PAGEADD++;   //頁(yè)號(hào)增1
 }
}
//關(guān) E1顯示子程序
void  DISOFF1()
{
  while(1)
  {
 TRANS=0XAE;
 TRANS1();    //發(fā)出控制命令
 LCDSTA1();    //判斷液晶是否為空閑
 TRISD=0XFF;   //D口設(shè)置為輸入
 RB0=1;     //E1=1
 RA3=0;     //E2=0
 RE0=1;     //R/W=1
 RE1=0;     //A0=0
 if(RD5==1) break;  //如果液晶沒(méi)被關(guān)閉,則繼續(xù)關(guān)
  }
}

 有了以上的通用子程序,就可以構(gòu)造出各種顯示程序,如字符、漢字、曲線等。執(zhí)行這些程序前,必須對(duì)液晶進(jìn)行初始化。初始化的順序?yàn)椋宏P(guān)顯示→正常顯示驅(qū)動(dòng)設(shè)置→占空比設(shè)置→復(fù)位→ADC選擇→清屏→開顯示,程序如下:
//E1邊初始化
void  lcd1()
{
  DISOFF1();    //關(guān)顯示E1
  TRANS=0XA4;   //靜態(tài)顯示驅(qū)動(dòng)
  TRANS1();    //發(fā)出控制命令
  TRANS=0XA9;   //占空比為1/32
  TRANS1();    //發(fā)出控制命令
  TRANS=0XE2;   //復(fù)位
  TRANS1();    //發(fā)出控制命令
  TRANS=0XA0;   //ADC選擇正常輸出
  TRANS1();     //發(fā)出控制命令
  CLEAR1();    //清屏
  LCDSTA1();   //判斷液晶是否為空閑
  DISP1();    //開顯示

15.4  程序清單
 下面給出一個(gè)已經(jīng)在模板上調(diào)試通過(guò)的程序。 注意在調(diào)試該程序時(shí),需把模板上的J9跳針短接。
#include  <pic.h>
//該程序用于液晶顯示功能的演示
//運(yùn)行程序后,液晶上顯示"電流有效值 "和"電壓有效值 "字樣
//系統(tǒng)總的初始化子程序
unsigned  char  TRANS;
unsigned  char  PAGEADD; //存放頁(yè)地址寄存器
unsigned  char  PAGENUM;//存放總頁(yè)數(shù)寄存器
unsigned  char  CLMSUM; //存放總列數(shù)寄存器
unsigned  char  CLMADD; //存放列地址寄存器
unsigned  char  WRITE; //存放顯示數(shù)據(jù)寄存器
unsigned  char  row;  //存放顯示起始行寄存器
unsigned  char  i,k;  //通用寄存器
const  char  table[192]={0X00,0XF8,0X48,0X48,0X48,0X48,0XFF,0X48,
 0X48,0X48,0X48,0XFC,0X08,0X00,0X00,0X00,
 0X00,0X07,0X02,0X02,0X02,0X02,0X3F,0X42,
    0X42,0X42,0X42,0X47,0X40,0X70,0X00,0X00,//"電"
 0X00,0X00,0XFE,0X02,0X82,0X82,0X82,0X82,
    0XFE,0X82,0X82,0X82,0XC3,0X82,0X00,0X00,
 0X40,0X30,0X0F,0X40,0X40,0X40,0X40,0X40,
    0X7F,0X40,0X42,0X44,0X4C,0X60,0X40,0X00,//"壓"
 0X04,0X04,0X04,0X84,0XE4,0X3C,0X27,0X24,
 0X24,0X24,0X24,0XF4,0X24,0X06,0X04 ,0X00,
 0X4 ,0X2 ,0X1 ,0X0 ,0XFF,0X9,0X9 ,0X9,
 0X9 ,0X49,0X89,0X7F,0X0,0X0,0X0 ,0X0, //"有"
 0X88,0X48,0XB8,0X9,0XA,0X98,0X2C ,0X48,
 0X20,0XD0,0X1F,0X10,0X10,0XF8,0X10 ,0X0,
 0X40,0X20,0X18,0X5,0X2,0XD,0X30 ,0X80,
 0X80,0X41,0X36,0X8,0X37,0XC0,0X40 ,0X0, //"效"
 0X80,0X40,0X20,0XF8,0X7,0X4,0XE4,0XA4,
 0XA4,0XBF,0XA4,0XA4,0XF6,0X24,0X0 ,0X0,
 0X0,0X0,0X0,0XFF,0X40,0X40,0X7F,0X4A,
 0X4A,0X4A,0X4A,0X4A,0X7F,0X40,0X40 ,0X0,//"值" 
 0X10,0X22,0X64,0XC,0X80,0X44,0X44,0X64,
  0X55,0X4E,0X44,0X54,0X66,0XC4,0X0,0X0,
 0X4,0X4,0XFE,0X1,0X0,0X80,0X40,0X3F,
  0X0,0XFF,0X0,0X3F,0X40,0X40,0X70,0X0    //"流"  
};
//系統(tǒng)各口的輸入輸出狀態(tài)初始化子程序
void  INITIAL()
{
 ADCON1=0X87;   //設(shè)置PORTA口和PORTE口為數(shù)字I/O口
 TRISA3=0;
 TRISB0=0;
 TRISE=0X00;   //設(shè)置液晶的4個(gè)控制腳為輸出
}
//讀液晶顯示器狀態(tài)子程序
void  LCDSTA1()
{
 while(1){
 TRISD=0XFF;   //設(shè)置D口為輸入
 RB0=1;     //E1=1
 RA3=0;     //E2=0
 RE0=1;     //R/W=1
 RE1=0;     //A0=0
 if(RD7==0) break;  //為忙狀態(tài),則繼續(xù)等待其為空閑
  }
}
//對(duì)液晶顯示器發(fā)指令子程序(指令保存在TRANS寄存器中)
void  TRANS1()
{
 LCDSTA1();   //判斷液晶是否為忙
 TRISD=0X00;  //D口為輸出
 RB0=1;    //E1=1
 RA3=0;    //E2=0
 RE0=0;    //R/W=0
 RE1=0;    //A0=0
 PORTD=TRANS;  //需要寫入的命令字送入數(shù)據(jù)線
 RB0=0;    //E1=0寫入指令
 RE0=1;    //R/W=1

//對(duì)液晶顯示器寫數(shù)據(jù)子程序(數(shù)據(jù)保存在WRITE寄存器中)
void  WRITE1()
{
 TRANS=CLMADD; //設(shè)置列地址
 TRANS1();
 LCDSTA1();   //查詢液晶是否為空閑
 TRISD=0X00;  //D口為輸出
 RB0=1;    //E1=1
 RA3=0;    //E2=0
 RE0=0;    //R/W=0
 RE1=1;    //A0=1
 PORTD=WRITE;  //需要寫入的數(shù)據(jù)放入D口
 RB0=0;    //E1=0,寫入數(shù)據(jù)
 CLMADD++;  //列地址加1
 RE0=1;    //R/W=1
}
//開E1顯示子程序
void  DISP1()
{
 while(1)  {
 TRANS=0XAF;
 TRANS1();    //送出控制命令
 LCDSTA1();    //判斷液晶是否為空閑
 TRISD=0XFF;   //設(shè)置D口為輸入
 RB0=1;     //E1=1
 RA3=0;     //E2=0
 RE0=1;     //R/W=1
 RE1=0;     //A0=0
 if(RD5==0) break;  //如果液晶沒(méi)被關(guān)閉,則繼續(xù)關(guān)
    }
}
//E1邊清屏子程序
void  CLEAR1()
{
 PAGEADD=0xB8;  //設(shè)置頁(yè)地址代碼
 for(PAGENUM=0X04;PAGENUM>0;PAGENUM--){
 TRANS=PAGEADD;
 TRANS1();
 CLMADD=0x00;   //設(shè)置起始列
   for(CLMSUM=0X50;CLMSUM>0;CLMSUM--) {
  LCDSTA1();   //判斷液晶是否為空閑
  WRITE=0X00;
  WRITE1();   //寫入00H以清屏
    }
 PAGEADD++;   //頁(yè)號(hào)增1
  }

//關(guān) E1顯示子程序
void  DISOFF1()
{
  while(1) {
 TRANS=0XAE;
 TRANS1();   //發(fā)出控制命令
 LCDSTA1();   //判斷液晶是否為空閑
 TRISD=0XFF;  //D口設(shè)置為輸入
 RB0=1;    //E1=1
 RA3=0;    //E2=0
 RE0=1;    //R/W=1
 RE1=0;    //A0=0
 if(RD5==1) break; //如果液晶沒(méi)被關(guān)閉,則繼續(xù)關(guān)
   }
}
//E1邊初始化
void  lcd1()
{
  DISOFF1();   //關(guān)顯示E1
  TRANS=0XA4;  //靜態(tài)顯示驅(qū)動(dòng)
  TRANS1();   //發(fā)出控制命令
  TRANS=0XA9;  //占空比為1/32
  TRANS1();   //發(fā)出控制命令
  TRANS=0XE2;  //復(fù)位
  TRANS1();   //發(fā)出控制命令
  TRANS=0XA0;  //ADC選擇正常輸出
  TRANS1();   //發(fā)出控制命令
  CLEAR1();   //清屏
  LCDSTA1();  //判斷液晶是否為空閑
  DISP1();   //開顯示

//E2邊的處理部分
//讀液晶顯示器狀態(tài)子程序
void  LCDSTA2()
{
 while(1) {
 TRISD=0XFF;  //設(shè)置D口為輸入
 RB0=0;    //E1=0
 RA3=1;    //E2=1
 RE0=1;    //R/W=1
 RE1=0;    //A0=0
 if(RD7==0) break; //為忙狀態(tài),則繼續(xù)等待其為空閑
  }
}
//對(duì)液晶顯示器發(fā)指令子程序指令保存在TRANS寄存器中
void  TRANS2()
{
 LCDSTA2();   //判斷液晶是否為忙
 TRISD=0X00;  //D口為輸出
 RB0=0;    //E1=0
 RA3=1;    //E2=1
 RE0=0;    //R/W=0
 RE1=0;    //A0=0
 PORTD=TRANS;  //需要寫入的命令字送入數(shù)據(jù)線
 RA3=0;    //E2=0寫入指令
 RE0=1;    //R/W=1

//對(duì)液晶顯示器寫數(shù)據(jù)子程序(數(shù)據(jù)保存在WRITE寄存器中)
void  WRITE2()
{
 TRANS=CLMADD; //設(shè)置列地址
 TRANS2();
 LCDSTA2();   //查詢液晶是否為空閑
 TRISD=0X00;  //D口為輸出
 RB0=0;    //E1=0
 RA3=1;    //E2=1
 RE0=0;    //R/W=0
 RE1=1;    //A0=1
 PORTD=WRITE;  //需要寫入的數(shù)據(jù)放入D口
 RA3=0;    //E2=0,寫入數(shù)據(jù)
 CLMADD++;  //列地址加1
 RE0=1;    //R/W=1
}
//開E2顯示子程序
void  DISP2()
{
 while(1)  {
 TRANS=0XAF;
 TRANS2();    //送出控制命令
 LCDSTA2();   //判斷液晶是否為空閑
 TRISD=0XFF;  //設(shè)置D口為輸入
 RB0=0;    //E1=0
 RA3=1;    //E2=1
 RE0=1;    //R/W=1
 RE1=0;    //A0=0
 if(RD5==0) break; //如果液晶沒(méi)被關(guān)閉,則繼續(xù)關(guān)
  }
}
//E2邊清屏子程序
void  CLEAR2()
{
 PAGEADD=0xB8; //設(shè)置頁(yè)地址代碼
 for(PAGENUM=0X04;PAGENUM>0;PAGENUM--) {
  TRANS=PAGEADD;
  TRANS2();
  CLMADD=0x00;  //設(shè)置起始列
    for(CLMSUM=0X50;CLMSUM>0;CLMSUM--) {
   LCDSTA2();  //判斷液晶是否為空閑
   WRITE=0X00;
   WRITE2();  //寫入00H以清屏
       }
  PAGEADD++;  //頁(yè)號(hào)增1
  }

//關(guān) E2顯示子程序
void  DISOFF2()
{
 while(1) {
 TRANS=0XAE;
 TRANS2();   //發(fā)出控制命令
 LCDSTA2();   //判斷液晶是否為空閑
 TRISD=0XFF;  //D口設(shè)置為輸入
 RB0=0;    //E1=0
 RA3=1;    //E2=1
 RE0=1;    //R/W=1
 RE1=0;    //A0=0
 if(RD5==1) break; //如果液晶沒(méi)被關(guān)閉,則繼續(xù)關(guān)
   }

//E2邊初始化
void  lcd2()
{
 DISOFF2();   //關(guān)顯示E1
 TRANS=0XA4;  //靜態(tài)顯示驅(qū)動(dòng)
 TRANS2();   //發(fā)出控制命令
 TRANS=0XA9;  //占空比為1/32
 TRANS2();   //發(fā)出控制命令
 TRANS=0XE2;  //復(fù)位
 TRANS2();   //發(fā)出控制命令
 TRANS=0XA0;  //ADC選擇正常輸出
 TRANS2();   //發(fā)出控制命令
 CLEAR2();   //清屏
 LCDSTA2();   //判斷液晶是否為空閑
 DISP2();   //開顯示
}
//LCD的E1邊顯示函數(shù),調(diào)用一次該函數(shù),則在相應(yīng)的位置顯示相應(yīng)的字
void  dis1()
{
  TRANS=row;
  TRANS1();
  TRANS=PAGEADD;
  TRANS1();
  i=i*32;     //i變成數(shù)組指示指針
  for(k=0;k<16;k++)  {
  WRITE=table[i+k]; //查得需要顯示的字節(jié)
  WRITE1();   //在WRITE1子程序里面,列地址加1
  }
  CLMADD=CLMADD-16;//恢復(fù)列地址
  PAGEADD=PAGEADD+1;//頁(yè)地址加1
  TRANS=PAGEADD;
  TRANS1();
  for(;k<32;k++)  {
   WRITE=table[i+k]; //查得需要顯示的字節(jié)
   WRITE1();   //在WRITE1子程序里面,列地址已經(jīng)加1
  } 
}
//LCD的E2邊顯示函數(shù),調(diào)用一次該函數(shù),則在相應(yīng)的位置顯示相應(yīng)的字
void  dis2()
{
  TRANS=row;
  TRANS2();
  TRANS=PAGEADD;
  TRANS2();
  i=i*32;     //i變成數(shù)組指示指針
  for(k=0;k<16;k++)  {
   WRITE=table[i+k]; //查得需要顯示的字節(jié)
   WRITE2();   //在WRITE1子程序里面,列地址已經(jīng)加1
  }
  CLMADD=CLMADD-16;//恢復(fù)列地址
  PAGEADD=PAGEADD+1;//頁(yè)地址加1
  TRANS=PAGEADD;
  TRANS2();
  for(;k<32;k++)  {
   WRITE=table[i+k]; //查得需要顯示的字節(jié)
   WRITE2();   //在WRITE1子程序里面,列地址已經(jīng)加1
  } 
}
//主程序
main()
{
 INITIAL();    //系統(tǒng)初始化
 lcd1();     //E1邊初始化
 lcd2();     //E2邊初始化
 row=0XC0;    //顯示起始列為第0行
//以下顯示不同的字符
 PAGEADD=0XB8;  //顯示起始頁(yè)為第0頁(yè)
 CLMADD=0X00;  //起始列為第0列
 i=0;     //顯示數(shù)組中對(duì)應(yīng)的第一個(gè)字 
 dis1();     //調(diào)用顯示函數(shù)
 PAGEADD=0XB8;  //顯示起始頁(yè)為第0頁(yè)
 CLMADD=16;   //起始列為第16列
 i=1;     //顯示數(shù)組中對(duì)應(yīng)的第二個(gè)字 
 dis1();     //調(diào)用顯示函數(shù)
 PAGEADD=0XB8;  //顯示起始頁(yè)為第0頁(yè)
 CLMADD=32;   //起始列為第32列
 i=2;     //顯示數(shù)組中對(duì)應(yīng)的第三個(gè)字 
 dis1();     //調(diào)用顯示函數(shù)
 PAGEADD=0XB8;  //顯示起始頁(yè)為第0頁(yè)
 CLMADD=48;   //起始列為第48列
 i=3;     //顯示數(shù)組中對(duì)應(yīng)的第四個(gè)字 
 dis1();     //調(diào)用顯示函數(shù) 
 PAGEADD=0XB8;  //顯示起始頁(yè)為第0頁(yè)
 CLMADD=0;   //起始列為第0列
 i=4;     //顯示數(shù)組中對(duì)應(yīng)的第五個(gè)字 
 dis2();     //調(diào)用E2邊顯示函數(shù)
 PAGEADD=0XBA;  //顯示起始頁(yè)為第2頁(yè)
 CLMADD=0X00;  //起始列為第0列
 i=0;     //顯示數(shù)組中對(duì)應(yīng)的第一個(gè)字 
 dis1();     //調(diào)用顯示函數(shù)
 PAGEADD=0XBA;  //顯示起始頁(yè)為第2頁(yè)
 CLMADD=16;   //起始列為第16列
 i=5;     //顯示數(shù)組中對(duì)應(yīng)的第六個(gè)字 
 dis1();     //調(diào)用顯示函數(shù)
 PAGEADD=0XBA;  //顯示起始頁(yè)為第2頁(yè)
 CLMADD=32;   //起始列為第32列
 i=2;     //顯示數(shù)組中對(duì)應(yīng)的第三個(gè)字 
 dis1();     //調(diào)用顯示函數(shù) 
 PAGEADD=0XBA;  //顯示起始頁(yè)為第2頁(yè)
 CLMADD=48;   //起始列為第48列
 i=3;     //顯示數(shù)組中對(duì)應(yīng)的第四個(gè)字 
 dis1();     //調(diào)用顯示函數(shù) 
 PAGEADD=0XBA;  //顯示起始頁(yè)為第2頁(yè)
 CLMADD=0;   //起始列為第0列
 i=4;     //顯示數(shù)組中對(duì)應(yīng)的第五個(gè)字 
 dis2();     //調(diào)用E2邊顯示函數(shù)
 while(1) {
  ;
 }
}

  • 上一篇: PIC16F72單片機(jī)控制HT1621B驅(qū)動(dòng)LCD
  • 下一篇: PIC16F73單片機(jī)構(gòu)成的環(huán)境溫濕度實(shí)時(shí)測(cè)控裝置設(shè)計(jì)
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁(yè)  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營(yíng)許可證:浙B2-20080178-1