|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產業(yè) | CAN-bus/DeviceNe |
液晶顯示的問題 |
| 作者:莊莊 欄目:單片機 |
/************************************************************************************/ /* LCM 240128 顯示程序 */ /* MCU 型號: WINBOND W78E58-24 */ /* 時鐘頻率: 22.1184 MHz */ /* 接口方式: 直接接口(掛總線) */ /* 開發(fā)環(huán)境: Keil C51 V6.14 */ /* 開發(fā)日期: 2001.06.12- */ /* 程序編寫: Youth */ /************************************************************************************/ #include <absacc.h> #include <\ti\reg1210.h> #include <stdarg.h> #include <stdio.h> #include "ziku.h" #define uLONG unsigned LONG #define uint unsigned int #define uCHAR unsigned CHAR #define STX 0x02 #define ETX 0x03 #define EOT 0x04 #define ENQ 0x05 #define BS 0x08 #define CR 0x0D #define LF 0x0A #define DLE 0x10 #define ETB 0x17 #define SPACE 0x20 #define COMMA 0x2C #define TRUE 1 #define FALSE 0 #define HIGH 1 #define LOW 0 unsigned CHAR turnf[8] = {7,6,5,4,3,2,1,0}; // T6963C 端口定義 #define LCMDW XBYTE[0x8800] // 數據口 #define LCMCW XBYTE[0x8900] // 命令口 // T6963C 命令定義 #define LC_CUR_POS 0x21 // 光標位置設置 #define LC_CGR_POS 0x22 // CGRAM偏置地址設置 #define LC_ADD_POS 0x24 // 地址指針位置 #define LC_TXT_STP 0x40 // 文本區(qū)首址 #define LC_TXT_WID 0x41 // 文本區(qū)寬度 #define LC_GRH_STP 0x42 // 圖形區(qū)首址 #define LC_GRH_WID 0x43 // 圖形區(qū)寬度 #define LC_MOD_OR 0x80 // 顯示方式:邏輯“或” #define LC_MOD_XOR 0x81 // 顯示方式:邏輯“異或” #define LC_MOD_AND 0x82 // 顯示方式:邏輯“與” #define LC_MOD_TCH 0x83 // 顯示方式:文本特征 #define LC_DIS_SW 0x90 // 顯示開關:D0=1/0:光標閃爍啟用/禁用; // D1=1/0:光標顯示啟用/禁用; // D2=1/0:文本顯示啟用/禁用; // D3=1/0:圖形顯示啟用/禁用; #define LC_CUR_SHP 0xA0 // 光標形狀選擇:0xA0-0xA7表示光標占的行數 #define LC_AUT_WR 0xB0 // 自動寫設置 #define LC_AUT_RD 0xB1 // 自動讀設置 #define LC_AUT_OVR 0xB2 // 自動讀/寫結束 #define LC_INC_WR 0xC0 // 數據一次寫,地址加1 #define LC_INC_RD 0xC1 // 數據一次讀,地址加1 #define LC_DEC_WR 0xC2 // 數據一次寫,地址減1 #define LC_DEC_RD 0xC3 // 數據一次讀,地址減1 #define LC_NOC_WR 0xC4 // 數據一次寫,地址不變 #define LC_NOC_RD 0xC5 // 數據一次讀,地址不變 #define LC_SCN_RD 0xE0 // 屏讀 #define LC_SCN_CP 0xE8 // 屏拷貝 #define LC_BIT_OP 0xF0 // 位操作:D0-D2:定義D0-D7位;D3:1置位;0:清除 #pragma asm CSEG AT 0807EH DB 11111100b //HCR1 Enable external MEMORY DB 11111110b //HCR0 1K data FLASH #pragma endasm sbit YEJING=P1^1; unsigned CHAR dprintf(unsigned CHAR x,unsigned CHAR y,unsigned CHAR *ptr); //code uCHAR const uPowArr[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; // ASCII 字模寬度及高度定義 #define ASC_CHR_WIDTH 8 #define ASC_CHR_HEIGHT 16 // ASCII 字模,顯示為8*16 /* typedef struct typFNT_GB16 // 漢字字模顯示數據結構 { CHAR Index[2]; CHAR Msk[32]; }; struct typFNT_GB16 code GB_16[] = { // 顯示為16*16 "中",0x01,0x00,0x01,0x00,0x21,0x08,0x3F,0xFC,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00, "文",0x02,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x08,0x20,0x08,0x20,0x08,0x20,0x04,0x40,0x04,0x40,0x02,0x80,0x01,0x00,0x02,0x80,0x04,0x60,0x18,0x1E,0xE0,0x08,0x00,0x00, "測",0x40,0x02,0x27,0xC2,0x24,0x42,0x84,0x52,0x45,0x52,0x55,0x52,0x15,0x52,0x25,0x52,0x25,0x52,0x25,0x52,0xC5,0x52,0x41,0x02,0x42,0x82,0x42,0x42,0x44,0x4A,0x48,0x04, "試",0x00,0x20,0x40,0x28,0x20,0x24,0x30,0x24,0x27,0xFE,0x00,0x20,0xE0,0x20,0x27,0xE0,0x21,0x20,0x21,0x10,0x21,0x10,0x21,0x0A,0x29,0xCA,0x36,0x06,0x20,0x02,0x00,0x00, }; */ uCHAR gCurRow,gCurCol; // 當前行、列存儲,行高16點,列寬8點 uCHAR fnGetRow(void) { return gCurRow; } uCHAR fnGetCol(void) { return gCurCol; } uCHAR fnST01(void) // 狀態(tài)位STA1,STA0判斷(讀寫指令和讀寫數據) { uCHAR i; for(i=10;i>0;i--) { if((LCMCW & 0x03) == 0x03) break; } return i; // 若返回零,說明錯誤 } uCHAR fnST2(void) // 狀態(tài)位ST2判斷(數據自動讀狀態(tài)) { uCHAR i; for(i=10;i>0;i--) { if((LCMCW & 0x04) == 0x04) break; } return i; // 若返回零,說明錯誤 } uCHAR fnST3(void) // 狀態(tài)位ST3判斷(數據自動寫狀態(tài)) { uCHAR i; for(i=10;i>0;i--) { if((LCMCW & 0x08) == 0x08) break; } return i; // 若返回零,說明錯誤 } uCHAR fnST6(void) // 狀態(tài)位ST6判斷(屏讀/屏拷貝狀態(tài)) { uCHAR i; for(i=10;i>0;i--) { if((LCMCW & 0x40) == 0x40) break; } return i; // 若返回零,說明錯誤 } uCHAR fnPR1(uCHAR uCmd,uCHAR uPar1,uCHAR uPar2) // 寫雙參數的指令 { if(fnST01() == 0) return 1; LCMDW = uPar1; if(fnST01() == 0) return 2; LCMDW = uPar2; if(fnST01() == 0) return 3; LCMCW = uCmd; return 0; // 返回0成功 } uCHAR fnPR11(uCHAR uCmd,uCHAR uPar1) // 寫單參數的指令 { if(fnST01() == 0) return 1; LCMDW = uPar1; if(fnST01() == 0) return 2; LCMCW = uCmd; return 0; // 返回0成功 } uCHAR fnPR12(uCHAR uCmd) // 寫無參數的指令 { if(fnST01() == 0) return 1; LCMCW = uCmd; return 0; // 返回0成功 } uCHAR fnPR13(uCHAR uData) // 寫數據 { if(fnST3() == 0) return 1; LCMDW = uData; return 0; // 返回0成功 } uCHAR fnPR2(void) // 讀數據 { if(fnST01() == 0) return 1; return LCMDW; } // 設置當前地址 void fnSetPos(uCHAR urow, uCHAR ucol) { uint iPos; iPos = urow * 30 + ucol; fnPR1(LC_ADD_POS,iPos & 0xFF,iPos / 256); gCurRow = urow; gCurCol = ucol; } // 設置當前顯示行、列 void cursor(uCHAR uRow, uCHAR uCol) { fnSetPos(uRow * 16, uCol); } // 清屏 void cls(void) { uint i; fnPR1(LC_ADD_POS,0x00,0x00); // 置地址指針 fnPR12(LC_AUT_WR); // 自動寫 for(i=0;i<240*30;i++) { fnST3(); fnPR13(0x00); // 寫數據 } fnPR12(LC_AUT_OVR); // 自動寫結束 fnPR1(LC_ADD_POS,0x00,0x00); // 重置地址指針 gCurRow = 0; // 置地址指針存儲變量 gCurCol = 0; } // LCM 初始化 CHAR fnLCMInit(void) { if(fnPR1(LC_TXT_STP,0x00,0x00) != 0) // 文本顯示區(qū)首地址 return -1; fnPR1(LC_TXT_WID,0x1E,0x00); // 文本顯示區(qū)寬度 fnPR1(LC_GRH_STP,0x00,0x00); // 圖形顯示區(qū)首地址 fnPR1(LC_GRH_WID,0x1E,0x00); // 圖形顯示區(qū)寬度 fnPR12(LC_CUR_SHP | 0x01); // 光標形狀 fnPR12(LC_MOD_OR); // 顯示方式設置 fnPR12(LC_DIS_SW | 0x08); // 顯示開關設置 return 0; } // ASCII(8*16) 及 漢字(16*16) 顯示函數 uCHAR ccdprintf(CHAR *fmt, ...) { va_list arg_ptr; CHAR c1,c2,cData; CHAR tmpBuf[64]; // LCD顯示數據緩沖區(qū) uCHAR i=0,j,uLen,uRow,uCol; uint k; va_start(arg_ptr, fmt); uLen = (uCHAR)vsprintf(tmpBuf, fmt, arg_ptr); va_end(arg_ptr); while(i<uLen) { c1 = tmpBuf[i]; c2 = tmpBuf[i+1]; uRow = fnGetRow(); uCol = fnGetCol(); if(c1 >= 0) { // ASCII if(c1 < 0x20) { SWITCH(c1) { case CR: case LF: // 回車或換行 i++; if(uRow < 112) fnSetPos(uRow+16,0); else fnSetPos(0,0); continue; case BS: // 退格 if(uCol > 0) uCol--; fnSetPos(uRow,uCol); cData = 0x00; break; default: // 其他 c1 = 0x1f; } } for( |
| 2樓: | >>參與討論 |
| 作者: 2005xxg 于 2005/11/11 16:37:00 發(fā)布:
簡單 va_start(arg_ptr, fmt); uLen = (uchar)vsprintf(tmpBuf, fmt, arg_ptr); va_end(arg_ptr); 這幾個函數其實在C51高級編程教程上都有 |
|
| 3樓: | >>參與討論 |
| 作者: chuandaoxy 于 2005/11/12 17:55:00 發(fā)布:
能給我你的硬件原理圖嗎 我在用ti的MSC1210討論一下行嗎,chuandaoxy@sohu.com |
|
| 4樓: | >>參與討論 |
| 作者: 莊莊 于 2005/11/14 11:28:00 發(fā)布:
謝謝,請問 C51高級編程教程,到哪里找? 我的程序現在出現了新問題,液晶顯示內容被壓縮,顯示出來是一個半屏。 就是它內容壓縮,用三分之二的屏幕顯示,然后再用剩下的顯示內容的三 分之一。 我的硬件圖正在修改,還有一些問題,暫時不想拿出對人,請諒解。 |
|
| 5樓: | >>參與討論 |
| 作者: chuandaoxy 于 2005/11/14 14:12:00 發(fā)布:
我?guī)湍阏医坛躺院蟀l(fā)給你 你的接線是總線結構嗎, 我手里有很多資料在硬盤上,查一下,我在用ti的1210,顯示部分也在調,能交流一下嗎 |
|
| 6樓: | >>參與討論 |
| 作者: 莊莊 于 2005/11/14 18:06:00 發(fā)布:
謝謝,好 我只知道我的硬件結構為直接尋址,硬件地址為8900和8800,我只負責做軟件,硬件是別人做的。也可能是硬件問題影響我的設計,但是我不懂硬件,只能等硬件的人做好了再說。我自己暫時做不了。 |
|
|
|
| 免費注冊為維庫電子開發(fā)網會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |