標(biāo)題: [求助]89C52并口12864顯示亂碼 [打印本頁(yè)]
作者: lyonkon 時(shí)間: 2018-1-5 17:53
標(biāo)題: [求助]89C52并口12864顯示亂碼
12864B--2.0 帶字庫(kù) 7920
DBO--DB7 接 85c52 P2.0--P2.7 V0接5v。
RS接P1.2 RW接P1.3 EN接P1.4 PSB接+電源 rst接+電源,.電源電壓5V,代碼我看不懂只是改了一下管腳,F(xiàn)在顯示亂碼,
因?yàn)槭浅鯇W(xué)者,想試12864好壞,然后再學(xué)程序,試了10幾天了,燒很多代碼進(jìn)去都是亂碼。
在此請(qǐng)各位朋友,幫我斷一下原因。或者發(fā)一個(gè)簡(jiǎn)單代碼,我試一下機(jī)。
用本論壇大神的代碼,
代碼是抄的如下:
#include<reg52.h>
IMG0001B.jpg (9.54 KB, 下載次數(shù): 52)
下載附件
2018-1-5 17:41 上傳
IMG0002A.jpg (6.72 KB, 下載次數(shù): 48)
下載附件
2018-1-5 17:41 上傳
#include <math.h>
void lcd_init(void);
void clr_lcd(void);
void send_com(unsigned char cmd);
void send_data(unsigned char dat);
void chek_busy(void);
void set_xy(unsigned char xpos,unsigned char ypos);
void print(unsigned char x,unsigned char y,char* str);
void printstr(unsigned char xpos,unsigned char ypos,unsigned char str[],unsigned char k);
unsigned char code buf[4] ={0xbb,0xb6,0xd3,0xad};//歡迎
#define DATA P2
#define CONTROL P1
#define E 4 //并行的使能信號(hào) sbit E = P0^7
#define RW 3 //并行的讀寫信號(hào) sbit RW = P0^6
#define RS 2 //并行的指令數(shù)據(jù)選擇信號(hào) sbit RS = P0^5
#define PSB 5 //并/串行接口選擇 sbit PSB = P0^4
#define RST 6 //復(fù)位 低電平有效 sbit RST = P0^3
#define SETB(x,y) (x|=(1<<y))
#define CLRB(x,y) (x&=(~(1<<y)))
#define CHKB(x,y) (x&(1<<y))
/********************測(cè)忙碌**********************/
//測(cè)忙碌子程序
//RS=0,RW=1,E=H,D0-D7=狀態(tài)字
/************************************************/
void chek_busy(void)
{ unsigned char temp1;//狀態(tài)信息(判斷是否忙)
CLRB(CONTROL,RS); // RS = 0;
SETB(CONTROL,RW); // RW = 1;
SETB(CONTROL,E); // E = 1;
do{temp1 = DATA;DATA=0xFF;} while(temp1&0x80);
SETB(CONTROL,E); // E = 1;
DATA=0xFF;
}
/********************寫命令**********************/
//寫命令子程序
//
/************************************************/
void send_com(unsigned char cmd)/*寫命令*/
{
chek_busy();
CLRB(CONTROL,RS); //RS = 0;
CLRB(CONTROL,RW); //RW = 0;
DATA = cmd;
SETB(CONTROL,E); //E = 1;
CLRB(CONTROL,E); //E = 0;
}
/********************寫數(shù)據(jù)**********************/
//寫數(shù)據(jù)子程序
//
/************************************************/
void send_data(unsigned char dat)
{
chek_busy();
SETB(CONTROL,RS); //RS = 1;
CLRB(CONTROL,RW); //RW = 0;
DATA = dat;
SETB(CONTROL,E); //E = 1;
CLRB(CONTROL,E); //E = 0;
}
/********************初始化**********************/
//復(fù)位、通訊方式選擇
/************************************************/
void lcd_init(void)
{
SETB(CONTROL,RST);//復(fù)位RST=1
SETB(CONTROL,PSB); //通訊方式為并口PSB = 1
//send_com(0x34);//34H--擴(kuò)充指令操作
send_com(0x30);//功能設(shè)置,一次送8位數(shù)據(jù),基本指令集
send_com(0x0C);//0000,1100 整體顯示,游標(biāo)off,游標(biāo)位置off
send_com(0x01);//0000,0001 清DDRAM
send_com(0x02);//0000,0010 DDRAM地址歸位
send_com(0x80);//1000,0000 設(shè)定DDRAM 7位地址000,0000到地址計(jì)數(shù)器AC
}
/*******************************************************************/
// 設(shè)置顯示位置 xpos(1~16),tpos(1~4)
/*******************************************************************/
void set_xy(unsigned char xpos,unsigned char ypos)
{
switch(ypos)
{
case 1:
send_com(0X80|xpos);break;
case 2:
send_com(0X90|xpos);break;
case 3:
send_com(0X88|xpos);break;
case 4:
send_com(0X98|xpos);break;
default:break;
}
}
/*******************************************************************/
// 在指定位置顯示字符串
/*******************************************************************/
void print(unsigned char x,unsigned char y,char* str)
{
unsigned char lcd_temp;
set_xy(x,y);
lcd_temp=*str;
while(lcd_temp != 0x00)
{
send_data(lcd_temp);
lcd_temp=*(++str);
}
}
/********************寫字符串******************/
//寫字符串子程序
//xpos1取0~7共八列,ypos1取0~3共四行。
/**********************************************/
void printstr(unsigned char xpos,unsigned char ypos,unsigned char str[],unsigned char k)
{ unsigned char n;
switch (ypos)
{ case 1: xpos |= 0x80;break; //第一行
case 2: xpos |= 0x90;break; //第二行
case 3: xpos |= 0x88;break; //第三行
case 4: xpos |= 0x98;break; //第四行
default: break;
}
send_com(xpos); //此處的Xpos已轉(zhuǎn)換為L(zhǎng)CM的顯示寄存器實(shí)際地址
for(n=0;n < k;n++)
{
send_data(str[n]);//顯示漢字時(shí)注意碼值,連續(xù)兩個(gè)碼表示一個(gè)漢字
}
}
/********************清屏************************/
//清屏
/************************************************/
void clr_lcd(void)
{
send_com(0x01);
//send_com(0x34);
//send_com(0x30);
}
/**************主函數(shù)***********************/
void main ()
{
lcd_init(); //設(shè)定液晶工作方式
printstr(1,1,buf,4);
print(5,1,"光臨");
print(0,3," SEEGU起飛空間");// 起飛 兩字是我剛剛發(fā)帖時(shí)改過(guò)的
while(1) { }
}
作者: lxa0 時(shí)間: 2018-1-5 19:30
亂碼現(xiàn)象就是讀寫時(shí)序不對(duì)~~~~~~~
作者: 啦啦啦1234 時(shí)間: 2018-1-5 20:37
LCD12864液晶顯示亂碼修復(fù):
這是因?yàn)?/font>keil軟件的bug,需要補(bǔ)一個(gè)補(bǔ)丁。
補(bǔ)丁已經(jīng)放在附件里
解壓后復(fù)制里面的ccKeilVxx.exe 文件到
Keil安裝目錄的 keil\C51\BIN 路徑下
然后雙擊打開ccKeilVxx.exe,點(diǎn)start
如果以上還是無(wú)法解決那就是硬件問(wèn)題了
-
-
keil補(bǔ)丁.rar
2018-1-5 20:35 上傳
點(diǎn)擊文件名下載附件
10.48 KB, 下載次數(shù): 14
作者: lyonkon 時(shí)間: 2018-1-5 21:53
我按照樓上2位的思路來(lái)調(diào)整一下,
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |