⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 新建 文本文档 (3).txt

📁 很實用的12864LCD驅動函數 KEilC51開發
💻 TXT
字号:
#include <STC12C5410AD.H>
#include <intrins.h>
#define off 0
#define on 1
#define ISP_IAP_BYTE_READ      1
#define ISP_IAP_BYTE_PROGRAM   2
#define ISP_IAP_SECTOR_ERASE   3
#define WAIT_TIME              4
/**********************************/
sbit   PSB=P3^3;
sbit SID=P3^5;
sbit SCLK=P3^4;
sbit RES=P3^7;   //电路板上有电流(发电机)
/*sbit   CS=P3^5;
sbit SID=P3^4;
sbit SCLK=P3^3;
sbit RES=P3^2;*/ //实验板
/**********************************/
unsigned char sec;
unsigned char min;
unsigned char hour;
unsigned char hour2;
unsigned char hour3;
unsigned char counter;
unsigned int adinterim17;
unsigned int adinterim16;
unsigned int power;
bit eeprom_enable=0;
bit displaybit=0;
/********************************************************/
void DelayM(unsigned int a)
{
unsigned char i;
while(--a!=0)
   {
   for(i=0;i<250;i++)
   WDT_CONTR=0x3c;
   }
}
/****************************************************************************/
void lcm_w_word(unsigned char *str) ;
void lcm_w_test(bit start,unsigned char ddata);
void lcm_w_byte(unsigned char bbyte);
void delaynms(unsigned int di);
void lcm_init(void);
void lcm_clr(void);
void ad16(void);
void ad17(void);
//void delay(unsigned char);
/****************************************************************************/
void delay(unsigned char i)
{
unsigned char a,b;
   while(i--)
   {
   for(a=0;a<10;a++)
      for(b=0;b<10;b++);
   }
}
/***************************************************************************/
void ad17(void)
{ ADC_CONTR&=0xe7;
delay(5); 
ADC_DATA=0x00;
ADC_CONTR=ADC_CONTR|0x08;
delay(10);
if(ADC_CONTR|0x10)
   {
   ADC_CONTR=ADC_CONTR|0xE7;
    adinterim17=ADC_DATA;
   adinterim17=adinterim17*436/256;
   }
} 
/*************************************************************************/
void ad16(void)
{ ADC_CONTR&=0xe6;
delay(5);
ADC_DATA=0x00;
ADC_CONTR=ADC_CONTR|0x08;
delay(10);
   if(ADC_CONTR|0x10)
   {
   ADC_CONTR=ADC_CONTR|0xE7;
    adinterim16=ADC_DATA;
   adinterim16=adinterim16*195/100;
   }
}
/****************************************************************************/
void lcm_init(void) {
delaynms(100);
lcm_w_test(0,0x30); //8 位介面,30:基本指令集34:扩展
lcm_w_test(0,0x0c); //显示打开,光标关,反白关
lcm_w_test(0,0x01); //清屏,将DDRAM的地址计数器归零 
delaynms(400); //启动等待,等LCM讲入工作状态

}
/******************************************************************************/
//写指令或数据 (0,指令) (1,数据)
void lcm_w_test(bit start, unsigned char ddata) {
unsigned char start_data,Hdata,Ldata;
if(start==0) 
   start_data=0xf8; //0:写指令
    else    
    start_data=0xfa; //1:写数据

Hdata=ddata&0xf0;    //取高四位
Ldata=(ddata<<4)&0xf0; //取低四位
lcm_w_byte(start_data);   //发送起始信号
delaynms(10); //延时是必须的
lcm_w_byte(Hdata);       //发送高四位
delaynms(10); //延时是必须的
lcm_w_byte(Ldata);    //发送低四位
delaynms(10); //延时是必须的
}

/******************************************************************************/
//发送一个字节(底层函数)
void lcm_w_byte(unsigned char bbyte) {
unsigned char i;
   for(i=0;i<8;i++){
      SID=bbyte&0x80; //取出最高位
    SCLK=1;
      SCLK=0;
      bbyte<<=1; //左移
   } 
}

/******************************************************************************/
//延时(LCM占用)
void delaynms(unsigned int di) {
unsigned int da,db;
   for(da=0;da<di;da++);
      for(db=0;db<10;db++);
}

/*****************************************************************************/
//清屏函数
void lcm_clr(void){
lcm_w_test(0,0x01);
delaynms(80); //启动等待,等LCM讲入工作状态

}

