PIC驱动JM240128液晶

发布者:iota19最新更新时间:2016-07-07 来源: eefocus关键字:PIC  驱动  JM240128液晶 手机看文章 扫描二维码
随时随地手机看文章
这个驱动程序我耗了3天的时间,想想真够笨的!一开始一天半,没有一点收获,主要是液晶的硬件电路没有连好!却开始写程序,结果怎么调,液晶就是没有显示!以前的用过的液晶不需要接什么电位器来调节显示的亮度,这个液晶却需要,而我没有接!浪费了我这么长时间,真是郁闷!

头文件

#ifndef JM240_H
#define JM240_H
#include "main.h"

//define port
#define DB PORTD 
#define DB_DIR TRISD
#define WR RA0
#define RD RA1 
#define CE RA2
#define CD RA3
#define RST RA4
typedef struct JM240
{
 uint graphic_add ;//only use graphic mode
 uchar graphic_width ;//define graphic width
 uint offset ;// offset address of currect page
 uint cur_page ;//current page
 uchar char_width ;//width of charactor
 uchar chn_width ;//width of chn
} JM240 ;
//define the first address of seperative page

extern JM240 jm ;
enum state{} ;
//define basic function
void init_jm240() ;//init JM240 include initiating control port ,JM240 struct and iniatiating LCD
void send_byte(uchar data) ;//send data
void send_cmd(uchar cmd) ;//send a cmd
uchar ch_status() ;//get status word
void ch_busy(uchar flag) ;//check whether the  current lcd is busy or not 
void rst_lcd() ;//reset lcd
uchar rd_data() ;
//define high zone function
void wr_data(uchar dat) ;
void wr_cmd0(uchar cmd) ;//no para command
void wr_cmd1(uchar data,uchar cmd) ;//one para command
void wr_cmd2(uchar dat1,uchar dat2,uchar cmd) ;//two para command
void wr_cmd3(uint data,uchar cmd) ;//one para of int type command
void set_mode(uchar mode) ;
void enable_autowr(uchar flag) ;
void enable_autord(uchar flag) ;
void auto_wr(uchar dat) ;
uchar auto_rd() ;
//define higher zone function
void str_disp(const uchar *str,uchar x,uchar y) ;//display string through internal character library
void show_char(uchar data,uchar x,uchar y) ;
void show_chn(const uchar *chn,uchar x,uchar y) ;
void chns_disp(const uchar *chn,uchar x,uchar y,uchar count) ;
void show_img(uchar x,uchar y,uchar x1,uchar y1,const uchar *img) ;
void lcd_refresh(const uchar *img) ;
void clr_lcd(uchar x,uchar y,uchar x1,uchar y1) ;
void clr_ram() ;
void wr_img(uchar x,uchar y,uchar width,uchar height,const uchar *img) ;
void set_add(uint ad) ;
void add_xy(uchar x,uchar y) ;//move ram pointer
void add_add(uint x) ;
void set_graphic(uint add,uchar width) ;//set graphic par

//define draw
void draw_vline(uchar x,uchar y,uchar height) ;
void draw_hline(uchar x,uchar y,uchar width) ;
void draw_frame(uchar x,uchar y,uchar width,uchar height) ;
void draw_point(uchar x,uchar y) ;
void draw_page(uchar num) ;
#endif 
子程序

