音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網
技術交流 | 電路欣賞 | 工控天地 | 數字廣電 | 通信技術 | 電源技術 | 測控之家 | 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
簡單
va_start(arg_ptr, fmt);
uLen = (uchar)vsprintf(tmpBuf, fmt, arg_ptr);
va_end(arg_ptr);
這幾個函數其實在C51高級編程教程上都有

3樓: >>參與討論
chuandaoxy
能給我你的硬件原理圖嗎
我在用ti的MSC1210討論一下行嗎,chuandaoxy@sohu.com

4樓: >>參與討論
莊莊
謝謝,請問
C51高級編程教程,到哪里找?
我的程序現在出現了新問題,液晶顯示內容被壓縮,顯示出來是一個半屏。
就是它內容壓縮,用三分之二的屏幕顯示,然后再用剩下的顯示內容的三
分之一。
我的硬件圖正在修改,還有一些問題,暫時不想拿出對人,請諒解。

5樓: >>參與討論
chuandaoxy
我?guī)湍阏医坛躺院蟀l(fā)給你
你的接線是總線結構嗎, 我手里有很多資料在硬盤上,查一下,我在用ti的1210,顯示部分也在調,能交流一下嗎

6樓: >>參與討論
莊莊
謝謝,好
我只知道我的硬件結構為直接尋址,硬件地址為89008800,我只負責做軟件,硬件是別人做的。也可能是硬件問題影響我的設計,但是我不懂硬件,只能等硬件的人做好了再說。我自己暫時做不了。

參與討論
昵稱:
討論內容:
 
 
相關帖子
單片機C語言的問題
有人做過用51實現串口轉網口嗎?支持TCP/IP協(xié)議哦。
請教標度變換
那位大哥有MCG12864A8的資料發(fā)給我一份
哪位仁兄知道DS1302工作在3V后備電源時候的功耗電流是多少呀
免費注冊為維庫電子開發(fā)網會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號