/*****************************************************************************/
//向LCM发送一个字符串,长度64字符之内。
//应用:lcm_w_word("您好!"); 
void lcm_w_word(unsigned char *str){
   while(*str != '\0'){
    lcm_w_test(1,*str++);
        }
   *str = 0;
}
/*************************************************************/
void tt0(void)interrupt 1
{
TH0=0x4c;
TL0=0x00;
counter++;
if(counter==20)
   {
   displaybit=1;
   counter=0;
   sec++;
   }
if(sec==60)
   {
   sec=0;
   min++;
   }
if(min==60)
   {
   min=0;
   hour++;
   }
if(hour==100)
   {
   hour=0;
   hour2++;
   }
if(hour2==100)
   {
   hour2=0;
   hour3++;
   }
if(hour3==100)
   hour3=0;
}
/***********************************************
功能:eeprom_read
描述:EEPROM读
参数:无
返回:读出的数
***********************************************/
unsigned char eeprom_read(unsigned char BYTE_ADDR_HIGH,unsigned char BYTE_ADDR_LOW)
{unsigned char eeprom_data;
if(eeprom_enable)
    {ISP_ADDRH=BYTE_ADDR_HIGH;
ISP_ADDRL=BYTE_ADDR_LOW;
ISP_CONTR=WAIT_TIME;
ISP_CONTR=ISP_CONTR|0x80;
ISP_CMD=ISP_IAP_BYTE_READ;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();
eeprom_data=ISP_DATA;
ISP_CONTR=0x00;
ISP_CMD=0x00;
ISP_TRIG=0x00;
ISP_ADDRH=0;
ISP_ADDRL=0;
return(eeprom_data);
}
   eeprom_enable=0;
}

