|
最近在学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);
}
|
|