日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]/*---------------------------------------------------------------------------------------------------Keil C51編寫的192*64液晶片驅(qū)動(dòng)程序,感謝很多網(wǎng)友提供了參考源程序,本程序是在網(wǎng)友們提供的程序基礎(chǔ)上改

/*---------------------------------------------------------------------------------------------------
Keil C51編寫的192*64液晶片驅(qū)動(dòng)程序,感謝很多網(wǎng)友提供了參考源程序,

本程序是在網(wǎng)友們提供的程序基礎(chǔ)上改寫而成,有很多地方得到高手們的耐

心指導(dǎo),在此深表謝意。這是一個(gè)完整的C51源程序,我覺得對(duì)一位初學(xué)C51

的人來(lái)說(shuō),提供一個(gè)完整的簡(jiǎn)單程序比較容易上手。
--------------------------------------------------------------------------------------------------*/
/*寫漢字液晶子程 液晶屏分為4行*12列漢字,全部使用模擬接口方式。
/* TGLCMLIMIT64A接口程序(模擬方式)
液晶模塊供應(yīng)商:
Email:
;***************************************************************************
;連線圖:
;*LCM---89C52* *LCM---89C52* *LCM-------89C52* *LCM----------89C52* *
;*DB0---P0.0* *DB4---P0.4* *D/I-------P2.6* *CS1----------P2.4* *
;*DB1---P0.1* *DB5---P0.5* *R/W-------P2.7* *CS2----------P2.5* *
;*DB2---P0.2* *DB6---P0.6* *RST--------VCC* *CS3----------P3.2* *
;*DB3---P0.3* *DB7---P0.7* *E---------P2.3* *
;注:89C52的晶振頻率為12MHz *
;***************************************************************************/
//畫線部分請(qǐng)參照avr的c程序。
/*#pragma src /*生成ASM文件開關(guān),必要時(shí)打開 */
#include
#include
#include

#define Uchar unsigned char

/***********液晶顯示器接口引腳定義***************/

sbit Elcm= P2^3; //
sbit CS1LCM= P2^4; //
sbit CS2LCM= P2^5; //
sbit CS3LCM= P3^2; /*這個(gè)連接只是做實(shí)驗(yàn)的臨時(shí)接法。*/
sbit Dilcm= P2^6; //
sbit Rwlcm= P2^7; //
sfr Datalcm= 0x80; //數(shù)據(jù)口

/***********常用操作命令和參數(shù)定義***************/
#define DISPON 0x3f /*顯示on */
#define DISPOFF 0x3e /*顯示off */
#define DISPFIRST 0xc0 /*顯示起始行定義 */
#define SETX 0x40 /*X定位設(shè)定指令(頁(yè)) */
#define SETY 0xb8 /*Y定位設(shè)定指令(列) */
#define Lcdbusy 0x80 /*LCM忙判斷位 */

/**************顯示分區(qū)邊界位置*****************/
#define MODL 0x00 /*左區(qū) */
#define MODM 0x40 /*左區(qū)和中區(qū)分界 */
#define MODR 0x80 /*中區(qū)和右區(qū)分界 */
#define LCMLIMIT 0xC0 /*顯示區(qū)的右邊界 */

/****************全局變量定義*******************/
Uchar col,row,cbyte; /*列x,行(頁(yè))y,輸出數(shù)據(jù) */
bit xy; /*畫線方向標(biāo)志:1水平 */

