您的位置 首页 培训

PIC16F877驱动KS0066U液晶程序

为了电子设计大赛,我又要重新学习单片机了!现在来总结总结以前学习单片机的经验和体会:1、单片机其实并不难,无非就是那几个模块,而真…

为了电子设计大赛,我又要重新学习单片机了!

现在来总结总结曾经学习单片机的经历和领会:

1、单片机其实并不难,无非便是那几个模块,而真实难的是:一个外围芯片(比方下面即将驱动的液晶芯片)的作业时序以及精确的延时;然后使用单片机的资源去依照时序编程就得了,所以说了只要把一种单片机的常用模块搞通了,其它也就相同简略,很简单就OK了!

2、单片机编程的结构:模块的初始化,然后死循环和中止,很简略吧!

3、单片机编程应该留意的问题,一是要依照说明书给出的时序来编程,不要自己想当然了;二是要操控好延时,大部分单片机体系的不稳定,有许多是因为延时不到位引起的;而对PIC等单片机来说,还得留意使用时必定得留意单片机的端口的方向(输入仍是输出)!

本驱动选用4bit,2-line形式电路图如下:

液晶驱动程序头文件

#ifndef LCD_H
#define LCD_H
#include ”main.h“
#define uchar unsigned char
//define port function
#defineLCD_DB7 RB5 //;//占用的I/O口界说
#defineLCD_DB6 RB4 //;//该行硬件衔接:LCD的DB6与RB4衔接,其它类推
#defineLCD_DB5 RB3 //;
#defineLCD_DB4 RB2 //;
#defineLCD_E RA3 //;
#defineLCD_RS RB1 //;
#defineLCD_DB7_DIRTRISB5 //;//对应的方向寄存器界说
#defineLCD_DB6_DIRTRISB4 //;
#defineLCD_DB5_DIRTRISB3 //;
#defineLCD_DB4_DIRTRISB2 //;
#defineLCD_E_DIRTRISA3 //;
#defineLCD_RS_DIRTRISB1 //;
//define commad
#define LCD_FUNC_MODE 0x28 //4bit 2-line 5*8dots
#define LCD_CURSE_MODE0 0x0c //display :on ,curse :off,blink :offf
#define LCD_CURSE_MODE1 0x0e //lcd display curse display
#define LCD_CURSE_MODE2 0x0f //lcd display curse display curse blink
#define LCD_CLR_DISP 0x01 //clear display
#define LCD_BEGIN_ADD 0x80 //set begin address
#define LCD_SHIFT_RIGHT_ALL 0x05 //shift entire display in rightt direction
#define LCD_SHIFT_LEFT_ALL 0x07 //shirft left entire
#define LCD_CURSE_RIGHT 0x14//curse shift right
#define LCD_CURSE_LEFT 0x10 //curse shift left ;
#define LCD_DISP_LEFT 0x18//shift display in left direction
#define LCD_DISP_RIGHT 0x1C//shift display in right direction
#define LCD_SECOND_LINE 0xc0 //change line

void init_lcd() ;
void write_in() ;
void sendcmd(char cddata);
void putclcd(char data) ;
void printlcd(const char *data) ;
void write(char data) ;
void delay(unsigned int count) ;
void lcd_shift(uchar flag,uchar count) ;
void curse_shift(uchar flag,uchar count) ;
void delay_long() ;
#endif
液晶驱动程序

#include “lcd.h”
void init_lcd()
{
//设置端口输出形式
LCD_DB7_DIR=0;
LCD_DB6_DIR=0;
LCD_DB5_DIR=0;
LCD_DB4_DIR=0;
LCD_E_DIR=0;
LCD_RS_DIR=0;

//铲除数据线
LCD_DB7=0;
asm(“nop”);
LCD_DB6=0;
asm(“nop”);
LCD_DB5=0;
asm(“nop”);
LCD_DB4=0;
asm(“nop”);
LCD_RS=0;
asm(“nop”);

LCD_E=0;
asm(“nop”);
//将上述指令设置收效
write_in() ;
delay(0xffff) ;
delay(0xffff) ;
//设置功用形式,4bit,2-line.5*8dots
sendcmd(0x28) ;
sendcmd(0x0c) ;//发动显现,光标不显现,光标不闪耀
sendcmd(0x80) ;//设置开始地址
sendcmd(0x01) ;//清屏

}
/*********************8
10us级延时
***********************/
void delay(unsigned int count)
{
while(count)
count-=1;
}
/*************************************
使写入收效
****************************************/
void write_in()
{
asm(“nop”) ;
LCD_E=1 ;
asm(“nop”) ;
LCD_E=0 ;
asm(“nop”) ;
}
/***********************************
发送指令
*************************************/
void sendcmd(char cmdata)
{
LCD_RS=0; //设置为送指令形式,与PUTCLCD仅相差此行
write(cmdata); //写入全字节
//delay(255);
}
/********************************************
显现单个字符
********************************************/
void putclcd(char lcdbyte)
{
LCD_RS=1;//设置为发送数据形式
write(lcdbyte);
// delay(255);
}
/**************************************
*显现字符串
*************************************/
void printlcd(const char *lcdata)
{
while((*lcdata)!=/0)
{
putclcd(*lcdata++);
}
}
/**********************************************
*写入单个字节
**********************************************/
void write(char wdata)
{
char temp=wdata;
LCD_DB7=0;
LCD_DB6=0;
LCD_DB5=0;
LCD_DB4=0;
if(temp&0X80)
LCD_DB7=1;
if(temp&0X40)
LCD_DB6=1;
if(temp&0X20)
LCD_DB5=1;
if(temp&0X10)
LCD_DB4=1;
write_in() ;

temp=wdata<<4;
LCD_DB7=0;
LCD_DB6=0;
LCD_DB5=0;
LCD_DB4=0;
if(temp&0X80)
LCD_DB7=1;
if(temp&0X40)
LCD_DB6=1;
if(temp&0X20)
LCD_DB5=1;
if(temp&0X10)
LCD_DB4=1;
write_in() ;
delay(160);
}

/*************************************
*功用:移动显现:如果把延时改动一下能够改动显现移动的速冻
*输入参数:flag=0 shift left ;flag=1 shift right ;count :the bit og shift
******************************/
void lcd_shift(uchar flag,uchar count)
{
uchar i ;
if(flag==0)
{
for(i=0;i{
//delay(0xfff) ;
delay_long() ;
sendcmd(LCD_DISP_LEFT) ;
}
}
else
{
for(i=0;i{
delay_long() ;
sendcmd(LCD_DISP_RIGHT) ;
}
}
}

/*****************************
*功用:光标移动
*输入参数:flag=0 shift left ;flag=1 shift right ;count :the bit og shift
**************************/
void curse_shift(uchar flag,uchar count)
{
uchar i ;
if(flag==0)
{
for(i=0;i{
//delay_long() ;
sendcmd(LCD_CURSE_LEFT) ;
}
}
else
{
for(i=0;i{
//delay_long() ;
sendcmd(LCD_CURSE_RIGHT) ;
}
}
}
void delay_long()
{
unsigned char i ;
for(i=0;i<2;i++)
delay(0x4ff1) ;
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/276676.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部