WDTCTL =WDTPW+WDTHOLD; //关看门狗
BCSCTL1 =CALBC1_1MHZ; //设定DCO为1MHZ
DCOCTL =CALBC1_1MHZ;
volatile unsigned int n;
do //等待晶振稳定
{
IFG1 &=~OFIFG;
for(n=5000;n>0;n--);
} while(OFIFG&IFG1);
(一)FLASH子程序
//***************FLASH子程序***************************
void write_seg(unsigned int fldress,unsigned int write) //段写子程序 fldress写入地址 起始地址最好不要是0x80000 write传送数据量 write<=1018 //write 传送数据个数<=1018
{
char write_value[]={
数据 //数据 个数〈=1018
};
char * write_addr=(char *)fldress; //指向段首地址
FCTL3=FWKEY; //复位LOCK
FCTL1=FWKEY+WRT; //写使能
for(i=0;i<write;i++)
{
(*write_addr++)=write_value[i]; //循环写入
}
FCTL3=FWKEY+LOCK; //置位LOCK
}
//****************************************************
(二)按键中断子程序
//*****************按键中断子程序*********************
unsigned char nP20,nP21,nP22,nP23,nP24,nP25,nP26,nP27;
unsigned char nP28,nP29,nP210,nP211,nP212,nP213,nP214,nP215;
int nRes=0;
//*******************************************************
//*******************************************************
void Init_Port(void);
void delay(void);
int Keyprocess(void);
//*******************************************************
//*******************************************************
void Init_Port(void)
{
//将P2端口所有管脚大初始化的的时候设置为输入方式
P2DIR=0;
//将P2端口所有管脚设置为一般I/O端口
P2SEL=0;
//将P2.4、P2.5、P2.6、P2.7设置为输出方向
P2DIR |=0xf0;
//先输出低电平
P2OUT=0X00;
//打开管脚的中断功能
//对应的管脚由高到低电平跳变到使相应的标志置位
P2IE =0X0F;
P2IES =0X0F;
//将中断寄存器清零
P2IFG=0;
_EINT();//打开中断
return;
}
//*******************************************************
//*******************************************************
void delay(void) //防抖动延时
{
int z;
for(z = 100;z>0;z--);
}
//*******************************************************
//处理来处自端口2的中断
//*******************************************************
#pragma vector = PORT2_VECTOR
__interrupt void PORT_ISR(void)
{
delay();
Keyprocess();
P2IFG=0;
}
//*******************************************************
//*******************************************************
// 键盘分析
int Keyprocess(void)
{P2OUT = 0XFF;
P2OUT&=~(BIT4);//p1.4输出低电平
nP212 = P2IN&BIT0;
if(nP212==0) nRes=13;
nP213=(P2IN&BIT1)>>1;
if(nP213==0) nRes=14;
nP214=(P2IN&BIT2)>>2;
if(nP214==0) nRes=15;
nP215=(P2IN&BIT3)>>3;
if(nP215==0) nRes=0;
P2OUT = 0XFF;
P2OUT&=~(BIT5);//p1.5输出低电平
nP28=P2IN&BIT0;
if(nP28==0) nRes=9;
nP29=(P2IN&BIT1)>>1;
if(nP29==0) nRes=10;
nP210=(P2IN&BIT2)>>2;
if(nP210==0) nRes=11;
nP211=(P2IN&BIT3)>>3;
if(nP211==0) nRes=12;
P2OUT = 0XFF;
P2OUT&=~(BIT6);//p1.6输出低电平
nP24=P2IN&BIT0;
if(nP24==0) nRes=5;
nP25=(P2IN&BIT1)>>1;
if(nP25==0) nRes=6;
nP26=(P2IN&BIT2)>>2;
if(nP26==0) nRes=7;
nP27=(P2IN&BIT3)>>3;
if(nP27==0) nRes=8;
P2OUT = 0XFF;
P2OUT&=~(BIT7);//p1.7输出低电平
nP20=P2IN&BIT0;
if(nP20==0) nRes=1;
nP21=(P2IN&BIT1)>>1;
if(nP21==0) nRes=2;
nP22=(P2IN&BIT2)>>2;
if(nP22==0) nRes=3;
nP23=(P2IN&BIT3)>>3;
if(nP23==0) nRes=4;
P2OUT=0X00;//恢复以前值
return nRes;
}
//*******************************************************
(三)液晶子程序
//***************液晶字库初始化**************************
void initinal(void)
{
delay(4); //大于40MS的延时程序
P4OUT|=BIT4; //设置为8BIT并口工作模式_P3.3
delay(1); //延时
P4OUT&=~BIT6;
delay(1); //延时
P4OUT|=BIT6;
delay(1); //延时
TransferData(0x30,0); //Extended Function Set :8BIT设置,RE=0: basic instruction set, G=0 :graphic display OFF
delay(10); //大于100uS的延时程序
TransferData(0x30,0); //Function Set
delay(5); ////大于37uS的延时程序
TransferData(0x08,0); //Display on Control
delay(10); //大于100uS的延时程序
TransferData(0x10,0); //Cursor Display Control光标设置
delay(10); //大于100uS的延时程序
TransferData(0x0C,0); //Display Control,D=1,显示开
delay(10); //大于100uS的延时程序
TransferData(0x01,0); //Display Clear
delay(1); //大于10uS的延时程序
TransferData(0x06,0); //Enry Mode Set,光标从右向左加1位移动
delay(10); //大于100uS的延时程序
}
//*******************************************************
//***************液晶图形初始化**************************
void initina2(void) //LCD显示图片(扩展)初始化程序
{
delay(4); //大于40MS的延时程序
P4OUT|=BIT4; //设置为8BIT并口工作模式_P3.3
delay(1); //延时
P4OUT&=~BIT6;
delay(1); //延时
P4OUT|=BIT6;
delay(1);
TransferData(0x36,0); //Extended Function Set RE=1: extended instruction
delay(10); //大于100uS的延时程序
TransferData(0x36,0); //Extended Function Set:RE=1: extended instruction set
delay(4); ////大于37uS的延时程序
TransferData(0x3E,0); //EXFUNCTION(DL=8BITS,RE=1,G=1)
delay(10); //大于100uS的延时程序
TransferData(0x01,0); //CLEAR SCREEN
delay(10); //大于100uS的延时程序
}
//********************************************************
//***************液晶初始化定时***************************
void delay(unsigned int m) //延时程序
{
unsigned int i,j;
for(i=0;i<m;i++)
for(j=0;j<10;j++);
}
//********************************************************
//*******************字符显示*****************************
//(一)****************************************************
void lcd_mesg(unsigned char *adder) //*adder 数据数组名
{
unsigned char i;
TransferData(0x80,0); //Set Graphic Display RAM Address
delay(10);
for(i=0;i<32;i++)
{
TransferData(*adder,1);
adder++;
}
TransferData(0x90,0); //Set Graphic Display RAM Address
delay(10);
for(i=32;i<64;i++)
{
TransferData(*adder,1);
adder++;
}
}
//(二)***************************************************
void lcd_mesg(unsigned int adder) //adder 数据存放地址
{ char * adder1=(char *)adder;
unsigned char i;
TransferData(0x80,0); //Set Graphic Display RAM Address
delay(10);
for(i=0;i<32;i++)
{
TransferData(*adder1++,1);
}
TransferData(0x90,0); //Set Graphic Display RAM Address
delay(10);
for(i=32;i<64;i++)
{
TransferData(*adder1++,1);
}
}
//********************************************************
//*******************数据修改****************************
void lcd_mesg2(unsigned char adder1,unsigned char data1,unsigned char data2) //adder1 所修改数据地址 data1,data2数据码
{ TransferData(adder1,0); //Set Graphic Display RAM Address
TransferData(data1,1);
TransferData(data2,1);
}
//*******************************************************
//*******************图形显示***************