/***********************************************
功能:eeprom_program
描述:EEPROM编程
参数:编程数据
返回:无
***********************************************/
void eeprom_program(unsigned char program_data,unsigned char BYTE_ADDR_HIGH,unsigned char BYTE_ADDR_LOW)
{if(eeprom_enable)
    {ISP_DATA=program_data;
ISP_ADDRH=BYTE_ADDR_HIGH;
ISP_ADDRL=BYTE_ADDR_LOW;
ISP_CONTR=WAIT_TIME;
ISP_CONTR=ISP_CONTR|0x80;
ISP_CMD=ISP_IAP_BYTE_PROGRAM;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();
ISP_CONTR=0x00;
ISP_CMD=0x00;
ISP_TRIG=0x00;
ISP_ADDRH=0;
ISP_ADDRL=0;
}
   eeprom_enable=0;
}
/***********************************************
功能:eeprom_erase
描述:EEPROM扇区擦除
参数:无
返回:无
***********************************************/
void eeprom_erase(unsigned char SECTOR_FIRST_BYTE_ADDR_HIGH,unsigned char SECTOR_FIRST_BYTE_ADDR_LOW)
{if(eeprom_enable)
    {ISP_ADDRH=SECTOR_FIRST_BYTE_ADDR_HIGH;
ISP_ADDRL=SECTOR_FIRST_BYTE_ADDR_LOW;
ISP_CONTR=WAIT_TIME;
ISP_CONTR=ISP_CONTR|0x80;
ISP_CMD=ISP_IAP_SECTOR_ERASE;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();
ISP_CONTR=0x00;
ISP_CMD=0x00;
ISP_TRIG=0x00;
ISP_ADDRH=0;
ISP_ADDRL=0;
}
eeprom_enable=0;
}
/*****************************************************/
void timer(void)
{
unsigned char i,j,k;
power=adinterim16*adinterim17;
power=power/10;
i=power/10;
j=power/100;
k=power/1000;
lcm_w_test(0,0x80);
lcm_w_word("[XGDQ]Gas:");//
lcm_w_test(1,0x5b);
lcm_w_test(1,0x1e);
lcm_w_test(1,0x1e);
lcm_w_test(1,0x1e);
lcm_w_test(1,0x1e);
lcm_w_test(1,0x5d);

lcm_w_test(0,0x90);
lcm_w_word("U:");
lcm_w_test(1,(adinterim17/100)+0x30);
lcm_w_test(1,(adinterim17/10)%10+0x30);
lcm_w_test(1,(adinterim17%10)+0x30);
lcm_w_word("V");
lcm_w_word("   ");
lcm_w_word("I:");
lcm_w_test(1,(adinterim16/100)+0x30);
lcm_w_test(1,(adinterim16/10)%10+0x30);
lcm_w_word(".");
lcm_w_test(1,(adinterim16%10)+0x30);
lcm_w_word("A");

lcm_w_test(0,0x88);
lcm_w_word("P:");
lcm_w_test(1,k+0x30);
lcm_w_test(1,(j%10)+0x30);
lcm_w_test(1,(i%10)+0x30);
lcm_w_test(1,(power%10)+0x30);
lcm_w_word("W ");
lcm_w_word("Oil:on");

lcm_w_test(0,0x98);
lcm_w_word("Time:");
lcm_w_test(1,(hour3%10)+0x30);
lcm_w_test(1,(hour2/10)+0x30);
lcm_w_test(1,(hour2%10)+0x30);
lcm_w_test(1,(hour/10)+0x30);
lcm_w_test(1,(hour%10)+0x30);
lcm_w_word("H");
lcm_w_test(1,0x22);
lcm_w_test(1,(min/10)+0x30);
lcm_w_test(1,(min%10)+0x30);
lcm_w_word("M"); 
lcm_w_test(1,0x22);
//lcm_w_test(0,0x34); //8 位介面,30:基本指令集34:扩展
//lcm_w_test(0,0x04); //8 位介面,30:基本指令集34:扩展
}
/************************************************************/
void int0(void)interrupt 0
{
unsigned char secread,minread;
unsigned char hourg,hourz,hour2g,hour2z,hour3g,hour3z;
unsigned char hourgread,hourzread,hour2gread,hour2zread,hour3gread,hour3zread;
unsigned char hourdb,hour2db,hour3db;
ADC_CONTR=0x00;
EA=0;
hourg=hour%10;
hourz=hour/10;
hour2g=hour2%10;
hour2z=hour2/10;
hour3g=hour3%10;
hour3z=hour3/10;

eeprom_enable=1;
eeprom_erase(18,00);

eeprom_enable=1;
eeprom_program(sec,18,0);

eeprom_enable=1;
eeprom_program(min,18,1);

eeprom_enable=1;
eeprom_program(hourz,18,2);

eeprom_enable=1;
eeprom_program(hourg,18,3);

eeprom_enable=1;
eeprom_program(hour2z,18,4);

eeprom_enable=1;
eeprom_program(hour2g,18,5);

eeprom_enable=1;
eeprom_program(hour3z,18,6);

eeprom_enable=1;
eeprom_program(hour3g,18,7);

eeprom_enable=1;
eeprom_program(88,18,10);
delay(10);
/************************************/
eeprom_enable=1;
secread=eeprom_read(18,0);

eeprom_enable=1;
minread=eeprom_read(18,1);

eeprom_enable=1;
hourzread=eeprom_read(18,2);

eeprom_enable=1;
hourgread=eeprom_read(18,3);
hourdb=hourzread*10+hourgread;

eeprom_enable=1;
hour2zread=eeprom_read(18,4);

eeprom_enable=1;
hour2gread=eeprom_read(18,5);
hour2db=hour2zread*10+hour2gread;

eeprom_enable=1;
hour3zread=eeprom_read(18,6);

eeprom_enable=1;
hour3gread=eeprom_read(18,7);
hour3db=hour3zread*10+hour3gread;

eeprom_enable=0;
if((sec==secread)&&(min==minread)&&(hour==hourdb)&&(hour2==hour2db)&&(hour3==hour3db))
while(1);
}
/**************************************************************/
void main(void)
{
unsigned char hourgread,hourzread,hour2gread,hour2zread,hour3gread,hour3zread;
unsigned char i,x;
WDT_CONTR=0x3c;
TMOD=0x01;
TH0=0x4c;
TL0=0x00;
PSB=0;
RES=1;
P1=0xff;
P3=0xff;
P1M0=0xc0;
P1M1=0xc0;
DelayM(100);
ADC_CONTR&=0x80;
ADC_DATA=0x00;
DelayM(200);
lcm_init();
lcm_clr();
DelayM(1000);
lcm_w_test(0,0x90);
lcm_w_word("Initializing.");
lcm_w_test(0,0x9a);
lcm_w_word(" Please wait");
DelayM(1000);
lcm_w_test(0,0x90);
lcm_w_word("Initializing..");
DelayM(1000);
lcm_w_test(0,0x90);
lcm_w_word("Initializing...");
DelayM(1000);
lcm_w_test(0,0x9a);
lcm_w_word("     Success");
DelayM(1000);

eeprom_enable=1;
x=eeprom_read(18,10);
if(x!=88)
   {
   eeprom_enable=1;
   eeprom_erase(18,00);
   for(i=0;i<8;i++)
    {
    eeprom_enable=1;
    eeprom_program(0,18,i);
    }
   eeprom_enable=1;
   eeprom_program(88,18,10);
   eeprom_enable=0;
   }
   else
   {
   eeprom_enable=1;
   sec=eeprom_read(18,0);

   eeprom_enable=1;
   min=eeprom_read(18,1);

   eeprom_enable=1;
   hourzread=eeprom_read(18,2);

   eeprom_enable=1;
   hourgread=eeprom_read(18,3);
   hour=hourzread*10+hourgread;

   eeprom_enable=1;
   hour2zread=eeprom_read(18,4);

   eeprom_enable=1;
   hour2gread=eeprom_read(18,5);
   hour2=hour2zread*10+hour2gread;

   eeprom_enable=1;
   hour3zread=eeprom_read(18,6);

   eeprom_enable=1;
   hour3gread=eeprom_read(18,7);
   hour3=hour3zread*10+hour3gread;
   }
   lcm_clr();
   ET0=1;
   TR0=1;
   EX0=1;
   EA=1;
   while(1)
    {
    ad16();
    if(displaybit)
     {
     timer();
     displaybit=0;
     }
    ad17();
    WDT_CONTR=0x3c;
    }
}
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -