男女午夜激情_www.天堂av.com_亚洲综合小说区_亚洲欧美自拍视频_成年精品_久久www免费人成—看片_激情综合五月天_久久高潮视频_最新国产成人ab网站_国产精品卡一

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

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

 有了以上的通用子程序,就可以構造出各種顯示程序,如字符、漢字、曲線等。執行這些程序前,必須對液晶進行初始化。初始化的順序為:關顯示→正常顯示驅動設置→占空比設置→復位→ADC選擇→清屏→開顯示,程序如下:
//E1邊初始化
void  lcd1()
{
  DISOFF1();    //關顯示E1
  TRANS=0XA4;   //靜態顯示驅動
  TRANS1();    //發出控制命令
  TRANS=0XA9;   //占空比為1/32
  TRANS1();    //發出控制命令
  TRANS=0XE2;   //復位
  TRANS1();    //發出控制命令
  TRANS=0XA0;   //ADC選擇正常輸出
  TRANS1();     //發出控制命令
  CLEAR1();    //清屏
  LCDSTA1();   //判斷液晶是否為空閑
  DISP1();    //開顯示

15.4  程序清單
 下面給出一個已經在模板上調試通過的程序。 注意在調試該程序時,需把模板上的J9跳針短接。
#include  <pic.h>
//該程序用于液晶顯示功能的演示
//運行程序后,液晶上顯示"電流有效值 "和"電壓有效值 "字樣
//系統總的初始化子程序
unsigned  char  TRANS;
unsigned  char  PAGEADD; //存放頁地址寄存器
unsigned  char  PAGENUM;//存放總頁數寄存器
unsigned  char  CLMSUM; //存放總列數寄存器
unsigned  char  CLMADD; //存放列地址寄存器
unsigned  char  WRITE; //存放顯示數據寄存器
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    //"流"  
};
//系統各口的輸入輸出狀態初始化子程序
void  INITIAL()
{
 ADCON1=0X87;   //設置PORTA口和PORTE口為數字I/O口
 TRISA3=0;
 TRISB0=0;
 TRISE=0X00;   //設置液晶的4個控制腳為輸出
}
//讀液晶顯示器狀態子程序
void  LCDSTA1()
{
 while(1){
 TRISD=0XFF;   //設置D口為輸入
 RB0=1;     //E1=1
 RA3=0;     //E2=0
 RE0=1;     //R/W=1
 RE1=0;     //A0=0
 if(RD7==0) break;  //為忙狀態,則繼續等待其為空閑
  }
}
//對液晶顯示器發指令子程序(指令保存在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;  //需要寫入的命令字送入數據線
 RB0=0;    //E1=0寫入指令
 RE0=1;    //R/W=1

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

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

//E2邊的處理部分
//讀液晶顯示器狀態子程序
void  LCDSTA2()
{
 while(1) {
 TRISD=0XFF;  //設置D口為輸入
 RB0=0;    //E1=0
 RA3=1;    //E2=1
 RE0=1;    //R/W=1
 RE1=0;    //A0=0
 if(RD7==0) break; //為忙狀態,則繼續等待其為空閑
  }
}
//對液晶顯示器發指令子程序指令保存在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;  //需要寫入的命令字送入數據線
 RA3=0;    //E2=0寫入指令
 RE0=1;    //R/W=1

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

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

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

  • 上一篇: PIC16F72單片機控制HT1621B驅動LCD
  • 下一篇: PIC16F73單片機構成的環境溫濕度實時測控裝置設計
  • 發表評論   告訴好友   打印此文  收藏此頁  關閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關文章
    網友評論:(只顯示最新5條。)
    關于我們 | 聯系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

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

    主辦:杭州市高新區(濱江)機電一體化學會
    中國行業電子商務100強網站

    網站經營許可證:浙B2-20080178-1
    主站蜘蛛池模板: 和平县| 濮阳县| 黑河市| 蒙阴县| 定襄县| 景宁| 阳西县| 扎鲁特旗| 华亭县| 南召县| 蓬莱市| 蒙阴县| 颍上县| 伊吾县| 遂昌县| 临泉县| 德昌县| 泉州市| 灌云县| 万山特区| 金山区| 奉节县| 兴安盟| 商丘市| 成都市| 岗巴县| 扎兰屯市| 菏泽市| 石狮市| 昆山市| 新源县| 新化县| 华安县| 行唐县| 凌海市| 资源县| 阿合奇县| 博野县| 溧阳市| 根河市| 晋城|