|
最近在學STC15W408AS單片機,以前使用及顯示正常的STC90C514AD和12864點陣液晶程序移植過來后,出現顯示異常,求指導。
單片機源程序如下:
#include "stc15.h"
#include <intrins.h>
#include "LCD_12864.h"
void main()
{
P3M1 = 0x00;
P3M0 = 0x00;
LCD_Init( ); //初始化
LCD_ClearTXT( ); //文本區清RAM函數
LCD_ClearBMP( );
LCD_Ascii(1,0,"12345678 ");
while (1);
}
#define uint unsigned int
#define uchar unsigned char
////***********12864***************
//sbit CS=P3^5; //開發版引腳聲明
//sbit SID=P3^6;
//sbit SCK1=P3^4;
sbit CS=P3^7;
sbit SID=P3^6;
sbit SCK1=P3^5;
unsigned char code bmp1[],bmp2[];
//串口發送一個字節
void LCD_SendByte(unsigned char Dbyte)
{
unsigned char i;
for(i=0;i<8;i++)
{
SCK1 = 0;
Dbyte=Dbyte<<1; //左移一位
SID = CY; //移出的位給SID
SCK1 = 1;
SCK1 = 0;
}
}
//****************送命令********************
void LCD_WriteCommand( unsigned char Cbyte )
{
CS = 1;
LCD_SendByte(0xf8); //11111,RW(0),RS(0),0
LCD_SendByte(0xf0&Cbyte); //高四位
LCD_SendByte(0xf0&Cbyte<<4); //低四位(先執行<<)
CS = 0;
}
//****************送數據********************
void LCD_WriteData( unsigned char Dbyte )
{
CS = 1;
LCD_SendByte(0xfa); //11111,RW(0),RS(1),0
LCD_SendByte(0xf0&Dbyte); //高四位
LCD_SendByte(0xf0&Dbyte<<4); //低四位(先執行<<)
CS = 0;
}
//****************初始化********************
void LCD_Init( void )
{
LCD_WriteCommand(0x34); //8BitMCU,基本指令集合
LCD_WriteCommand(0x30); //AC歸0,不改變DDRAM內容
LCD_WriteCommand(0x01); //顯示ON,游標OFF,游標位反白OFF
LCD_WriteCommand(0x06); //清屏,AC歸0
LCD_WriteCommand(0x0c); //寫入時,游標右移動
}
void LCD_pos(uchar X,uchar Y)
{
uchar pos;
LCD_WriteCommand(0x30); //顯示文本命令
if (X==1) {X=0x80;} //第一行
else if (X==2) {X=0x90;}
else if (X==3) {X=0x88;}
else if (X==4) {X=0x98;}
pos = X+Y ;
LCD_WriteCommand(pos); //顯示地址
}
//***************文本區清RAM函數****************************
void LCD_ClearTXT( void )
{
LCD_WriteCommand(0x01);
LCD_WriteCommand(0x34);
LCD_WriteCommand(0x30);
}
//**************圖形區清RAM函數****************************************
void LCD_ClearBMP( void )
{
unsigned char i,j;
LCD_WriteCommand(0x34); //8Bit擴充指令集,即使是36H也要寫兩次
for(i=0;i<32;i++) //12864實際為256x32
{
LCD_WriteCommand(0x80|i); //行位置
LCD_WriteCommand(0x80); //列位置
for(j=0;j<32;j++) //256/8=32 byte
LCD_WriteData(0);
}
LCD_WriteCommand(0x36); //數據送完后最后開顯示
}
void LCD_DATA_3(uchar X,uchar Y,unsigned long DATA)
{
LCD_pos(X,Y);
if(DATA>=0 && DATA<10)
{
LCD_WriteData(DATA+0X30);
}
else if(DATA<100 && DATA>=10)
{
LCD_WriteData(DATA/10+0X30);
// LCD_WriteData('C');
LCD_WriteData(DATA%10+0X30);
}
else if(DATA<1000 && DATA>=100)
{
LCD_WriteData(DATA/100+0X30);
// LCD_WriteData('.');
LCD_WriteData(DATA%100/10+0X30);
LCD_WriteData(DATA%10+0X30);
}
else if(DATA<10000 && DATA>=1000)
{
LCD_WriteData(DATA/1000+0X30);
LCD_WriteData(DATA%1000/100+0X30);
LCD_WriteData(DATA%100/10+0X30);
LCD_WriteData(DATA%10+0X30);
}
else if(DATA<100000 && DATA>=10000)
{
LCD_WriteData(DATA/10000+0X30);
LCD_WriteData(DATA%10000/1000+0X30);
LCD_WriteData(DATA%1000/100+0X30);
LCD_WriteData(DATA%100/10+0X30);
LCD_WriteData(DATA%10+0X30);
}
else if(DATA<1000000 && DATA>=100000)
{
LCD_WriteData(DATA/100000+0X30);
LCD_WriteData(DATA%100000/10000+0X30);
LCD_WriteData(DATA%10000/1000+0X30);
LCD_WriteData(DATA%1000/100+0X30);
LCD_WriteData(DATA%100/10+0X30);
LCD_WriteData(DATA%10+0X30);
}
else if(DATA<10000000 && DATA>=1000000)
{
LCD_WriteData(DATA/1000000+0X30);
LCD_WriteData(DATA%1000000/100000+0X30);
LCD_WriteData(DATA%100000/10000+0X30);
LCD_WriteData(DATA%10000/1000+0X30);
LCD_WriteData(DATA%1000/100+0X30);
LCD_WriteData(DATA%100/10+0X30);
LCD_WriteData(DATA%10+0X30);
}
else if(DATA<100000000 && DATA>=10000000)
{
LCD_WriteData(DATA/10000000+0X30);
LCD_WriteData(DATA%10000000/1000000+0X30);
LCD_WriteData(DATA%1000000/100000+0X30);
LCD_WriteData(DATA%100000/10000+0X30);
LCD_WriteData(DATA%10000/1000+0X30);
LCD_WriteData(DATA%1000/100+0X30);
LCD_WriteData(DATA%100/10+0X30);
LCD_WriteData(DATA%10+0X30);
}
}
//****************送字符串*********************************************
//1行顯示的是8個字符
//顯示8個修改參數即可
void LCD_Ascii(unsigned char row,unsigned char col,unsigned char *puts)
{
LCD_WriteCommand(0x30); //8BitMCU,基本指令集合
LCD_pos(row,col); //確定顯示地址
while(*puts != '\0') //判斷字符串是否顯示完畢
{
if(col==8) //判斷換行
{ //若不判斷,則自動從第一行到第三行
col=0;
row++;
}
if(row==5) row=0; //一屏顯示完,回到屏左上角
LCD_pos(row,col); //確定顯示地址
LCD_WriteData(*puts); //一個漢字要寫兩次
puts++;
LCD_WriteData(*puts);
puts++;
col++;
}
}
//**********字符反白顯示*************************************************
//輸入參數:CX=要反白字符的行(0-3)
//CY=要反白字符的列(0-7)
//width=要反白字符的長度(1-16)
//off_on開反白關反白
void LCD_convertChar (uchar CX, CY, width,off_on)
{
uchar lcdPosX,lcdPosY ;
uchar halfLineCnt,basicBlock;
// EA=0;
halfLineCnt = 16;
if (CX == 1){CX = 0x80;lcdPosY= 0x80;}
else if (CX == 2){CX = 0x90;lcdPosY= 0x90;}
else if (CX == 3){CX = 0x88;lcdPosY= 0x80;}
else if (CX == 4){CX = 0x88;lcdPosY= 0x90;}
lcdPosX = CX + CY;
for (; halfLineCnt != 0; halfLineCnt--)
{
basicBlock = width&0x1F; //低5位,主要是0到16
LCD_WriteCommand(0x36);
LCD_WriteCommand(lcdPosY);
LCD_WriteCommand(lcdPosX);
LCD_WriteCommand(0x30);
for (;basicBlock != 0; basicBlock--)
{
if(off_on==0) //關反白
{
LCD_WriteData(0x00);
}
else
{
LCD_WriteData(0xff);//開反白
}
}
lcdPosY++;
}
LCD_WriteCommand(0x36);
LCD_WriteCommand(0x30);
}
|
|