dpzc1234 发表于 2008-5-11 16:53:16

LCD12864控制芯片是ST7565串口通讯不能正常显示不知道怎么回事

用的是飞思卡尔单片机AW系列的下面是我的程序大家帮忙看看什么原因啊

#include <hidef.h> /* for EnableInterrupts macro */
#include <string.h>
#include "derivative.h" /* include peripheral declarations */
/////////////////////////////////////////////////////////////////////////////
//变量声明部分
/////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////串口通讯变量
#define cDataLen 10                                                //数据缓冲区的长度
Bool bRepTransFlag ;   //串口通讯状态重发标志
unsigned char cTransNum;                                //发送数据的当前字节数
unsigned char cTransSum;                                //发送数据效验和
unsigned char cTransBuf;        //发送数据暂存区                                               
unsigned char cReceiveNum;                                //接收数据的当前字节数
unsigned char cReceiveSum;                                //接收数据效验和
unsigned char cReceiveBuf;        //接收数据暂存区
unsigned char cReceiveTemp;                                //本次接收到的数据暂存
unsigned char cReceiveTemp1;                        //上次接收接收到的数据暂存
#define cTime 50                                                //定时发送时间计数最大值
unsigned char cTimeNum;                                        //定时发送计数值
unsigned char SBUF;             //缓冲区

////////////////////////////////////////键盘扫描控制变量
unsigned char cScanKey;                                        //扫描键盘的键位编码
unsigned char cScanNum;                                        //连续键盘扫描次数
Bool bScanEmpty;           //键盘扫描为空标志位

///////////////////////////////////////LCD控制变量
#define LCD_CS PTBD_PTBD0      //片选信号,低有效
#define LCD_RS PTBD_PTBD1   //复位信号,低有效      
#define LCD_A0PTBD_PTBD2   //命令数据选择端,高电平数据低电平命令
#define LCD_SCL PTBD_PTBD3   //串行模式时钟端
#define LCD_SIPTBD_PTBD4   //串行模式数据端                        


#define LCD_X_MAX                        128-1                        //屏幕的X轴的物理宽度
#define LCD_Y_MAX                        64-1                        //屏幕的Y轴的物理宽度
                       
#define LCD_XY_Switch                0                                //显示时X轴和Y由交换
#define LCD_X_Rev                        0                                //显示时X轴反转
#define LCD_Y_Rev                        0                                //显示时Y轴反转

#if LCD_XY_Switch == 0
        #define Dis_X_MAX                LCD_X_MAX
        #define Dis_Y_MAX                LCD_Y_MAX       
#endif

#if LCD_XY_Switch == 1
        #define Dis_X_MAX                LCD_Y_MAX
        #define Dis_Y_MAX                LCD_X_MAX       
#endif

#define LCD_INITIAL_COLOR        0x00                        //定义LCD屏初始化时的背景色

//以下定义为针对于SPLC501的功能指令进行定义的,局部可修改~
//LCD供电电平选择
#define                M_LCD_VDD_SET        M_LCD_SETR_4                //3.3V供电时选此二项
#define                M_LCD_VDD                M_LCD_BIAS_9                //....
//#define                M_LCD_VDD_SET        M_LCD_SETR_4        //5.0V供电时选此二项
//#define                M_LCD_VDD                M_LCD_BIAS_9        //...
//LCD指令
//LCD开关命令
#define                M_LCD_ON                0xaf
#define                M_LCD_OFF                0xae
//设置上电控制模式
#define                M_LCD_POWER_BC        0x2c
#define                M_LCD_POWER_VR        0x2a
#define                M_LCD_POWER_VC        0x29
#define                M_LCD_POWER_ALL        0x2f
//V5内部电压调节电阻设置……
#define                M_LCD_SETR_0        0x20
#define                M_LCD_SETR_1        0x21
#define                M_LCD_SETR_2        0x22
#define                M_LCD_SETR_3        0x23
#define                M_LCD_SETR_4        0x24
#define                M_LCD_SETR_5        0x25
#define                M_LCD_SETR_6        0x26
#define                M_LCD_SETR_7        0x27
//...end
#define                M_LCD_ELE_VOL        0x81                //电量设置模式(显示亮度)
//偏压设置
#define                M_LCD_BIAS_9        0xa2                //V5时选此选项设置
#define                M_LCD_BIAS_7        0xa1                //V3时选此选项设置
//Com 扫描方式设置命令
#define                M_LCD_COM_NOR        0xc0                //正常方式
#define                M_LCD_COM_REV        0xc8                //反相
//Segment方向选择
#define                M_LCD_SEG_NOR        0xa0                //正常
#define                M_LCD_SEG_REV        0xa1                //反向
//全屏点亮/变暗指令
#define                M_LCD_ALL_LIGNT        0xa5                //LCD ALL paint ON
#define                M_LCD_ALL_LOW        0xa4                //Normal Display mode
//正相反相显示控制指令,RAM中数据不变
#define                M_LCD_ALL_NOR        0xa6                //正相
#define                M_LCD_ALL_REV        0xa7                //反相
//静态指示器控制指令
#define                M_LCD_STATIC_ON        0xad                //ON
#define                M_LCD_STATIC_OFF 0xac                //OFF
//设置显示起始行对应RAM行号
#define                M_LCD_BEGIN_LINE 0x40                //基数,后面可加的尾数可为0~63
//设置当前页基数
#define                M_LCD_COL_PAGE        0xb0                //基数指令,后可加尾数0~8
//设置当前列基数
#define                M_LCD_COL_LINE_LOW        0x04                //基数指令,低四位有效
#define                M_LCD_COL_LINE_HIG        0x10                //基数指令,低四位有效


unsigned char Asii0608[];                        //6X8的ASII字符库
unsigned char Asii0816[];                        //8X16的ASII字符库
unsigned char GB1616[];                                //16*16自定义的汉字库

unsigned char X_Witch;                                                                        //字符写入时的宽度
unsigned char Y_Witch;                                                                        //字符写入时的高度
unsigned char Font_Wrod;                                                                //字体的每个字模占用多少个存储单元数
unsigned char *Char_TAB;                                                //字库指针
//unsigned char Plot_Mode;                                                                        //绘图模式
unsigned char BMP_Color;
unsigned char Char_Color;

void Delay(unsigned int time);   //延时子程序//
unsigned int iStakeout;                                        //切换监视状态延时计数
unsigned char dat;

//16X16汉字字模数组,纵向取模,字节倒序
unsigned char GB1616[] =
{
/*--文字:铭--*/
/*--新宋体12;此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x30,0x2C,0xEB,0x28,0x28,0x40,0x20,0x38,0x47,0x84,0x44,0x34,0x0C,0x00,0x00,
0x01,0x01,0x01,0xFF,0x41,0x25,0x04,0x02,0xFE,0x43,0x42,0x42,0x42,0xFE,0x00,0x00,

/*--文字:正--*/
/*--新宋体12;此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x02,0x02,0xC2,0x02,0x02,0x02,0x02,0xFE,0x82,0x82,0x82,0x82,0x82,0x02,0x00,
0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x00,

/*--文字:同--*/
/*--新宋体12;此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0xFE,0x02,0x12,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x12,0x02,0xFE,0x00,0x00,
0x00,0xFF,0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x08,0x1F,0x40,0x80,0x7F,0x00,0x00,

/*--文字:创--*/
/*--新宋体12;此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x20,0xD0,0x4C,0x43,0x44,0x48,0xD8,0x30,0x10,0x00,0xFC,0x00,0x00,0xFF,0x00,
0x00,0x00,0x3F,0x40,0x40,0x42,0x44,0x43,0x78,0x00,0x00,0x07,0x20,0x40,0x3F,0x00,
/*--调入了一幅图像:C:\Documents and Settings\xq\桌面\1616_MzDesign.bmp--*/
/*--宽度x高度=16x16--*/
0xC0,0xF0,0xF8,0xFC,0x7E,0x3F,0x1F,0x9F,0x7F,0x3F,0x1E,0x9E,0xBC,0xFC,0xF0,0xC0,
0x03,0x13,0x33,0x71,0xF8,0xFE,0xFF,0xF9,0xFC,0xFE,0xFF,0xF1,0x70,0x33,0x13,0x03
};


/////////////////////////////////////////////////////////////////////////////
//主函数部分
        void Transmit(void);        //定时发送处理
        void KeyBoard1(void);        //正转按键按下
        void KeyBoard2(void);        //反转按键按下
        void KeyBoard3(void);        //停机按键按下
        void KeyBoard4(void);        //菜单按键按下
        void KeyBoard5(void);        //设置按键按下
        void KeyBoard6(void);        //取消按键按下
        void KeyBoard7(void);        //增加按键按下
        void KeyBoard8(void);        //减少按键按下
void Delay(unsigned int time);
void Init_LCD(void);
void Comwrite(unsigned char com);
void Datawrite(unsigned char data);
void display(unsigned char disp,unsigned char disp1);
void hanzi_disp();
void dispkuang();
void main(void);
void LCD_Fill(unsigned char a);
//=============================
//函数名:Init_TPM
//作用:初始化TPM
//=============================
void Init_TPM(void)
{
        TPM1SC=0x48;//TPM时钟源为总线时钟,分频系数=4;使能定时器溢出中断
        TPM1MOD=0X2710;//模寄存器 10000*0.2
//        TPM1MODH=0x27;
//        TPM1MODL=0x10;
        TPM1CNTH=0;//任意时刻对TPM1CNTH或TPM1CNTL的写操作将计数寄存器的计数值复位(清零)
}
//=========================
//函数名:Init_KBI()
//功能:初始化按键
//=========================
void Init_KBI(void)
{
        PTAD = 0XFF;//端口A数据寄存器初始化为1
        PTADD_PTADD0=0;//引脚PTA0作为输入引脚正转   
        PTADD_PTADD1=0;//引脚PTA1作为输入引脚反转
        PTADD_PTADD2=0;//引脚PTA2作为输入引脚停止
        PTADD_PTADD3=0;//引脚PTA3作为输入引脚取消
PTADD_PTADD4=0;//引脚PTA4作为输入引脚减少
PTADD_PTADD5=0;//引脚PTA5作为输入引脚增加
PTADD_PTADD6=0;//引脚PTA6作为输入引脚设定
PTADD_PTADD7=0;//引脚PTA7作为输入引脚菜单(按键输入低有效)
}

//=============================
//函数名:Init_PTB
//功能:初始化LCD控制口
//================================
void Init_PortB(void)
{

PTBDD =0XFF;//端口方向寄存器初始化为输出
LCD_CS=1; //CS初始化为高低有效
LCD_RS=1; //RES初始化为高 低有效
LCD_A0=0; //A0初始化为高
LCD_SCL=0; //SCL初始化为低
LCD_SI=0; //SI初始化为高
//SI的状态初始化什么都无报谓
//SCL你看一下哪个沿是有效的,以此来决定你要初始化的状态是高还是低,
//A0初始化为什么状态也无所谓
}
//======================
void Init_PortF(void)
{
        PTFD = 0XFF;//端口A数据寄存器初始化为0
        PTFDD_PTFDD0=1;//引脚PTA0作为输出引脚
        PTFDD_PTFDD1=1;//引脚PTA1作为输出引脚
        PTFDD_PTFDD2=1;//引脚PTA2作为输出引脚
        PTFDD_PTFDD3=1;//引脚PTA3作为输出引脚
        PTFDD_PTFDD4=1;//引脚PTF4作为输出引脚停止
        PTFDD_PTFDD5=1;//引脚PTF5作为输出引脚正转
        PTFDD_PTFDD6=1;//引脚PTF6作为输出引脚反转(LED指示低有效)
}

//====================================================================
//函数名:Init_SCI1
//作用:串口1初始化
//====================================================================
void Init_SCI1(void)
{
        SCI1BDH=0x00;//波特率设置:波特率=总线频率/(16*BR)
        SCI1BDL=0x82;//总线频率为20M,波特率为9615,BR=130
        SCI1C1=0x00;//0x00:开始位+8个数据位(低位在前)+停止位;无校验
                    //0x02:开始位+8个数据位(低位在前)+停止位;偶校验,even
                    //0x03:开始位+8个数据位(低位在前)+停止位;奇校验,odd
            //#define SCI1C1                        _SCI1C1.Byte
//0 SCI1C1_PT       0,奇效验1,偶效验
//1 SCI1C1_PE       奇偶效验允许位                  
//2 SCI1C1_ILT      空闲方式选择位
//3 SCI1C1_WAKE   唤醒条件选择位   
//4 SCI1C1_M      字符长度选择位
//5 SCI1C1_RSRC   接收源选择位   
//6 SCI1C1_SCISWAI等待模式下时钟选择位   
//7 SCI1C1_LOOPS    循环模式选择位
        SCI1C2_TE=0;//0:禁止发送;1:使能发送
        SCI1C2_TIE=0;//0:禁止发送中断;1:使能发送中断
        SCI1C2_TCIE=1;//发送完成中断允许位
       
        SCI1C2_RIE=1;//0:禁止接收中断;1:使能接收中断
        SCI1C2_RE=1;//0:禁止接收;1:使能接收
        cTransNum=0;                        //清发送数据计数值
        cTransSum=0;                        //清发送数据效验和
        cTransBuf='\0';                //设定发送的数据长度为零

        cReceiveNum=0;                        //清接收数据计数值
        cReceiveSum=0;                        //清接收数据效验和
        cReceiveBuf='\0';        //设定接收的数据长度为零

        cReceiveTemp=0;                        //清本次接收数据暂存
        cReceiveTemp1=0;                //清上次接收数据暂存
        cTimeNum=0;                                //清定时发送计数
}

//===========================
//函数名:Init_FBE
//作用:设置ICG;外接晶振10M
//===========================
void Init_FBE(void)
{

        ICGC1=0x78;//P=1 FLL使能外部参考模式振荡器配置为高频范围,FLL 环系数P=1
        ICGC2=0x01;//N=4,R=4,系统时钟=Fext*P*N/R Fext为晶振频率
}

//==============================================================
//函数名:Init_mclk
//作者:KLY
//日期:2007-11-8 10:34   
//功能:MCU的MCLK引脚输出时钟信号,该信号频率为系统总线频率的一半   
//输入参数:无
//返回值:无
//修改记录:无
//===============================================================
void Init_mclk(void)
{
        SMCLK_MPE=1;
        SMCLK_MCSEL=1;
}

//========================================================================
// 函数: void FontSet(int Font_NUM,unsigned int Color)
// 描述: 文本字体设置
// 参数: Font_NUM 字体选择,以驱动所带的字库为准
//               Color文本颜色,仅作用于自带字库
// 返回: 无
// 备注:
// 版本:
//      2006/10/15      First version
//========================================================================
void FontSet(unsigned char Font_NUM,unsigned char Color)
{
        switch(Font_NUM)
        {
               
                case 0: Font_Wrod = 32;        //汉字A
                                X_Witch = 16;
                                Y_Witch = 2;
                                Char_Color = Color;
                                Char_TAB = (unsigned char *)GB1616;
                break;
/*                case 3: Font_Wrod = 16;        //汉字B
                                X_Witch = 16;
                                Y_Witch = 2;
                                Char_Color = Color;
                                Char_TAB = GB16;
                break;*/
                default: break;
        }
}
//========================================================================
// 函数: void PutChar(unsigned char x,unsigned char y,char a)
// 描述: 写入一个标准字符
// 参数: xX轴坐标   yY轴坐标(0~7页)
//               a要显示的字符在字库中的偏移量
// 返回: 无
// 备注: ASCII字符可直接输入ASCII码即可
// 版本:
//      2006/10/15      First version
//                2007/05/17                V2.1for seriea port LCD
//========================================================================
void PutChar(unsigned char x,unsigned char y,char a)      
{
        unsigned char i,j;
        unsigned char *p_data;
        p_data = Char_TAB + a*Font_Wrod;        //要写字符的首地址
        x = x+1;                                                        //Edit by xinqiang
        for(j=0;j<Y_Witch;j++)
        {
                if((y+j) < (Dis_Y_MAX/8))
                        Comwrite(y+j+0xb0);
                Comwrite(((x&0xf0) >> 4)|0x10);        //设置初始地址
                Comwrite(x&0x0f);
                for(i=0;i<X_Witch;i++)
                {
                        if(((x+i) < Dis_X_MAX)&&((y+j) < (Dis_Y_MAX/8)))
                                Datawrite(*p_data++);
                }
        }
}

//========================================================================
// 函数: void PutString(unsigned char x,unsigned char y,char *p)
// 描述: 在x、y为起始坐标处写入一串标准字符
// 参数: xX轴坐标   yY轴坐标(0~7页)
//               p要显示的字符串
// 返回: 无
// 备注: 仅能用于自带的ASCII字符串显示
// 版本:
//      2006/10/15      First version
//========================================================================
void PutString(unsigned char x,unsigned char y,char *p)
{
        while(*p!=0)
        {
                PutChar(x,y,*p);
                x += X_Witch;
                if((x + X_Witch) > Dis_X_MAX)
                {
                        x = 0;
                        if((Dis_Y_MAX - y) < Y_Witch) break;
                        else y += Y_Witch;
                }
                p++;
        }
}

//========================================================================
// 函数: void Rectangle(unsigned char left, unsigned char top, unsigned char right,
//                                               unsigned char bottom, unsigned char Mode)
// 描述: 以x,y为圆心R为半径画一个圆(mode = 0) or 圆面(mode = 1)
// 参数: left - 矩形的左上角横坐标,范围0到126
//               top - 矩形的左上角纵坐标(0~7页),范围0到6
//               right - 矩形的右下角横坐标,范围1到127
//               bottom - 矩形的右下角纵坐标(0~7页),范围0到7
// 返回: 无
// 备注: 画圆函数执行较慢,如果MCU有看门狗,请作好清狗的操作
// 版本:
//      2005/05/21      First version
//                2007/05/17                V2.1for seriea port LCD
//========================================================================
void Rectangle(unsigned char left, unsigned char top, unsigned char right, unsigned char bottom)
{
        unsigned char uiTemp,ucTemp2;
        if(left>right)
        {
                uiTemp = left;
                left = right;
                right = uiTemp;
        }
        if(top>bottom)
        {
                uiTemp = top;
                top = bottom;
                bottom = uiTemp;
        }
        for(uiTemp=top;uiTemp<=bottom;uiTemp++)
        {
                Comwrite(uiTemp+0xb0);
                Comwrite(((left&0xf0) >> 4)|0x10);        //设置初始地址
                Comwrite(left&0x0f);
                for(ucTemp2=left;ucTemp2<=right;ucTemp2++)
                {
                        Datawrite(BMP_Color);
                }
        }
}
//========================================================================
// 函数: void ClrScreen(unsigned int Mode)
// 描述: 清屏函数,执行全屏幕清除或填充前景色
// 参数: Mode   0:全屏除屏
//                                1:全屏填充前景色
// 返回: 无
// 备注:
// 版本:
//      2007/01/11      First version
//========================================================================
void ClrScreen(unsigned char Mode)
{
        if(Mode==0)
                LCD_Fill(LCD_INITIAL_COLOR);
        else
                LCD_Fill(BMP_Color);
}


//===========================
//函数名:Delay()
//作用:延时程序
//===========================
void Delay(unsigned int time)
{
        int i;
        while(time > 0)
        {
                for(i = 0;i <10;i++)
                {
                }
                time --;
        }
}

//========================================================================
// 函数: void LCD_RegWrite(unsigned char Command)
// 描述: 写一个字节的数据至LCD中的控制寄存器当中
// 参数: Command                写入的数据,低八位有效(byte)
// 返回: 无
// 备注:
// 版本:
//      2007/01/09      First version
//=======================================================================
void Comwrite(unsigned char com)

{
/*    unsigned char i,j;
          LCD_CS=0;
          LCD_A0=0;
      LCD_SCL=0;
        for(i=0;i<8;i++)
          {
               j=com;
               LCD_SCL=0;
               LCD_SI=com&0x80;
   LCD_SCL=1;             
               com=j<<1;
                }
          LCD_CS=1;
                LCD_A0=1;*/
unsigned char Num;
        LCD_CS = 0;
        LCD_A0 = 0;
        for(Num=0;Num<8;Num++)
        {
                if((com&0x80) == 0)       
                LCD_SI = 0;
                else LCD_SI = 1;
                com = com << 1;
                LCD_SCL = 0;
                LCD_SCL = 1;
        }
        LCD_CS = 1;
}

//###########################################################//
//========================================================================
// 函数: void LCD_DataWrite(unsigned int Data)
// 描述: 写一个字节的显示数据至LCD中的显示缓冲RAM当中
// 参数: Data 写入的数据
// 返回: 无
// 备注: 无
// 版本:
//      2007/01/09      First version
//========================================================================
void Datawrite(unsigned char data)

{
/*    unsigned chari,j;
          LCD_CS=0;
          LCD_A0=1;
      LCD_SCL=0;
        for(i=0;i<8;i++)
          {
               j=data;
               LCD_SCL=0;
               LCD_SI=data&0x80;
   LCD_SCL=1;             
               data=j<<1;
                }
           LCD_CS=1;
               LCD_A0=0;*/
        unsigned char Num1;
        LCD_CS = 0;
        LCD_A0 = 1;
        for(Num1=0;Num1<8;Num1++)
        {
                if((data&0x80) == 0)       
                        LCD_SI = 0;
                else
                        LCD_SI = 1;
                data = data << 1;
                LCD_SCL = 0;
                LCD_SCL = 1;
        }
        LCD_CS = 1;
}

//========================================================================
// 函数: void LCD_Fill(unsigned int Data)
// 描述: 会屏填充以Data的数据至各点中
// 参数: Data   要填充的颜色数据
// 返回: 无
// 备注: 仅在LCD初始化程序当中调用
// 版本:
//      2006/10/15      First version
//                2007/01/09                V1.2
//========================================================================
void LCD_Fill(unsigned char a)
{
        unsigned char i,j;
        unsigned char uiTemp;
        uiTemp = Dis_Y_MAX;
        uiTemp = uiTemp>>3;
        for(i=0;i<=uiTemp;i++)                                                                //往LCD中填充初始化的显示数据
        {
                Comwrite(0xb0+i);
                Comwrite(0x01);
                Comwrite(0x10);
                for(j=0;j<=Dis_X_MAX;j++)
                {
                        Datawrite(a);
                }
                                 
        }

}

//===========================
//函数名:Init_LCD
//作用:
//===========================
void Init_LCD()
{
Init_PortB();      
Init_PortF();
// Comwrite(0xe2);   //软件复位
//        Comwrite(0xA2);                //LCD偏压设置 1/9

//        Comwrite(0xA0);                //ADC驱动输出反向
//        Comwrite(0xc8);                //Com扫描方式反向
       
//        Comwrite(0x2c);                //内部电源管理
//        Comwrite(0x2e);                //三条指令间隔时间2Um
//        Comwrite(0x2F);                //
//Comwrite(0x24);
        //Comwrite(0xf8);
        //Comwrite(0x00);
        //Comwrite(0x81);                //电量设置模式
//        Comwrite(0x1f);                //调整对比度
       
//        Comwrite(0x24);                //电压调整寄存器高位
//        Comwrite(0x40);   //起始行
//        Comwrite(0xe0);   //写入数据自动加1
//        Comwrite(0xAF);                //显示开
//        Comwrite(0xa5);
        Delay(200);
        LCD_RS = 0;
        Delay(200);
        LCD_RS = 1;
        Delay(20);
        Comwrite(M_LCD_ON);                                                        //LCD On
        Comwrite(M_LCD_POWER_ALL);                                        //设置上电控制模式
       
        Comwrite(M_LCD_ELE_VOL);                                        //电量设置模式(显示亮度)
        Comwrite(0x1f);                                                                //指令数据0x0000~0x003f
       
        Comwrite(M_LCD_VDD_SET);                                        //V5内部电压调节电阻设置
        Comwrite(M_LCD_VDD);                                                //LCD偏压设置,V3时选
       
        Comwrite(M_LCD_COM_REV);                                        //Com 扫描方式设置
        Comwrite(M_LCD_SEG_NOR);                                        //Segment方向选择
        Comwrite(M_LCD_ALL_LOW);                                        //全屏点亮/变暗指令
        Comwrite(M_LCD_ALL_NOR);                                        //正向反向显示控制指令
       
        Comwrite(M_LCD_STATIC_OFF);                                        //关闭静态指示器
        Comwrite(0x00);                                                                //指令数据
       
        Comwrite(M_LCD_BEGIN_LINE);                                //设置显示起始行对应RAM

//        LCD_Fill(LCD_INITIAL_COLOR);       
}
//===================================================
//
//=================================================
/*void dispkuang()
{
unsigned char i,j,Page=0xb0;
Comwrite(0x40);

        Comwrite(Page);
        Comwrite(0x10);
        Comwrite(0x00);       
   Datawrite(0xff);
        for(j=0;j<126;j++)
           {
             Datawrite(0x01);
           }
       Datawrite(0xff);
for(i=0;i<6;i++)
        {
       Page++;
       Comwrite(Page);
       Comwrite(0x10);
       Comwrite(0x00);       
   Datawrite(0xff);
       for(j=0;j<126;j++)
           {
             Datawrite(0x00);
           }
         Datawrite(0xff);
   }
      
    Page++;      
        Comwrite(Page);
        Comwrite(0x10);
        Comwrite(0x00);       
    Datawrite(0xff);
        for(j=0;j<126;j++)
           {
             Datawrite(0x80);
           }
       Datawrite(0xff);
            
}

//############################################################//
void display(unsigned char disp,unsigned char disp1)
{
        unsigned char i,j,Page=0xb0;
Comwrite(0x40);
for(i=0;i<8;i++)
        {
//        Page=++Page;
        Comwrite(Page);
        Comwrite(0x10);
        Comwrite(0x00);       
        for(j=0;j<65;j++)
           {Datawrite(disp);
          Datawrite(disp1);
           }
        }
}
//#########################################################//

void hanzi_disp()
{
unsigned chari,j;
unsigned char Page=0xaf;
Comwrite(0x40);
for(i=0;i<8;i++)
        {
          Page=++Page;
          Comwrite(Page);
          Comwrite(0x10);
          Comwrite(0x00);
    for(j=0;j<128;j++)       
          {
          Datawrite(hanzi);
          }       
        }
}*/

//------------------------------------------------------------
//主函数包括初始化开中断
//------------------------------------------------------------
//=============================
void main(void)
{
//DisableInterrupts;   //禁止中断
        Init_FBE();          //初始化晶振
//        Init_PortF();      //初始化LED
//Init_TPM();          //初始化定时器
//Init_KBI();          //初始化按键
//Init_SCI1();         //初始化SCI
//Init_LCD();          //初始化LCD
//EnableInterrupts; /* 使能中断*/

/* include your code here */

        Init_LCD();          //初始化LCD
        Init_mclk();
       
        SOPT=0x00;
             
      FontSet(0,0xff);                                   //选择自定义的汉字字符
               
            PutChar(0,6,0);                                        //显示“铭”
            PutChar(16,6,1);                                //显示“正”
            PutChar(32,6,2);                                //显示“同”
            PutChar(48,6,3);                                //显示“创”
           
            PutChar(24,4,4);                                //显示LOGO,实际上将它取成了一个汉字一样的字模了
            Rectangle(40,1,126,1);                        //在第1页上,从X轴的40到126之间填充前景
            PTFD_PTFD0=0;
   
   

        for(;;)
        {
//          dispkuang();
      

       }
       
/* please make sure that you never leave main */
}

/**************************************************************/
/*                                                正转(FOR)启动按键                                          */
/**************************************************************/
void KeyBoard1(void)
{
PTFD_PTFD0=0;
}

/**************************************************************/
/*                                                反转(REV)启动按键                                          */
/**************************************************************/
void KeyBoard2(void)
{
PTFD_PTFD1=0;
}

/**************************************************************/
/*                                                停机(STOP)按键                                                  */
/**************************************************************/
void KeyBoard3(void)
{               
PTFD_PTFD2=0;
}

/**************************************************************/
/*                                                        菜单(PRG)按键                                          */
/**************************************************************/
void KeyBoard4(void)
{
PTFD_PTFD3=0;
}

/**************************************************************/
/*                                                        设置(SET)按键                                          */
/**************************************************************/
void KeyBoard5(void)                       
{
PTFD_PTFD4=0;
}

/**************************************************************/
/*                                                        取消(ESC)按键                                          */
/**************************************************************/
void KeyBoard6(void)                       
{       
PTFD_PTFD5=0;
}

/**************************************************************/
/*                                                        增加(ADD)按键                                          */
/**************************************************************/
void KeyBoard7(void)
{
        PTFD_PTFD6=0;
}

/**************************************************************/
/*                                                减小(SUB)按键                                                  */
/**************************************************************/
void KeyBoard8(void)
{

}

//====================================================
//SCI1发送中断服务程序
//====================================================
interrupt VectorNumber_Vsci1tx void SCI1_TX_ISR(void)
{
if((cTransNum)<strlen(cTransBuf))                        ////////发送数据
                {
                        SBUF=cTransBuf;                        //发送数据
                        cTransSum+=cTransBuf;        //求发送数据效验和
                        cTransNum++;                                                //已发送的数据个数
                }
                else if((cTransNum)==strlen(cTransBuf))                ////////发送效验和
                {
                        SBUF=cTransSum;                                                //发送效验和
                        cTransNum++;                                                //已发送的数据个数
                }
                else if((cTransNum>strlen(cTransBuf)))                ////////发送结束码
                {
                        SBUF='e';                                                        //发送结束码
                        cTransNum=0;                                                //清计数位
                        cTransSum=0;                                                //清发送数据效验和
                        cTransBuf='\0';                                        //设定发送数据长度为零
                }

}
//====================================================
//SCI1接收中断服务程序
//====================================================
interrupt VectorNumber_Vsci1rx void SCI1_RX_ISR(void)
{
    void Receive(void);
    cReceiveTemp=SBUF;                                                        //接收当前的字符
                if(cReceiveTemp=='e')                ////////接收到结束码后的处理
                {
                        if(cReceiveBuf==cReceiveSum)                //////效验和正确
                        {
                                cReceiveBuf='\0';        //上次接收到的字符为接收数组结束标志
                                   Receive();                                                        //接收数据处理               
                        }
                        cReceiveNum=0;                                                        //清发送已接收的数据计数
                        cReceiveSum=0;                                                        //清接收效验和
                        cReceiveBuf='\0';                                        //设定接收数据长度为零
                        cReceiveTemp=0;                                                        //清接收暂存
                        cReceiveTemp1=0;                                                //清上次接收暂存
                }
                else                                                ////////接收数据
                {
                        cReceiveBuf=cReceiveTemp;        //把本次接收的数据放到数组中
                        cReceiveSum+=cReceiveTemp1;                                //求效验和
                        cReceiveTemp1=cReceiveTemp;                                //把本次接收的数据放到暂存,用作下次的效验和
                        cReceiveNum++;                                                        //接收数据计数加1
                }
}

//==================计数器溢出中断服务程序==========================
interrupt VectorNumber_Vtpm1ovf void TPM1_OVF_ISR(void)
{
                //****************************************键盘扫描控制
                        cScanKey=0;                                        //清除记录键位的编码
                        if(bScanEmpty==0)        //////上次键盘扫描不为空
                                cScanNum++;                                //扫描次数加1
                        else                                //////上次键盘扫描为空
                                cScanNum=0;                                //清除扫描计数,从新开始计数
                        if(PTAD==0xFF)                //////本次键盘扫描为空
                        {
                                bScanEmpty=1;                        //设定本次扫描为空标志位
                                cScanNum=0;                                //清除扫描计数值,从新开始计数
                        }
                        else                                //////本次键盘扫描不为空
                        {
                                bScanEmpty=0;                        //设定本次扫描不为空标志位
                                iStakeout=0;                        //清监视计数值
                        }
                if(cScanNum>150)                        //连续200次(200*2ms=100ms)扫描键盘不为空确认有键盘按下,否则认为是干扰信号
                {
                                cScanNum=0;                        //清键盘扫描计数
                        //没有此句只有第一次检测延时,以后仍然2ms扫描键盘
                                if(PTAD_PTAD0==0)                                //正转键盘按下
                                        cScanKey+=1;
                                else if(PTAD_PTAD1==0)                //反转键盘按下
                                        cScanKey+=2;
                                else if(PTAD_PTAD2==0)                //停止/复位键盘按下
                                        cScanKey+=4;
                                else if(PTAD_PTAD3==0)                //取消键盘按下
                                        cScanKey+=8;
                                else if(PTAD_PTAD4==0)                //减小键盘按下
                                        cScanKey+=16;
                                else if(PTAD_PTAD5==0)                //增加键盘按下
                                        cScanKey+=32;
                                else if(PTAD_PTAD6==0)                //设定键盘按下
                                        cScanKey+=64;
                                else if(PTAD_PTAD7==0)                //菜单键盘按下
                                        cScanKey+=128;
                        switch(cScanKey)        //////判断哪个键按下,并作相应的处理
                        {
                                case 1:                                //正转键盘按下
                                        KeyBoard1();
                                        break;
                                case 2:                                //反转键盘按下
                                        KeyBoard2();
                                        break;
                                case 4:                                //停止/复位键盘按下
                                        KeyBoard3();
                                        break;
                                case 8:                                //菜单键盘按下
                                        KeyBoard4();
                                        break;
                                case 16:                        //设定按键按下存储数据
                                        KeyBoard5();
                                        break;
                                case 32:                        //取消键盘按下
                                        KeyBoard6();
                                        break;
                                case 64:                        //增加键盘按下
                                        KeyBoard7();
                                        break;
                                case 128:                        //减小键盘按下
                                        KeyBoard8();
                                        break;
                                default:                        //同时按下多个键时,视为无效
                                        break;
                        }
                }
}
/**************************************************************/
/*                                        定时发送处理子程序                                                  */
/**************************************************************/
void Transmit(void)
{
        if(strlen(cTransBuf)>0)                                          //发送缓冲区有数据
        {
                SBUF=cTransBuf;                        //发送第一个字节
                cTransSum+=cTransBuf;        //求发送数据效验和
                cTransNum++;                                                //发送数据计数加1
        }
        return;
}
/**************************************************************/
/*                                                接收数据处理子程序                                          */
/**************************************************************/
void Receive(void)
{
        if(cReceiveBuf=='T')                ////////接收定时发送的当前监视值
        {

        }
        return;                                                                               

}

kms2hh 发表于 2008-7-20 13:03:20

LCD12864控制芯片应该是ST7920才对吧?
页: [1]
查看完整版本: LCD12864控制芯片是ST7565串口通讯不能正常显示不知道怎么回事