/*****************函數(shù)列表**********************/
void Lcminit(void); /*液晶模塊初始化 */
void Delay(Uchar); /*延時(shí),入口數(shù)為Ms */
void lcdbusyL(void); /*busy判斷、等待(左區(qū)) */
void lcdbusyM(void); /*busy判斷、等待(中區(qū)) */
void lcdbusyR(void); /*busy判斷、等待(右區(qū)) */
void Putedot(Uchar); /*半角字符輸出 */
void Putcdot(Uchar); /*全角(漢字)輸出 */
void Wrdata(Uchar); /*數(shù)據(jù)輸出給LCM */
void Lcmcls( void ); /*LCM全屏幕清零(填充0) */
void wtcom(void); /*公用busy等待 */
void Locatexy(void); /*光標(biāo)定位 */
void WrcmdL(Uchar); /*左區(qū)命令輸出 */
void WrcmdM(Uchar); /*中區(qū)命令輸出 */
void WrcmdR(Uchar); /*右區(qū)命令輸出 */
void Putstr(Uchar *puts,Uchar i); /*中英文字符串輸出 */
void Rollscreen(Uchar x); /*屏幕向上滾動(dòng)演示 */
void Rddata(void); /* 從液晶片上讀數(shù)據(jù) */
void Linehv(Uchar length); /*橫(豎)方向畫線 */
void point(void); /*打點(diǎn) */
void Linexy(Uchar endx,Uchar endy);

/******************數(shù)組列表*********************/
Uchar code Ezk[]; /*ASCII常規(guī)字符點(diǎn)陣碼表 */
Uchar code Hzk[]; /*自用漢字點(diǎn)陣碼表 */
Uchar code STR1[]; /*自定義字符串 */
Uchar code STR2[]; //
Uchar code STR3[]; //
Uchar code STR4[]; //


/********************************/
/* 演示主程序 */
/********************************/
void main(void)

{
Uchar x;
col=0;
row=0;
Delay(40); /*延時(shí)大約40Ms,等待外設(shè)準(zhǔn)備好 */
Lcminit(); /*液晶模塊初始化,包括全屏幕清屏*/
Putstr(STR2,24); /*第一行字符輸出,24字節(jié) */
col=0;
row=2;
Putstr(STR1,12); /*第二行字符輸出,12字節(jié) */
col=0;
row=4;
Putstr(STR3,24); /*第三行字符輸出,24字節(jié) */
col=0;
row=6;
Putstr(STR4,24); /*第四行字符輸出,12字節(jié) */
x=0;
col=0;
row=0;
xy = 1; /*方向標(biāo)志。定為水平方向 */
Linehv(192); /*畫一條橫線(0,0)-(191,0) */
col=0;
row=15;
xy = 1;
Linehv(192); /*畫一條橫線(0,15)-(191,15) */
col=0;
row=32;
xy = 1;
Linehv(192); /*畫一條橫線(0,32)-(191,32) */
col=0;
row=1;
xy = 0; /*方向標(biāo)志。定為垂直方向 */
Linehv(31); /*畫一條豎線(0,1)-(0,31) */
col=191;
row=1;
xy = 0;
Linehv(31); /*畫一條豎線(191,1)-(191,31) */
col=0; /*設(shè)定斜線的起點(diǎn)坐標(biāo) */
row=63;
Linexy(44,31); /*畫一段斜線(0,63)-(44,31) */
col=44;
row=31;
Linexy(190,62); /*繼續(xù)畫斜線(44,31)-(191,63) */
while(1){
Rollscreen(x); /*定位新的顯示起始行 */
x++;
Delay(100); /*延時(shí),控制滾動(dòng)速度 */
};
}


/************************************************/
/*畫線。任意方向的斜線,不支持垂直的或水平線 */
/************************************************/

void Linexy(Uchar endx,Uchar endy)
{
register Uchar t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
Uchar incx,incy;

/* compute the distance in both directions */
delta_x=endx-col;
delta_y=endy-row;

/* compute the direction of the increment ,
an increment of "0" means either a vertical or horizontal lines */

if(delta_x>0) incx=1;
else if( delta_x==0 ) incx=0;
else incx=-1;


if(delta_y>0) incy=1;
else if( delta_y==0 ) incy=0;
else incy=-1;

/* determine which distance is greater */
delta_x = cabs( delta_x );
delta_y = cabs( delta_y );

if( delta_x > delta_y ) distance=delta_x;
else distance=delta_y;

/* draw the line */
for( t=0;t <= distance+1; t++ ) {
point();
xerr += delta_x ;
yerr += delta_y ;
if( xerr > distance ) {
xerr-=distance;
col+=incx;
}
if( yerr > distance ) {
yerr-=distance;
row+=incy;
}

}
}

