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