PIC驱动JM240128液晶

本文档详细介绍了如何使用PIC16F877A微控制器驱动JM240128液晶显示器,包括初始化设置、指令发送、数据读写等子程序。还展示了如何显示字符、字符串、图像,并提供了清除屏幕、绘制点、线和框的函数。虽然最终目标是实现动态曲线绘制,但由于MCU RAM限制未完成,但提出了双缓冲区的显示策略以避免闪烁问题。
摘要由CSDN通过智能技术生成

这个驱动程序我耗了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(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值