?? t6963c.c
字號:
{
DDRA = 0xFF; // 數(shù)據(jù)方向為輸出
// PORTA = 0xFF; // 使能內部上拉電阻
DDRB = 0x0F; // 數(shù)據(jù)方向為輸出
if(fnST3() == 0)
return 1;
PORTB &= ~(1 << CD) ; // CD (PB2) 賦值0,低電平表示數(shù)據(jù)
// _NOP();
// lcd_delay(1);
PORTA = uData;
// _NOP();
// lcd_delay(1);
PORTB &= ~(1 << WR); // WR (PB0) 賦值0,低電平寫操作有效
// _NOP();
// lcd_delay(1);
PORTB |= (1 << WR); // WR (PB0) 賦值1,高電平寫操作無效
return 0; // 返回0成功
}
/************************************************************************************/
/* 函數(shù)名稱:fnCWD */
/* 輸入?yún)?shù):uchar uData 數(shù)據(jù) */
/* 輸出參數(shù):uchar 0 成功,否則失敗 */
/* 函數(shù)功能:寫命令 */
/* 作 者 :安車科技大燈儀開發(fā)小組 許孝剛 */
/* 開發(fā)日期: 2005.08 */
/* 版 本 : v1.0 */
/************************************************************************************/
uchar fnCWD(uchar uData)
{
DDRA = 0xFF; // 數(shù)據(jù)方向為輸出
PORTA = 0xFF; // 使能內部上拉電阻
DDRB = 0x0F; // 數(shù)據(jù)方向為輸出
if(fnST01() == 0)
return 1;
PORTB |= (1 << CD) ; // CD (PB2) 賦值1,高電平表示命令
PORTA = uData;
// lcd_delay(1);
PORTB &= ~(1 << WR); // WR (PB0) 賦值0,低電平寫操作有效
// _NOP();
// lcd_delay(1);
PORTB |= (1 << WR); // WR (PB0) 賦值1,高電平寫操作無效
return 0; // 返回0成功
}
/************************************************************************************/
/* 函數(shù)名稱:fnDRD */
/* 輸入?yún)?shù):void */
/* 輸出參數(shù):uchar 成功,返回數(shù)據(jù);失敗返回1 */
/* 函數(shù)功能:讀數(shù)據(jù) */
/* 作 者 :安車科技大燈儀開發(fā)小組 許孝剛 */
/* 開發(fā)日期: 2005.08 */
/* 版 本 : v1.0 */
/************************************************************************************/
uchar fnDRD(void)
{
uchar data;
DDRA = 0xFF; // 數(shù)據(jù)方向為輸出
// PORTA = 0x00; // 禁止內部上拉電阻
DDRB = 0x0F; // 數(shù)據(jù)方向為輸出
if(fnST01() == 0)
return 1;
PORTB &= ~(1 << CD); // CD (PB2) 賦值0,低電平表示數(shù)據(jù)
PORTB &= ~(1 << RD); // RD (PB1) 賦值0,低電平表示讀操作有效
// _NOP();
// lcd_delay(1); // 延時
data = PINA;
// _NOP();
PORTB |= (1 << RD); // RD (PB1) 賦值1,高電平表示讀操作無效
return data;
}
/************************************************************************************/
/* 函數(shù)名稱:fnSetPos */
/* 輸入?yún)?shù):uchar urow, 欲設置的行 */
/* uchar ucol,欲設置的列 */
/* 行的定義為,從上到下為行;列的定義為從左到右為列,類似矩陣中行列 */
/* 輸出參數(shù):void */
/* 函數(shù)功能:設置當前任意地址,每水平8像素為一字節(jié) */
/* 作 者 :安車科技大燈儀開發(fā)小組 許孝剛 */
/* 開發(fā)日期: 2005.08 */
/* 版 本 : v1.0 */
/************************************************************************************/
void fnSetPos(uchar urow, uchar ucol)
{
uint iPos;
iPos =( (urow << 4) + (ucol >> 3) ); // iPos =urow *16 + ucol /8 ;
fnCW2P(LC_ADD_POS,iPos & 0xFF,iPos >> 8);
}
/************************************************************************************/
/* 函數(shù)名稱:cursor */
/* 輸入?yún)?shù):uchar uRow, uchar uCol 當前行、列 */
/* 輸出參數(shù):void */
/* 函數(shù)功能:設置當前顯示行、列 */
/* 作 者 :安車科技大燈儀開發(fā)小組 許孝剛 */
/* 開發(fā)日期: 2005.08 */
/* 版 本 : v1.0 */
/************************************************************************************/
void cursor(uchar uRow, uchar uCol)
{
gCurRow = uRow;
gCurCol = uCol;
fnSetPos(gCurRow,gCurCol);
}
/************************************************************************************/
/* 函數(shù)名稱:cls */
/* 輸入?yún)?shù):void */
/* 輸出參數(shù):void */
/* 函數(shù)功能:清屏 */
/* 作 者 :安車科技大燈儀開發(fā)小組 許孝剛 */
/* 開發(fā)日期: 2005.08 */
/* 版 本 : v1.0 */
/************************************************************************************/
void cls(void)
{
uint i;
fnSetPos(0,0);
fnCW0P(LC_AUT_WR); // 自動寫
for(i=0;i<LCM_HEIGHT *(LCM_WIDTH/8);i++) // 將所有單元內容都寫1
{
fnST3();
fnDWD(0x00);
// _NOP();
} // 寫數(shù)據(jù)
// lcd_delay(15);
fnCW0P(LC_AUT_OVR); // 自動寫結束
fnCW2P(LC_ADD_POS,0x00,0x00); // 重置地址指針
}
/************************************************************************************/
/* 函數(shù)名稱:fnLCMInit */
/* 輸入?yún)?shù):void */
/* 輸出參數(shù):char */
/* 函數(shù)功能:LCM 初始化 */
/* 作 者 :安車科技大燈儀開發(fā)小組 許孝剛 */
/* 開發(fā)日期: 2005.08 */
/* 版 本 : v1.0 */
/************************************************************************************/
char fnLCMInit(void)
{
if(fnCW2P(LC_TXT_STP,0x00,0x00) != 0) // 文本顯示區(qū)首地址
return -1;
fnCW2P(LC_TXT_WID,LCM_WIDTH/8,0x00); // 文本顯示區(qū)寬度
fnCW2P(LC_GRH_STP,0x00,0x00); // 圖形顯示區(qū)首地址
fnCW2P(LC_GRH_WID,LCM_WIDTH/8,0x00); // 圖形顯示區(qū)寬度
fnCW0P(LC_CUR_SHP | 0x01); // 光標形狀
fnCW0P(LC_MOD_OR); // 顯示方式設置
fnCW0P(LC_DIS_SW | 0x08); // 顯示開關設置
// lcd_delay(15);
return 0;
}
void lcd_delay(uint time)
{
int i;
while(time--)
{
i = 1000;
while(i--);
}
}
/******************************************************************************/
/************************************************************************************/
/* 函數(shù)名稱:dprintf */
/* 輸入?yún)?shù):uchar * fmt 欲顯示字符串 */
/* 輸出參數(shù):uchar uLen 字符串長度 */
/* 函數(shù)功能:字符顯示 */
/* 作 者 :安車科技大燈儀開發(fā)小組 許孝剛 */
/* 開發(fā)日期: 2005.08 */
/* 版 本 : v1.0 */
/************************************************************************************/
uchar dprintf(uchar *ptr)
{
uchar c1,c2;
uchar *tmpBuf; // LCD顯示數(shù)據(jù)緩沖區(qū)
uchar i=0,j=0,j1=0,k,uLen=0,uRow,uCol,uVal=0;
const typFNT_GB12 data ;
uchar uIndex1,uIndex2; // 存儲漢字的索引
uchar uMask1,uMask2; // 1個字橫向字模信息的2個字節(jié)
uchar k1,k2;
while (ptr[uLen]!=0)
{
uLen++; ////探測字串長度
};
tmpBuf = ptr;
i = 0;
while(i<uLen)
{
c1 = tmpBuf[i];
c2 = tmpBuf[i+1];
uRow = fnGetRow();
uCol = fnGetCol();
if(c1 >= 0x20 && c1 <= 0x7f) // 0x20---0x7f
{ // ASCII 的 12行 * 6列 字符顯示
for( j = 0; j < 12; j++) // 逐行顯示
{
for ( k = 0; k < 6; k++) // 逐列顯示
{
cursor(uRow + j,uCol + k); // 置當前顯示地址
k1 = (uCol + k) & 0x07 ; // 當前屏幕點屬于的字節(jié)單元的像素點;水平共16字節(jié)單元,
// 每字節(jié)8個像素點,從左到右為01234567點,
// 對應數(shù)據(jù)的76543210位
k2 = 7 - k1; // 當前屏幕點屬于的字節(jié)單元的位
k1 = BIT(7-k); // 當前屏幕點屬于的字節(jié)單元的數(shù)據(jù)的第7-k個數(shù)據(jù)位置1,其余置0
uVal = pgm_read_byte(ASCII_TBL+(c1-0x20)*12 + j);
k1 = ( uVal & k1 ) == k1 ? 1 : 0; // 測試對應字庫中字的第j行1字節(jié)數(shù)據(jù)中的7-k個數(shù)據(jù)位是否為1
if(k1 == 1)
fnCW0P(LC_BIT_OP | 0x08 | k2 ); // 是1
else
fnCW0P(LC_BIT_OP | k2 ); // 是0
}
}
cursor(uRow ,uCol + 6); // 下一個字符
i++;
}
else // 0x80 -- 0xff
{ // 中文12行*12列漢字顯示
for(j1 = 0; j1 < sizeof(GB_12)/sizeof(GB_12[0]);j1 ++) // 找字
{
memcpy_P(&data, &GB_12[j1], sizeof(typFNT_GB12)); // 從程序區(qū)拷貝一個結構體數(shù)據(jù)
uIndex1 = data.Index[0];
uIndex2 = data.Index[1];
if(c1 == uIndex1 && c2 == uIndex2)
break;
}
if(j1 >= sizeof(GB_12)/sizeof(GB_12[0]) ) // 找不到,屏幕就是空白
return 0;
for( j=0;j<12;j++) // 逐行顯示
{
for ( k = 0; k < 8; k++) // 逐列顯示
{
cursor(uRow + j,uCol + k); // 置當前顯示地址
k1 = (uCol + k) & 0x07 ; // 當前屏幕點屬于的字節(jié)單元的像素點;水平共16字節(jié)單元,
// 每字節(jié)8個像素點,從左到右為01234567點,
// 對應數(shù)據(jù)的76543210位
k2 = 7 - k1; // 當前屏幕點屬于的字節(jié)單元的位
k1 = BIT(7 - (k & 0x07)); // 當前屏幕點屬于的字節(jié)單元的數(shù)據(jù)的第7 - k & 0x07個數(shù)據(jù)位置1,其余置0
memcpy_P(&data, &GB_12[j1], sizeof(typFNT_GB12));
uMask1 = data.Msk[2*j];
k1 = (uMask1 & k1 ) == k1 ? 1 : 0; // 漢字左邊部分
if(k1 == 1) // 為 1
fnCW0P(LC_BIT_OP | 0x08 | k2 );
else
fnCW0P(LC_BIT_OP | k2 ); // 為 0
}
for ( k = 0; k < 4; k++) // 逐列顯示
{
cursor(uRow + j,uCol + k +8); // 置當前顯示地址
k1 = (uCol + k + 8) & 0x07 ; // 當前屏幕點屬于的字節(jié)單元的像素點;水平共16字節(jié)單元,
// 每字節(jié)8個像素點,從左到右為01234567點,
// 對應數(shù)據(jù)的76543210位
k2 = 7 - k1; // 當前屏幕點屬于的字節(jié)單元的位
k1 = BIT(7 - (k & 0x07)); // 當前屏幕點屬于的字節(jié)單元的數(shù)據(jù)的第7 - k & 0x07個數(shù)據(jù)位置1,其余置0
uMask2 = data.Msk[2*j+1];
k1 = (uMask2 & k1 ) == k1 ? 1 : 0; // 漢字右邊部分
if(k1 == 1) // 為 1
fnCW0P(LC_BIT_OP | 0x08 | k2 );
else
fnCW0P(LC_BIT_OP | k2 ); // 為 0
}
}
cursor(uRow ,uCol + 13); // 下一個漢字
i +=2; // 在字符串中一個漢字占2個字節(jié)
}
}
return uLen;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -