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;
} LCD12864控制芯片应该是ST7920才对吧?
页:
[1]