/****************************************/
/*畫線。只提供X或Y方向的,不支持斜線 */
/****************************************/
void Linehv(Uchar length)
{
Uchar xs,ys;
if (xy){ys = col;
for (xs=0;xscol = ys + xs;
point();}
}
else {xs = row;
for (ys=0;ysrow = xs + ys;
point();}
}
}

/****************************************/
/* 畫點(diǎn) */
/****************************************/

void point(void)
{
Uchar x1,y1,x,y;
x1=col;
y1=row;
row=y1>>3; /*取Y方向分頁(yè)地址 */
Rddata();
y=y1&0x07; /*字節(jié)內(nèi)位置計(jì)算 */
x=0x01;
x=x<Wrdata(cbyte|x); /*畫上屏幕 */
col=x1; /*恢復(fù)xy坐標(biāo) */
row=y1;
}

/****************************************/
/* 屏幕滾動(dòng)定位 */
/****************************************/
void Rollscreen(Uchar x)
{
cbyte = DISPFIRST|x; /*定義顯示起始行為x?*/
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
}

/****************************************/
/* 一個(gè)字串的輸出 */
/****************************************/
void Putstr(Uchar *puts,Uchar i)
{
Uchar j,X;
for (j=0;j{
X = puts[j];
if (X&0x80)
{
Putcdot(X&0x7f); /*只保留低7位*/
}
else Putedot(X-0x20); /*ascii碼表從0x20開始*/
}
}

/****************************************/
/* 半角字符點(diǎn)陣碼數(shù)據(jù)輸出 */
/****************************************/
void Putedot(Uchar Order)
{
Uchar i,bakerx,bakery; /*共定義4個(gè)局部變量 */
int x; /*偏移量,字符量少的可以定義為UCHAR */
bakerx = col; /*暫存x,y坐標(biāo),已備下半個(gè)字符使用 */
bakery = row;
x=Order * 0x10; /*半角字符,每個(gè)字符16字節(jié) */
/*上半個(gè)字符輸出,8列 */
for(i=0;i<8;i++)
{
cbyte = Ezk[x]; /*取點(diǎn)陣碼,rom數(shù)組 */
Wrdata(cbyte); /*寫輸出一字節(jié) */
x++;
col++;
if (col==LCMLIMIT){col=0;row++;row++;}; /*下一列,如果列越界換行*/
if (row>7) row=0; /*如果行越界,返回首行 */
} /*上半個(gè)字符輸出結(jié)束 */

col = bakerx; /*列對(duì)齊 */
row = bakery+1; /*指向下半個(gè)字符行 */
/*下半個(gè)字符輸出,8列 */
for(i=0;i<8;i++)
{
cbyte = Ezk[x]; /*取點(diǎn)陣碼 */
Wrdata(cbyte); /*寫輸出一字節(jié) */
x++;
col++;
if (col==LCMLIMIT){col=0;row=row+2;}; /*下一列,如果列越界換行*/
if (row>7) row=1; /*如果行越界,返回首行 */
} /*下半個(gè)字符輸出結(jié)束 */
row=bakery;
} /*整個(gè)字符輸出結(jié)束 */


/****************************************/
/* 全角字符點(diǎn)陣碼數(shù)據(jù)輸出 */
/****************************************/
void Putcdot(Uchar Order)
{
Uchar i,bakerx,bakery; /*共定義3個(gè)局部變量 */
int x; /*偏移量,字符量少的可以定義為UCHAR */
bakerx = col; /*暫存x,y坐標(biāo),已備下半個(gè)字符使用 */
bakery = row;
x=Order * 0x20; /*每個(gè)字符32字節(jié) */

/*上半個(gè)字符輸出,16列 */
for(i=0;i<16;i++)
{
Wrdata(Hzk[x]); /*寫輸出一字節(jié) */
x++;
col++;
if (col==LCMLIMIT){ col=0;row++;row++;} /*下一列,如果列越界換行*/
if (row>6) row=0; /*如果行越界,返回首行 */
} /*上半個(gè)字符輸出結(jié)束 */

/*下半個(gè)字符輸出,16列 */
col = bakerx;
row = bakery+1;
for(i=0;i<16;i++) /*下半部分*/
{
Wrdata(Hzk[x]);
x++;
col++;
if (col==LCMLIMIT){col=0;row++;row++;} /*下一列,如果列越界換行*/
if (row>7) row=1; /*如果行越界,返回首行 */
} /*下半個(gè)字符輸出結(jié)束 */
row = bakery;
} /*整個(gè)字符輸出結(jié)束 */

/****************************************/
/* 清屏,全屏幕清零 */
/****************************************/
void Lcmcls( void )
{
for(row=0;row<8;row++)
for(col=0;col}

/****************************************/
/* 從液晶片上讀數(shù)據(jù),保留在全局變量中 */
/****************************************/

void Rddata(void)
{
Locatexy(); /*坐標(biāo)定位,返回時(shí)保留分區(qū)狀態(tài)不變 */
Datalcm=0xFF;
Dilcm = 1; /*數(shù)據(jù)*/
Rwlcm = 1; /*讀數(shù)據(jù)*/
Elcm = 1; /*讀入到LCM*/
_nop_();
cbyte = Datalcm; /*虛讀一次 */
Elcm = 0;
Locatexy(); /*坐標(biāo)定位,返回時(shí)保留分區(qū)狀態(tài)不變 */
Datalcm=0xFF;
_nop_();
Dilcm = 1; /*數(shù)據(jù)*/
Rwlcm = 1; /*讀數(shù)據(jù)*/
Elcm = 1; /*讀入到LCM*/
_nop_();
cbyte = Datalcm; /*從數(shù)據(jù)口讀數(shù)據(jù),真讀 */
Elcm = 0;
}

/****************************************/
/* 數(shù)據(jù)寫輸出 */
/****************************************/

void Wrdata(Uchar X)
{
Locatexy(); /*坐標(biāo)定位,返回時(shí)保留分區(qū)狀態(tài)不變 */
// wtcom();
Dilcm = 1; /*數(shù)據(jù)輸出*/
Rwlcm = 0; /*寫輸出 */
Datalcm = X; /*數(shù)據(jù)輸出到數(shù)據(jù)口 */
Elcm = 1; /*讀入到LCM*/
_nop_();
Elcm = 0;
}

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

本文將演示一種加速嵌入式系統(tǒng)設(shè)計(jì)原型階段的方法,說(shuō)明如何將與硬件無(wú)關(guān)的驅(qū)動(dòng)程序和傳感器結(jié)合使用,簡(jiǎn)化整個(gè)嵌入式系統(tǒng)的器件選擇。同時(shí)還將介紹嵌入式系統(tǒng)的器件、典型軟件結(jié)構(gòu)以及驅(qū)動(dòng)程序的實(shí)現(xiàn)。后續(xù)文章“利用與硬件無(wú)關(guān)的方法簡(jiǎn)...

關(guān)鍵字: 嵌入式系統(tǒng) 驅(qū)動(dòng)程序 傳感器

隨著科技的飛速發(fā)展,嵌入式系統(tǒng)已經(jīng)成為現(xiàn)代生活不可或缺的一部分,它們被廣泛應(yīng)用于從智能家居到自動(dòng)駕駛汽車的各個(gè)領(lǐng)域。而在這些系統(tǒng)中,C語(yǔ)言由于其高效性、可移植性和對(duì)硬件的直接控制能力,成為了嵌入式系統(tǒng)開發(fā)的首選語(yǔ)言。

關(guān)鍵字: C語(yǔ)言 驅(qū)動(dòng)程序

每個(gè)嵌入式軟件應(yīng)用程序都必須在某個(gè)時(shí)候訪問(wèn)最低級(jí)別的固件并控制硬件。驅(qū)動(dòng)程序的設(shè)計(jì)和實(shí)現(xiàn)對(duì)于確保系統(tǒng)能夠滿足其實(shí)時(shí)要求至關(guān)重要。

關(guān)鍵字: 嵌入式 驅(qū)動(dòng)程序

在Linux內(nèi)核開發(fā)中,字符設(shè)備驅(qū)動(dòng)程序是連接硬件設(shè)備與用戶空間應(yīng)用程序的重要橋梁。本文將詳細(xì)介紹如何編寫一個(gè)基本的字符設(shè)備驅(qū)動(dòng)程序,從理論框架到實(shí)際代碼實(shí)現(xiàn),再到測(cè)試和部署。

關(guān)鍵字: Linux 字符設(shè)備 驅(qū)動(dòng)程序

嵌入式開發(fā)作為一種專業(yè)且技術(shù)密集型的領(lǐng)域,涵蓋了從硬件底層驅(qū)動(dòng)、中間件到應(yīng)用層軟件開發(fā)等多個(gè)層面的工作,其所需的工具種類繁多,各有針對(duì)性,旨在提升開發(fā)效率、保證代碼質(zhì)量以及簡(jiǎn)化調(diào)試過(guò)程。

關(guān)鍵字: 嵌入式開發(fā) keil

USB攝像頭是一種采用USB接口的視頻采集設(shè)備,其優(yōu)點(diǎn)在于即插即用、操作簡(jiǎn)便,無(wú)需額外驅(qū)動(dòng)程序,支持筆記本電腦,并且成本較低,可以支持遠(yuǎn)程網(wǎng)絡(luò)觀看。

關(guān)鍵字: usb攝像頭 驅(qū)動(dòng)程序

與兩相雙極步進(jìn)電機(jī)的驅(qū)動(dòng)電路相比,兩相單極步進(jìn)電機(jī)的驅(qū)動(dòng)電路在輸入段配置、內(nèi)部邏輯及控制電路和驅(qū)動(dòng)電路使用雙通道方面基本相同,但是輸出段的配置不同。

關(guān)鍵字: 四相步進(jìn)電機(jī) 驅(qū)動(dòng)程序 程序電路

本文介紹了如何實(shí)現(xiàn)嵌入式MICREL網(wǎng)卡的驅(qū)動(dòng)程序開發(fā)和設(shè)計(jì)。首先,我們介紹了MICREL網(wǎng)卡的概述和工作原理。然后,詳細(xì)探討了驅(qū)動(dòng)程序的開發(fā)流程,包括硬件和軟件的配置以及驅(qū)動(dòng)程序的編寫和測(cè)試。最后,總結(jié)了幾點(diǎn)注意事項(xiàng)和...

關(guān)鍵字: 嵌入式 MICREL網(wǎng)卡 驅(qū)動(dòng)程序

在這篇文章中,小編將對(duì)OLED的相關(guān)內(nèi)容和情況加以介紹以幫助大家增進(jìn)對(duì)它的了解程度,和小編一起來(lái)閱讀以下內(nèi)容吧。

關(guān)鍵字: OLED 驅(qū)動(dòng)程序 無(wú)源驅(qū)動(dòng)

單片機(jī)內(nèi)部有很多的特殊功能寄存器,每個(gè)寄存器在單片機(jī)內(nèi)部都分配有唯一的地址,一般我們會(huì)根據(jù)寄存器功能的不同給寄存器賦予各自的名稱,當(dāng)我們需要在程序中操作這些特殊功能寄存器時(shí),必須要在程序的最前面將這些名稱加以聲明,聲明的...

關(guān)鍵字: C51 數(shù)據(jù)類型 擴(kuò)充定義
關(guān)閉