#include "jm240.h"
#include "ascii0816.h"
const uint add[]={0x0000,0x0F00,0x1E00,0x2D00,0x3C00,0x4B00,0x5A00,0x6900,0x7800,0x9700,0xA600,0xB500,0xC400} ;
JM240 jm ;
void init_jm240()
{
 //set the directio of port
 DB_DIR=0 ;
 ADCON1=0x06 ;
 TRISA=TRISA&0xC0 ;
//init global variable
 jm.graphic_add=0x0000 ;
 jm.graphic_width=30 ;
 jm.cur_page=0 ;
 jm.offset=0x0000 ;
 jm.char_width=8 ;
 jm.chn_width=16 ;
//init
 rst_lcd() ;
 set_graphic(jm.graphic_add,jm.graphic_width) ;
 wr_cmd0(0x80) ;// 或模式
 wr_cmd0(0x98) ;//note here must start graphic display 
 clr_ram() ;
}
//restart lcd
void rst_lcd()
{
 RST=0 ;
 DelayUs(50) ;
 RST=1 ;
 DelayMs(50) ;
}
//get the currrent state of lcd
uchar ch_status()
{
 uchar temp ;
 CD=1 ;
 WR=1 ;

 CE=0 ;
 DB_DIR=0x00 ;
 DB=0xff ;
 RD=0 ;
 DB_DIR=0xFF ;
 temp=DB ;
 RD=1 ;
 CE=1 ;
 DB_DIR=0x00 ;
 return temp ;
}
//check whether lcd is busy or not at present 
void ch_busy(uchar flag)
{
 uchar temp1,temp2 ;
 if(!flag)//one write or read status flag
  temp2=0x03 ;
 else
 {
  if(flag==1)// auto write status flag check
   temp2=0x08 ;
  else//auto read state flag check
   temp2=0x04 ;
 }
 do
 {
  temp1=ch_status() ;
  temp1=temp1&temp2 ;
 }while(temp1!=temp2) ;
}

//set graphic mode
void set_graphic(uint ad,uchar width)
{
 jm.graphic_add=ad ;
 jm.graphic_width=width ;
 wr_cmd3(ad,0x42) ;
 wr_cmd2(width,0x00,0x43) ;
}
//read a byte from lcd
uchar rd_data()
{
 uchar temp ;
 ch_busy(0) ;
 CD=0 ;
 DB=0 ;
 CE=0 ;
 DB_DIR=0x00 ;
 DB=0xff ;
 RD=0 ;
 DB=0 ;
 CE=0 ;
 DB_DIR=0xFF ;
 temp=DB ;
 RD=1 ;
 CD=1 ;
 return temp ;
}
//send a byte to lcd ram
void send_byte(uchar dat)
{
 RD=1 ;
 DB_DIR=0x00 ;
 CE=0 ;
 CD=0 ;
 WR=0 ;
 DB=dat ;
// DelayUs(2) ;
 CE=1 ;
 CD=1 ;
 WR=1 ;
}
//send a command word to lcd registor
void send_cmd(uchar cmd)
{
 RD=1 ;
 DB_DIR=0x00 ;
 CE=0 ;
 CD=1 ;
 WR=0 ;
 DB=cmd ;
// DelayUs(2) ;
 CE=1 ;
 CD=1 ;
 WR=1 ; 
}
//write a byte
void wr_data(uchar data)
{
 ch_busy(0) ;
 send_byte(data) ;
}
//write a command with no parameter
void wr_cmd0(uchar cmd) 
{
 ch_busy(0) ;
 send_cmd(cmd) ;
}
//write a command with one parametre
void wr_cmd1(uchar para,uchar cmd)
{
 ch_busy(0) ;
 send_byte(para) ;
 ch_busy(0) ;
 send_cmd(cmd) ;
}
//write a cammand with two parameters 
void wr_cmd2(uchar para1,uchar para2,uchar cmd)
{
 ch_busy(0) ;
 send_byte(para1) ;
 ch_busy(0) ;
 send_byte(para2) ;
 ch_busy(0) ;
 send_cmd(cmd) ;
}
//write a command with a uint parameter
void wr_cmd3(uint para,uchar cmd) 
{
 uchar temp,temp1 ;
 temp=(uchar )para ;
 temp1=(uchar)(para>>8) ;
 wr_cmd2(temp,temp1,cmd) ; 
}
//autowrite
void auto_wr(uchar dat)
{
 ch_busy(1) ;
 send_byte(dat) ;
}
//autoread
uchar auto_rd() 
{
 uchar temp ;
 ch_busy(2) ;
 CD=0 ;
 DB=0 ;
 CE=0 ;
 DB_DIR=0x00 ;
 DB=0xff ;
 RD=0 ;
 DB=0 ;
 CE=0 ;
 DB_DIR=0xFF ;
 temp=DB ;
 RD=1 ;
 CD=1 ;
 return temp ;
}
//enable auto write or not
void enable_autowr(uchar flag)
{
 if(flag)
  wr_cmd0(0xB0) ;
 else
  wr_cmd0(0xB2) ;
}
//enable autoread or not
void enable_autord(uchar flag)
{
 if(flag)
  wr_cmd0(0xB1) ;
 else
  wr_cmd0(0xB3) ;
}
//define higher function
//current display ram address add add 
void add_add(uint ad)

 uint temp ;
 jm.offset+=ad ;
 temp=jm.cur_page+jm.offset ;
 wr_cmd3(temp,0x24) ;
}
//set addres s pointer 
// had better not use this function
void set_add(uint ad)
{
 jm.cur_page=ad ;
 wr_cmd3(ad,0x24) ;
}
//move address pointer to y row and x column
void add_xy(uchar x,uchar y)
{
 uint temp ;
 temp=(uint)x+((uint)y)*jm.graphic_width ;
 jm.offset=temp ;
 temp=temp+jm.cur_page ;
 wr_cmd3(temp,0x24) ;
}

void str_disp(const uchar *str,uchar x,uchar y)
{
 uint temp1 ;
 uchar temp,temp2,j,i ;
// wr_cmd0(0x9F) ;
// wr_cmd0(0x81) ;
// add_xy(1,x,y) ;
// while(*str!='/0')
// {
//  temp=*(str++)-0x20 ;
//  wr_cmd1(temp,0xC0) ;//address auto add 1
// }
// wr_cmd0(jm.disp_mode) 
 i=x ;
 y=y*16 ;
 while(*str!='/0') 
 {
  add_xy(i++,y) ;
  temp1=(*(str++)-0x20)*16 ;
  for(j=0;j<16;j++)
  {
   temp2=ascii0816[temp1+j];
   wr_cmd1(temp2,0xC4) ;
   add_add(30) ;
  }   
 }
}
//here as long as we understand how lcd scan screen,we can 
//implement what function we want 
//this lcd scan in horizon mode 
void show_char( uchar dat ,uchar x,uchar y)
{
 uint temp1 ;
 uchar i ,j ,temp2;
 y=y*16 ;
 add_xy(x,y) ;
 temp1=(dat-0x20)*16 ;
//for one char is composed of 16*8 dots ,so we need scan 16 times in horizontal way
 for(j=0;j<16;j++)
 {
  temp2=ascii0816[temp1+j];
//one times we write in 8 dots 
  wr_cmd1(temp2,0xC4) ;
  add_add(30) ;
 } 
}
void show_chn(const uchar *chn,uchar x,uchar y)
{
 uchar i ;
// x=x*8;
 y=y*16 ;
 add_xy(x,y) ;
 for(i=0;i<16;i++)
 {
  wr_cmd1(*chn++,0xC4) ;
  add_add(1) ;
  wr_cmd1(*chn++,0xC4) ;
  add_add(29) ;
 }
}
void chns_disp(const uchar *chn,uchar x,uchar y,uchar count) 
{
 uchar i,j ;
 for(i=0;i  {

  add_xy(x+i*2,y) ;
  for(j=0;j<16;j++)
  {
   wr_cmd1(*chn++,0xC4) ;
   add_add(1) ;
   wr_cmd1(*chn++,0xC4) ;
   add_add(29) ;
  } 
//  y=y+16 ;
 }
}
void show_img(uchar x,uchar y,uchar width,uchar height,const uchar *img)
{
 uchar i ,j,temp1,temp2 ;
// set_add(jm.cur_page) ;
// temp1=(x1-x)/8 ;
// temp2=(y1-y) ;
 add_xy(0,y) ;
 add_add(x) ;
 for(i=0;i  {
  for(j=0;j   {
   wr_cmd1(*img++,0xC4) ;
   add_add(1) ;
  }
  add_add(30-width) ;
 }
}
void clr_lcd(uchar x,uchar y,uchar width,uchar height)
{
 uchar i,j;
 width=width/8 ;
// add_xy(0,x,y) ;
 for(i=0;i  {
  add_xy(0,y+i) ;//move to the position where you want to clear
  add_add(x) ;
  enable_autowr(1) ;
  for(j=0;j   {
   auto_wr(0x00) ;
  }
  enable_autowr(0) ;  
 }

}
void clr_ram()
{
 uint i ;
 set_add(jm.cur_page) ;
 enable_autowr(1) ;
 for(i=0;i<0xFFFE;i++) 
 {
  auto_wr(0x00) ;
 }
 enable_autowr(0) ;
 set_add(jm.cur_page) ;
}
//this function has some problems 
void wr_img(uchar x,uchar y,uchar width,uchar height,const uchar *img)
{
 uchar i,j,flag ;
 if(jm.offset<0xF00)
  flag=0 ;
 else 
  flag=1 ;
 width=width/8 ;
 for(i=0;i  {
  add_xy(x,y+i) ;//move to the position where you want to clear
  enable_autowr(1) ;
  for(j=0;j   {
   auto_wr(*img++) ;
  }
  enable_autowr(0) ;  
 }
}
//draw picture
void draw_vline(uchar x,uchar y,uchar height) 
{
 uchar i ;
 add_xy(x,y) ;
 for(i=0;i  {
  wr_cmd0(0xF8) ;
  add_add(30) ;
 }  

}

void draw_hline(uchar x,uchar y,uchar width) 
{
 uchar i;
 add_xy(x,y) ;
 width=width/8 ;
 enable_autowr(1) ;
 for(i=0;i   auto_wr(0xff) ;
 enable_autowr(0) ;
}
void draw_frame(uchar x,uchar y,uchar width,uchar height)
{
 uchar i,j ;
 width=width/8 ;
//draw two horizon line
 add_xy(x,y) ;
 enable_autowr(1) ;
 for(i=0;i   auto_wr(0xFF) ;
 enable_autowr(0) ;
 add_xy(x,y+height) ;
 enable_autowr(1) ;
 for(i=0;i   auto_wr(0xFF) ;
 enable_autowr(0) ;
//draw two vertical line
 add_xy(x,y) ;
 for(i=0;i  {
  wr_cmd0(0xFF) ;
  add_add(29) ;
  wr_cmd0(0xF8) ;
  add_add(1) ;
 }  
}
void draw_point(uchar x,uchar y)
{
 uchar temp ;
 temp=x%8 ;
 x=x/8 ;
 add_xy(0,y) ;
 add_add(x) ;
 temp=7-temp+0xF8 ;
 wr_cmd0(temp) ;
}
void draw_page(uchar num)
{
 uint temp=jm.cur_page ;
 set_add(add[num]) ;
 clr_lcd(0,0,239,127) ;
 draw_frame(0,0,240,126) ;
 draw_hline(1,105,220) ;
 draw_vline(1,20,90) ;
// chns_disp(str,8,3,6) ;
// chns_disp(str1,205,102,2) ;
// show_chn(str2,0,2) ;
// show_chn(str2+32,0,3) ;
 draw_point(12,3) ; 
 set_add(temp) ;
}

测试程序
#include
#include

#include "main.h"
#include "jm240.h"

void interrupt main_int()
{
 ;
}
void init_all() 
{  
 init_jm240() ;
}

 const uchar str[]={

 

/*---------------实----------------*/
0x01,0x00,0x00,0x80,0x3F,0xFE,0x28,0x04,0x46,0x88,0x04,0x80,0x08,0x80,0x06,0x80,
0x04,0x80,0x7F,0xFE,0x00,0x80,0x01,0x40,0x02,0x20,0x04,0x10,0x18,0x18,0x60,0x10,

/*---------------时----------------*/
0x00,0x10,0x00,0x10,0x7C,0x10,0x44,0x10,0x47,0xFE,0x44,0x10,0x7C,0x10,0x45,0x10,
0x44,0x90,0x44,0x90,0x7C,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x50,0x00,0x20,

/*---------------温----------------*/
0x40,0x00,0x27,0xF0,0x24,0x10,0x07,0xF0,0x94,0x10,0x54,0x10,0x17,0xF0,0x20,0x00,
0x2F,0xFC,0xC9,0x24,0x49,0x24,0x49,0x24,0x49,0x24,0x49,0x24,0x5F,0xFE,0x40,0x00,
/*---------------度----------------*/
0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x2F,0xFC,0x22,0x20,0x23,0xE0,
0x20,0x00,0x27,0xF8,0x22,0x10,0x21,0x20,0x20,0xC0,0x41,0x30,0x46,0x0E,0x98,0x04,

/*---------------曲----------------*/
0x04,0x40,0x04,0x40,0x04,0x40,0x3F,0xFC,0x24,0x44,0x24,0x44,0x24,0x44,0x24,0x44,
0x3F,0xFC,0x24,0x44,0x24,0x44,0x24,0x44,0x24,0x44,0x3F,0xFC,0x20,0x04,0x00,0x00,

/*---------------线----------------*/
0x10,0x40,0x18,0x50,0x10,0x4C,0x20,0x48,0x23,0xFC,0x48,0x40,0xF8,0x40,0x13,0xFE,
0x20,0x40,0x7C,0x48,0x00,0x30,0x00,0x22,0x1C,0xD2,0xE3,0x0A,0x00,0x06,0x00,0x02,
} ;
 const uchar str1[]=
{
/*---------------时----------------*/
0x00,0x10,0x00,0x10,0x7C,0x10,0x44,0x10,0x47,0xFE,0x44,0x10,0x7C,0x10,0x45,0x10,
0x44,0x90,0x44,0x90,0x7C,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x50,0x00,0x20,

/*---------------间----------------*/
0x20,0x00,0x13,0xFC,0x10,0x04,0x40,0x04,0x47,0xE4,0x44,0x24,0x44,0x24,0x47,0xE4,
0x44,0x24,0x44,0x24,0x47,0xE4,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x14,0x40,0x08,
} ;
 const uchar str2[]=
{
/*---------------温----------------*/
0x40,0x00,0x27,0xF0,0x24,0x10,0x07,0xF0,0x94,0x10,0x54,0x10,0x17,0xF0,0x20,0x00,
0x2F,0xFC,0xC9,0x24,0x49,0x24,0x49,0x24,0x49,0x24,0x49,0x24,0x5F,0xFE,0x40,0x00,

/*---------------度----------------*/
0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x2F,0xFC,0x22,0x20,0x23,0xE0,
0x20,0x00,0x27,0xF8,0x22,0x10,0x21,0x20,0x20,0xC0,0x41,0x30,0x46,0x0E,0x98,0x04,
};

const char dat[]=
{
0,1,2,3,4,6,7,8,9,10,
11,12,13,14,15,16,17,18,19,20,
21,22,22,23,24,25,26,26,27,28,
28,29,30,30,31,31,32,32,33,33,
33,34,34,34,34,35,35,35,35,35,
35,35,35,35,35,35,34,34,34,34,
33,33,32,32,32,31,30,30,29,29,
28,27,27,26,25,24,24,23,22,21,
20,19,18,17,16,15,14,13,12,11,
10,9,8,7,6,5,4,3,2,1,
-1,-2,-3,-4,-5,-6,-7,-8,-9,-10,
-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,
-21,-22,-23,-24,-24,-25,-26,-27,-27,-28,
-29,-29,-30,-30,-31,-32,-32,-32,-33,-33,
-34,-34,-34,-34,-35,-35,-35,-35,-35,-35,
-35,-35,-35,-35,-35,-34,-34,-34,-34,-33,
-33,-33,-32,-32,-31,-31,-30,-30,-29,-28,
-28,-27,-26,-26,-25,-24,-23,-22,-22,-21,
-20,-19,-18,-17,-16,-15,-14,-13,-12,-11,
-10,-9,-8,-7,-6,-4,-3,-2,-1,0,
};

const char dat1[]=
{-3,-2,-1,0,
0,1,2,3,4,6,7,8,9,10,
11,12,13,14,15,16,17,18,19,20,
21,22,22,23,24,25,26,26,27,28,
28,29,30,30,31,31,32,32,33,33,
33,34,34,34,34,35,35,35,35,35,
35,35,35,35,35,35,34,34,34,34,
33,33,32,32,32,31,30,30,29,29,
28,27,27,26,25,24,24,23,22,21,
20,19,18,17,16,15,14,13,12,11,
10,9,8,7,6,5,4,3,2,1,
-1,-2,-3,-4,-5,-6,-7,-8,-9,-10,
-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,
-21,-22,-23,-24,-24,-25,-26,-27,-27,-28,
-29,-29,-30,-30,-31,-32,-32,-32,-33,-33,
-34,-34,-34,-34,-35,-35,-35,-35,-35,-35,
-35,-35,-35,-35,-35,-34,-34,-34,-34,-33,
-33,-33,-32,-32,-31,-31,-30,-30,-29,-28,
-28,-27,-26,-26,-25,-24,-23,-22,-22,-21,
-20,-19,-18,-17,-16,-15,-14,-13,-12,-11,
-10,-9,-8,-7,-6,-4,
};
bank1 uchar i,j,tmp1;
bank1 uint temp ;
void test()
{
 set_graphic(0x0000,30) ;
 set_add(0x0F00) ;
 set_graphic(0x0000,30) ;
 clr_lcd(2,18,220,80) ; 
 set_add(0x0F00) ;
 for(i=0;i<200;i++)
 {
 
//  if(i+j<200)
//   tmp1=dat[i+j]+55 ;
//  else
//   tmp1=dat[200-i-j]+55 ;

  draw_point(16+i,20) ;
 }
 if(j>=200)
   j=0 ;
 else
  j++ ;
 DelayMs(255) ;
 DelayMs(255) ;

 set_graphic(0x0F00,30) ;
 set_add(0x0000) ;
 clr_lcd(2,18,220,80) ;
 set_graphic(0x0F00,30) ;
 set_add(0x0000) ;
 for(i=0;i<200;i++)
 {
//  if(i+j<200)
//   tmp1=dat[i+j]+55 ;
//  else
//   tmp1=dat[200-i-j]+55 ;

  draw_point(16+i,j) ;
 }
 if(j>=200)
   j=0 ;
 else
  j++ ;
}
void main() 
{

// const uchar str1[]="hello world!" ;
 init_all() ;
 wr_cmd0(0x98) ;

 clr_lcd(1,1,240,128) ;
 draw_frame(0,0,240,126) ;
 draw_hline(1,105,220) ;
 draw_vline(1,20,90) ;
 chns_disp(str,8,3,6) ;
 chns_disp(str1,205,102,2) ;
 show_chn(str2,0,2) ;
 show_chn(str2+32,0,3) ;
 draw_point(12,3) ;
// clr_lcd(0,0,240,128) ; 
// show_img(0,0,240,128,img) ;
 for(i=0;i<200;i++)
 {
  draw_point(16+i,dat[i]+55) ;
 }
// clr_lcd(2,18,220,80) ;

temp=jm.cur_page ;
set_add(0x0F00) ;
 clr_lcd(1,1,240,128) ;
 draw_frame(0,0,240,126) ;
 draw_hline(1,105,220) ;
 draw_vline(1,20,90) ;
 chns_disp(str,8,3,6) ;
 chns_disp(str1,205,102,2) ;
 show_chn(str2,0,2) ;
 show_chn(str2+32,0,3) ;
 draw_point(12,3) ;
// clr_lcd(0,0,240,128) ; 
// show_img(0,0,240,128,img) ;
 for(i=0;i<200;i++)
 {
  draw_point(16+i,dat1[i]+55) ;
 }
set_add(temp) ;
j=0 ;

 while(1) 
 {
// set_graphic(0x0000,30) ;
// set_add(0x0F00) ;
//// set_graphic(0x0000,30) ;
// clr_lcd(2,18,220,80) ; 
// set_add(0x0F00) ;
// for(i=0;i<200;i++)
// {
// 
//  if(i+j<200)
//   tmp1=dat[i+j]+55 ;
//  else
//   tmp1=dat[200-i-j]+55 ;
//
//  draw_point(16+i,2) ;
// }
//// if(j>=200)
////   j=0 ;
//// else
//  j++ ;
//// DelayMs(255) ;
//// DelayMs(255) ;
//
// set_graphic(0x0F00,30) ;
// set_add(0x0000) ;
// clr_lcd(2,18,220,80) ;
// set_graphic(0x0F00,30) ;
// set_add(0x0000) ;
// for(i=0;i<200;i++)
// {
//  if(i+j<200)
//   tmp1=dat[i+j]+55 ;
//  else
//   tmp1=dat[200-i-j]+55 ;
//
//  draw_point(16+i,5) ;
// }
//// if(j>=200)
////   j=0 ;
//// else
//  j++ ;
//// DelayMs(255) ;
//// DelayMs(255) ;
 test() ;
 } 

}
本来想用来画动态曲线的,可是PIC16F877A的RAM空间太小,不能容下200字节的数组,所以也就没有做完,不过思路就有了,

就是建立两个缓冲区,一个缓冲区显示,一个缓冲区用于写数据,当一个缓冲区在显示时,向另一个缓冲区中写数据,然后移动显示指针,显示另一个缓冲区的数据,再重复上面的操作!这样显示比使用一个缓冲区效果要好!不会因刷屏而造成屏幕的闪烁!

关键字:PIC  驱动  JM240128液晶 引用地址:PIC驱动JM240128液晶

上一篇:PIC16F877A驱动12864液晶
下一篇:PIC单片机的红外遥控与解码

推荐阅读最新更新时间:2024-03-16 14:59

使用TI功能安全栅极驱动器提高SiC牵引逆变器的效率
随着电动汽车 (EV) 制造商竞相开发成本更低、行驶里程更长的车型,电子工程师面临降低牵引逆变器功率损耗和提高系统效率的压力,这样可以延长行驶里程并在市场中获得竞争优势。功率损耗越低则效率越高,因为它会影响系统热性能,进而影响系统重量、尺寸和成本。随着开发的逆变器功率级别更高,每辆汽车的电机数量增加,以及卡车朝着纯电动的方向发展,人们将持续要求降低系统功率损耗。 过去,牵引逆变器使用绝缘栅双极晶体管 (IGBT)。然而,随着半导体技术的进步,碳化硅 (SiC) 金属氧化物半导体场效应晶体管具有比IGBT更高的开关频率,不仅可以通过降低电阻和开关损耗提高效率,还可以增加功率和电流密度。在EV牵引逆变器中驱动 SiC,尤其是在功率
[汽车电子]
使用TI功能安全栅极<font color='red'>驱动</font>器提高SiC牵引逆变器的效率
基于单片机的CCD驱动电路的设计
 CCD是一种固体成像器件 ,应用广泛。CCD工作需要多路脉冲驱动,并且各路脉冲在时序上要严格对应。对于CCD时序的设计,通常采用CPLD和FPGA技术,CPLD在低频CCD时序设计中使用 ,FPGA则用在更为复杂的时序设计中 。对于驱动比较简单的线阵CCD没有必要用这种成本比较高的电路。本文针对东芝公司的线阵CCD芯片TCD1304设计了基于单片机ATmega16的驱动电路。采用ATmega16的定时器/计数器timer0的CTC(比较匹配时清零定时器)模式和timer1的相位与频率修正PWM模式产生所需要的基本波形,可通过修改单片机程序中的参数来改变输出波形的频率和占空比,使得波形调整便捷。 1 ATmega16的CTC模式及
[单片机]
基于单片机的CCD<font color='red'>驱动</font>电路的设计
带消光比控制的多速率激光驱动器MAX3737
1 引言 MAX3737是美国MAXIM公司生产的带有消光比控制的激光驱动器,它的工作速率为155Mbps~2.7Gbps,可用作多速率OC-3至OC-48 FEC等光纤系统中的光发射机。该产品与以往同类产品相比,不仅具有传输速率高、供电电流小和输出平均功率恒定等特点,而且在激光管的使用寿命和温度变化范围内能始终保持消光比恒定。MAX3737的主要特性如下: ● 采用+3.3V单电源工作模式; ● 仅需47mA的电源供给电流; ● 能提供高达85mA的调制电流和高达100mA的偏置电流; ● 内含自动功率控制(APC)、自动调制控制(AMC)和温度补偿电路; ● 带有以地为参考点的电流监控设置端; ●
[单片机]
采用信号调理IC驱动应变片电桥传感器
  目前可以提供的应变片具有较宽的零应变电阻选择范围,可以选择的传感器材料和相关技术也非常广泛,但在大量应用中主要采用了几类数值(如120Ω和350Ω)。过去,标准值很容易实现与基本磁反射计的连接,这些反射计含有匹配输入阻抗网络,从而简化了应变测量。    应变片的类型和组成   金属应变片的生产采用了一定数量的合金,选择较小的应变片和应变材料温度系数差。钢、不锈钢和铝成为主要的传感器材料。也可以使用铍铜、铸铁和钛,“大部分”合金推动了温度兼容应变片的大批量低成本生产。350Ω铜镍合金应变片是最常用的。厚膜和薄膜应变片具有可靠和易于生产的特性,适用于汽车行业,其生产一般采用陶瓷或者金属基底,在表面沉积绝缘材料。通过汽相沉积
[模拟电子]
基于ARM+Linux 2.6内核的控制系统驱动设计
   0 引 言   嵌入式系统的开发都有其特殊的应用场合与特定功能,而嵌入式Linux操作系统因其开源和广泛的处理器支持、易于移植而备受行业青睐。AT91RM9200是Atmel公司针对系统控制、通信领域推出的基于ARM920T内核的32位RISC微处理器,它具有小体积,低功耗,低成本及高性能等特点,其内部集成了SPI、串口、PIO、以太网、EBI、USB、MCI等多种接口。   在Linux系统中,应用层不可以直接操作硬件,需设计驱动程序向下屏蔽硬件特性,实现硬件与用户间的通信。系统平台为在虚拟机中安装Fedora 8,目标系统采用Linux 2.6.21.7内核,定制文件系统建立NFS根文件系统,使用双网卡方式搭建成
[嵌入式]
PIC16F + PICC9.50 学习笔记(二)
配置字中LP/XT/HS的区别: 1、这三个模式下对晶体提供的激励功率是不同的,一般 200KHZ的晶体可选择LP,100KHZ~4MHZ可选择XT,超过2M可选择HS 2、请注意,LP/XT/HS中频率区域是有一定重叠的,这主要是考虑到各种不同厂家晶体性能的差异所致。 3、工程师可根据频率范围大致选择一个配置字,使用示波器看看振荡波形的幅值是否达到电源电压的3/4以上,如果波形幅值不够,可以上调一级配置字。 4、振荡频率基本只决定于晶体本身,激励对其的影响甚小。 5、激励对晶体的起振时间有明显影响,如果激励不够,可能会发生振荡不启动或者振荡时有停振等现象。 6、过强的激励会导致晶体内部振荡子的过激破碎
[单片机]
SST25VF080B SPI接口FLASH STM32驱动
所有的FLASHA 都一样只能从1变0,要想从0变1 只有擦除一个页扇, SST25VF080B 最小可以擦除4KB的页 速度也不错 50MHz 容量1MB 挺够用的 10万次的擦写寿命。最低2.7V 就可正常工作。 Flexible Erase Capability Uniform 4 KByte sectors Uniform 32 KByte overlay blocks Uniform 64 KByte overlay blocks 先记下 这些个7788的命令 SST25VF080B 的各种命令比较繁琐 Status Register这个设置写保护多点 我这里只用它的判忙BUSY 一样先配
[单片机]
SST25VF080B SPI接口FLASH STM32<font color='red'>驱动</font>
驱动永磁无刷直流电机的嵌入式微控制器
    摘要: 本文介绍了一种适用于控制永磁无刷直流电机的廉价嵌入式微控制器,并结合实例给出了软件和硬件两种控制方法。     关键词: 永磁无刷直流电机  控制  嵌入式微控制器 一、 概述 永磁无刷直流电机(Permanent Magnet Brushless DC Motor以下简称PMBLDC)由于其固有的特点,在家用消费类产品(空调、冰箱、洗衣机)和IT周边产品(打印机、软驱、硬驱)中得到广泛的应用。它具有结构简单、高效、低噪声、高功率密度、启动扭矩大、寿命长等其它种类直流电机无法比拟的特性。我国是稀土大国,稀土永磁材料经过这几年的发展,已经有了一定的规模,质量和数据都有较大的提高,价格已不断
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved