|
本人小白,最近利用點(diǎn)業(yè)余時(shí)間和手頭的一點(diǎn)資源學(xué)習(xí)一下單片機(jī),過(guò)程中遇到點(diǎn)問(wèn)題,請(qǐng)高手幫忙解決一下。在此先謝謝各位。
硬件:STC89c51RC單片機(jī)最小系統(tǒng),10K電位器,OCMJ5X10b顯示器
程序:(程序是拷貝的網(wǎng)上的,自己改了要顯示的字,問(wèn)題是只能顯示一個(gè)“中”字,后面的不能顯示,修改了XY位置也沒(méi)變化)
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define dat P1
sbit busy_ocmj5=P0^1;//忙閑標(biāo)志
sbit req_ocmj5=P0^0;//使能
unsigned char show[]={0x36,0x30,0x1b,0x0a,0x28,0x2b,0x23,0x51};
int i;
void xesj_ocmj(uchar s)//寫字子程序
{
dat=0xff;
req_ocmj5=0;//初始化使能
busy_ocmj5=1;
while(busy_ocmj5);
dat=s;//發(fā)送數(shù)據(jù)
req_ocmj5=1;//
_nop_();//使能腳延時(shí)
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
req_ocmj5=0;
}
void main()
{
xesj_ocmj(0xf4);//清屏指令
xesj_ocmj(0xf0);//顯示漢字指令
xesj_ocmj(0x10);//X坐標(biāo)
xesj_ocmj(0x10);//Y坐標(biāo)
xesj_ocmj (show[0]);
xesj_ocmj (show[1]);
xesj_ocmj (show[2]);
xesj_ocmj (show[3]);
_nop_();//
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
xesj_ocmj(0x10);//
xesj_ocmj(0x10);//
xesj_ocmj (show[4]);
xesj_ocmj (show[5]);
xesj_ocmj (show[6]);
xesj_ocmj (show[7]);
_nop_();//
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
while(1);
//
}
關(guān)于OCMJ5X10b的一點(diǎn)介紹:
OCMJ5X10是160×80點(diǎn)陣的中文圖文液晶圖形顯示器模塊。該模塊的內(nèi)部由于含有國(guó)標(biāo)一級(jí)簡(jiǎn)體字庫(kù),使得漢字的顯示異常方便;同時(shí),該模塊與單片機(jī)的硬件接口除數(shù)據(jù)總線外,僅使用了REQ/BUSY兩根握手信號(hào)線,簡(jiǎn)化了與單片機(jī)的硬件接口電路設(shè)計(jì)。上述特點(diǎn)對(duì)軟件、硬件資源均十分緊張的單片機(jī)系統(tǒng)來(lái)說(shuō)是十分重要的。OCMJ5X10 中文模塊所有的設(shè)置初始化工作都是在上電時(shí)自動(dòng)完成的,實(shí)現(xiàn)了“即插即用”;同時(shí),保留了一條專用的復(fù)位線供用戶選擇使用,可對(duì)工作中的模塊進(jìn)行軟件或硬件強(qiáng)制復(fù)位。規(guī)劃整齊的10個(gè)用戶接口命令代碼,非常容易記憶。標(biāo)準(zhǔn)用戶硬件接口采用REQ/BUSY 握手協(xié)議,簡(jiǎn)單可靠。
OCMJ5X10模塊與CPU的接口除了使用DB0~DB7口8根數(shù)據(jù)線外,僅使用了REQ和BUSY兩根控制線,構(gòu)成請(qǐng)求/應(yīng)答(REQ/BUSY)握手方式,省略了傳統(tǒng)模塊接口方式的片選、讀寫控制、指令/數(shù)據(jù)選擇、使能控制等控制線,從而使硬件接口及軟件時(shí)序變得非常簡(jiǎn)單。在硬件資源十分緊張的應(yīng)用系統(tǒng)中,也可采用REQ單線延時(shí)控制方式,從而把硬件資源占用降至最低。接口協(xié)議如下:當(dāng)BUSY線為高電平時(shí)(BUSY =1),表示模塊忙于內(nèi)部處理,不能接收用戶命令;而BUSY為低電平時(shí)(BUSY =0),表示模塊空閑,等待接收用戶命令。CPU可在BUSY為低后的任意時(shí)刻開(kāi)始發(fā)送命令。首先,把用戶命令的當(dāng)前字節(jié)放到數(shù)據(jù)線上,接著發(fā)送高電平REQ 信號(hào),通知模塊,請(qǐng)求處理當(dāng)前數(shù)據(jù)線上的命令或數(shù)據(jù)。模塊在收到外部的REQ高電平信號(hào)后,立即讀取數(shù)據(jù)線上的命令或數(shù)據(jù),同時(shí)將應(yīng)答線BUSY變?yōu)楦唠娖剑砻髂K已收到數(shù)據(jù)并正在忙于對(duì)此數(shù)據(jù)的內(nèi)部處理。此時(shí),用戶對(duì)模塊的寫操作已經(jīng)完成,可以撤消數(shù)據(jù)線上的信號(hào)并可做模塊顯示以外的其它工作,也可不斷地查詢BUSY是否為低。如果BUSY =0,說(shuō)明模塊對(duì)用戶的寫操作已經(jīng)執(zhí)行完畢,可以再送下一個(gè)數(shù)據(jù)。如向模塊發(fā)出一個(gè)完整的顯示漢字的命令,包括顯示坐標(biāo)及漢字代碼在內(nèi)共需5個(gè)字節(jié),模塊在接收到最后一個(gè)字節(jié)后,才開(kāi)始執(zhí)行整個(gè)命令的內(nèi)部操作;因此,最后一個(gè)字節(jié)的應(yīng)答B(yǎng)USY 高電平(BUSY =1)持續(xù)時(shí)間較長(zhǎng)。
還請(qǐng)各位大神幫忙看看什么問(wèn)題導(dǎo)致,再次謝謝各位大神!
|
|