PIC16F877驱动KS0066U液晶程序

发布者:BlissfulMoments最新更新时间:2016-07-07 来源: eefocus关键字:PIC16F877  驱动KS0066U  液晶程序 手机看文章 扫描二维码
随时随地手机看文章
为了电子设计大赛,我又要重新学习单片机了!

现在来总结总结以前学习单片机的经验和体会:

1、单片机其实并不难,无非就是那几个模块,而真正难的是:一个外围芯片(比如下面将要驱动的液晶芯片)的工作时序以及准确的延时;然后利用单片机的资源去按照时序编程就得了,所以说了只要把一种单片机的常用模块搞通了,其它也就一样简单,很容易就OK了!

2、单片机编程的框架:模块的初始化,然后死循环和中断,很简单吧!

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

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

KS0066U液晶电路连线图

 

液晶驱动程序头文件

#ifndef LCD_H
#define LCD_H
#include ”main.h“
#define uchar unsigned char
//define port function 
#define LCD_DB7     RB5  //;//占用的I/O口定义   
#define LCD_DB6     RB4  //;//该行硬件连接:LCD的DB6与RB4连接,其它类推
#define LCD_DB5     RB3  //;
#define LCD_DB4     RB2  //;
#define LCD_E     RA3  //;
#define LCD_RS     RB1  //;
#define LCD_DB7_DIR TRISB5   //;//对应的方向寄存器定义
#define LCD_DB6_DIR TRISB4   //;
#define LCD_DB5_DIR TRISB3   //;
#define LCD_DB4_DIR TRISB2   //;
#define LCD_E_DIR TRISA3   //;
#define LCD_RS_DIR TRISB1   //; 
//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) ;
}

关键字:PIC16F877  驱动KS0066U  液晶程序 引用地址:PIC16F877驱动KS0066U液晶程序

上一篇:PIC16F877A定时器的学习
下一篇:PIC18f 串口中断

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

基于PIC16F877单片机的多功能电子时钟
一、功能实现 本设计主要实现实时时钟显示,时间可调;实时温度显示,并具有超限报警功能,输出显示采用LCD1602。 二、仿真图 基于proteus的仿真 三、主程序 #include lian_pic.h #include DHT11.h #include ds1302.h #include key.h #include lcd12864.h #include control.h __CONFIG(HS&WDTDIS&LVPDIS&PWRTEN); //HS振荡,禁止看门狗,低压编程关闭,启动延时定时器 void Basic_Io_Init(void) { ADCON1=0x06; //PORTA,PORTE
[单片机]
基于<font color='red'>PIC16F877</font>单片机的多功能电子时钟
单片机驱动1602液晶电路图及c51程序
原理图: 1602液晶电路图 51单片机驱动程序: #include reg51.h #include intrins.h #define uint unsigned int #define uchar unsigned char //这三个引脚参考资料 sbit E=P2^7; //1602使能引脚 sbit RW=P2^6; //1602读写引脚 sbit RS=P2^5; //1602数据/命令选择引脚 void init() { TMOD=0X00; TH0=0X03; TL0=0X32; IE=0X82; TR0=1; } /********
[单片机]
单片机<font color='red'>驱动</font>1602<font color='red'>液晶</font>电路图及c51<font color='red'>程序</font>
SMC1602A液晶显示器子程序
; LCD SMC1602A显示模块 ; *************************************************************************** ;连线图: *LCM---8031* *LCM---8031* *RS-------- P2.6* ; *DB0----P0.0* *DB4---P0.4* *RW--------P2.5* ; *DB1----P0.1* *DB5---P0.5* *GATE-----P2.7* ; *DB2----P0.2* *DB6---P0.6* *E--------NAND* ; *DB3----P0.3*
[单片机]
基于AVR单片机的12864液晶(ks0108)驱动程序及仿真
#include iom16v.h #include avrdef.h #define EN 0 #define RS 1 #define CS1 2 #define CS2 3 unsigned char yang ={ 0xEF,0xFB,0xEF,0xFC,0x2F,0xFF,0x00,0x00,0x6F,0xFF,0xEF,0xDC,0xFF,0xEF,0xBD,0x73, 0x1D,0xBC,0xAD,0xDF,0xB5,0xE7,0x39,0xB8,0xBD,0x7F,0xBF,0xBF,0x3F,0xC0,0xFF,0xFF }; unsigned char ying ={ 0
[单片机]
基于AVR单片机的12864<font color='red'>液晶</font>(ks0108)<font color='red'>驱动</font><font color='red'>程序</font>及仿真
PIC16F877定时器2的中断方式调试
PIC16F877单片机定时器2使用中断方式调试程序如下: #include pic.h #define uchar unsigned char #define uint unsigned int __CONFIG(0x3B31); void init(); uint intnum; void main() { init(); while(1) { /* if(intnum==5000) { intnum=0; RD0=!RD0; }*/ } } void init() { TRISD = 0x00; //设置PORTD为输出低电平 PORTD = 0x00; // /* I
[单片机]
一种基于单片机电压采样的功率因数在线检测
  1.引言   功率因数是交流电路中的重要参数,是衡量电力系统是否经济运行的一个重要指标,也是供电线路在线监测系统的重要检测量,在功率因数补偿系统中需对其进行实时测量。因此设计出结构简单、检测精度高的功率因数在线检测电路十分必要。而功率因数的测量一般都要对被测电路的电压、电流进行采样,然后进行处理提取功率因数信号,通常由电压、电流取样电路、整形电路、同步周期测量、相位测量等组成,其缺点是结构较复杂,检修困难,有时会出现功率因数的测量精度不高的问题。为此,作者基于电压采样,经单片机软件进行分析、计算可得出被测电路的功率因数,通过显示电路显示出功率因数的大小,并由通信接口电路将被测功率因数进行远距离传输。这样既简化功率因数测量电路
[单片机]
基于ds18b20温度带上限程序--LCD1602液晶显示
这是用1602来显示的,程序是修改前面几个实验的,当温度 40度时电风扇不转,当 =40度时电风扇转动,为参加电子比赛做的单片机系统实验。程序为汇编语言(ASM),带详细注释,值得新手朋友参考! 全部程序: ORG 0000H ;单片机内存分配申明! TEMPER_L EQU 29H;用于保存读出温度的低8位 TEMPER_H EQU 28H;用于保存读出温度的高8位 FLAG1 EQU 38H;是否检测到DS18B20标志位 a_bit equ 20h ;数码管个位数存放内存位置 b_bit equ 21h ;数码管十位数存放内存位置 RS EQU P3.7;确定具体硬件的连接方式 RW EQU P3.6 ;确
[单片机]
基于PIC16F877单片机的电子秤包装机控制系统
    摘要: 基于单片微处理器PIC16F877研制成功了六嘴回转式电子秤水泥包装机的智能控制器,给出控制系统的硬件电路和软件的设计思想,并阐述了控制器的工作原理。该控制器设计的高精度是本系统的重要性能。中断嵌套是设计软件中的难点。本系统还成功实现了与上位机的通信。     关键词: PIC单片机 A/D转换 中断 通信 包装机系统可用于粉末东颗粒物料(如水泥、化肥、粮食等)的定时包装,自动化程度、计量精度要求越来越高。针对用户的要求,本系统设计了一种基于PIC16F877单片机控制的电子秤水泥包装机控制系统。 控制系统包括调零、调满、设定粗细流阈值、插袋、喂料、压袋、推包、破袋处理等控制功能。另外,对检
[传感技术]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

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