专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

PIC16F917驱动段码液晶(内部集成驱动)程序

作者:佚名   来源:不详   点击数:  更新时间:2014年08月31日   【字体:
#include <pic.h>
 
//#define  a       0b00000010
//#define  b       0b00001000 
#define  a       0b01000000 //另一段
#define  b       0b00100000 //另一段
#define  c       0b01000000 
#define  d       0b10000000 
#define  e       0b00100000    
#define  f       0b00000100    
#define  g       0b00010000   
#define none     0x00000000
 
#define  LCD_MASK0       0xff
#define  LCD_MASK1       0xff
#define  LCD_MASK2       0xff 
 
/*LCD取模:xDCEGFBA*/   /*   0    1    2    3    4    5    6    7    8    9*/
//const unsigned char LCD_MODEL[11]={0x77,0x22,0x5b,0x6b,0x2e,0x6d,0x7d,0x23,0x7f,0x6f,0x00}; 
 
const unsigned int LCD_MODEL[10][2]={
  {a,b+c+d+e+f},                      //0
  {b,c},                              //1
  {a+b,d+e+g},                        //2
  {a+b,c+d+g},                        //3
  {b,f+c+g},                          //4
  {a,f+c+d+g},                        //5
  {a,f+c+d+e+g},                      //6
  {a+b,c},                            //7
  {a+b,f+c+d+e+g},                    //8
  {a+b,f+c+d+g}                       //9
} ;
/*LCD初始化函数*/
void Init_LCD(void)
{
/*COM0*/
LCDDATA0=0x00;
LCDDATA1=0x00;
/*COM1*/
LCDDATA3=0x00;
LCDDATA4=0x00;
/*COM2*/
LCDDATA6=0x00;
LCDDATA7=0x00;
/*COM3*/
LCDDATA9=0x00;
LCDDATA10=0x00;
/*SEG0-SEG14使能*/
LCDSE0=0xff;
LCDSE1=0x7f;
/*使能LCD驱动模块,休眠模式下禁止LCD驱动模块,无LCD写错误,使能VLCD引脚*/
/*时钟选择FOSC/8192,公共端选择1/4(COM<3:0>)*/
LCDCON=0xd3;//0xd3;
/*B型波形,1/3偏置模式,使能LCD驱动模块,允许写入LCDDATAx寄存器*/
/*LCD预分频比选择位:LP<3:0>=0010=1:3,LCD帧频率=64Hz*/
LCDPS=0xb3;//0xb3;
}
void Lcd_Show0(char Data)         
{
LCDDATA0=(LCDDATA0&~LCD_MASK0)|LCD_MODEL[Data][1];//<<3);
LCDDATA1=(LCDDATA1&~LCD_MASK0)|LCD_MODEL[Data][0];
LCDDATA2=0;
}
void Lcd_Show1(char Data)         
{
LCDDATA3=(LCDDATA3&~LCD_MASK0)|LCD_MODEL[Data][1];//<<2);
LCDDATA4=(LCDDATA4&~LCD_MASK0)|LCD_MODEL[Data][0];
LCDDATA5=0;
}
void Lcd_Show2(char Data)         
{
  LCDDATA6=(LCDDATA6&~LCD_MASK0)|LCD_MODEL[Data][1];//<<1);
LCDDATA7=(LCDDATA7&~LCD_MASK0)|LCD_MODEL[Data][0];
LCDDATA8=0;
}
void Lcd_Show3(char Data)         
{
    LCDDATA9 =(LCDDATA9&~LCD_MASK0) |LCD_MODEL[Data][1];//<<0);
LCDDATA10=(LCDDATA10&~LCD_MASK0)|LCD_MODEL[Data][0];
LCDDATA11=0;
}
/*LCD显示函数,显示范围-1999~1999*/
void LCDNUMI(int num)
{  
unsigned char ge,s,ba,q;//ge=0,s=0,ba=0;/*个位,十位,百位*/
q=num  %10000/1000;
ba=num %1000/100;
s=num  %100/10;
ge=num %10;
Lcd_Show3(ge);
Lcd_Show2(s);
Lcd_Show1(ba);
Lcd_Show0(q);
}
void delay(int i)
{
while(i>0)
{
i--;
}
}
void main(void)
{
int num=1234;//-1999;
OSCCON = 0b01110001; //8MHz内部晶振
while(!HTS); //等待主时钟稳定// while(!(OSCCON&0x04));
Init_LCD();
while(1)
{
LCDNUMI(num);//只能显示第一位
// num++;
delay(65000);
}
}
关闭窗口