⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd_driver.c

📁 C8051F005单片机控制160*128液晶屏的驱动程序
💻 C
字号:
/***********************************************
 *LCD调试程序*
  Lcd_Driver.c  160128 T6963C
 ***********************************************/

/*头文件*/
#include <C8051F000.h>
#include <absacc.h>

#include <intrins.h>

/*typedef*/
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;

#define LCD_DataPort P2

// LCD128*64 I/O 信号管脚
sbit CD  = P0^7; // 指令\数据 选择  高选择指令,低选择数据
sbit CE  = P0^3; // 片选信号,低电平有效
sbit RD  = P0^4; // 读选择 ,低电平有效
sbit WR  = P1^0;   // 写信号,低有效

//横向取模,字节不倒序
const unsigned char code cctab[128]={
/*--  文字:  电  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,
0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x01,0x02,0x01,0x02,0x00,0xFE,0x00,0x00,

/*--  文字:  压  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x3F,0xFE,0x20,0x00,0x20,0x80,0x20,0x80,0x20,0x88,0x2F,0xFC,0x20,0x80,
0x20,0xA0,0x20,0x90,0x20,0x98,0x40,0x90,0x40,0x80,0xBF,0xFE,0x00,0x00,0x00,0x00,

/*--  文字:  测  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x02,0x27,0xC2,0x24,0x42,0x84,0x52,0x45,0x52,0x55,0x52,0x15,0x52,0x25,0x52,
0x25,0x52,0x25,0x52,0xC5,0x52,0x41,0x02,0x42,0x82,0x42,0x42,0x44,0x4A,0x48,0x04,

/*--  文字:  试  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x20,0x40,0x28,0x20,0x24,0x30,0x24,0x27,0xFE,0x00,0x20,0xE0,0x20,0x27,0xE0,
0x21,0x20,0x21,0x10,0x21,0x10,0x21,0x0A,0x29,0xCA,0x36,0x06,0x20,0x02,0x00,0x00,


};

/******************初始化子程序****************/
/*时钟初始化*/
void SYSCLK_Init (void)
{
//晶振配置,采用内部晶振,默认为16MHz,八分频为2MHz
//允许时钟丢失监测器
//	OSCICN = 0x94;	
//	OSCXCN = 0x00;	

//外部晶振	
  int i;                              // delay counter
   OSCXCN = 0x67;                      // start external oscillator with
                                       // 18.432MHz crystal
   for (i=0; i < 256; i++) ;           // Wait for osc. to start up
   while (!(OSCXCN & 0x80)) ;          // Wait for crystal osc. to settle
   OSCICN = 0x88;                      // select external oscillator as SYSCLK
                                       // source and enable missing clock
                                       // detector
}

/*端口初始化*/
void PORT_Init (void)
{
//交叉开关使能,但没有进行外围设备配置
	XBR0 = 0x00;	
	XBR1 = 0x00;	
	XBR2 = 0x40;

	
//均配置为开漏输出	
	PRT0CF |= 0x00;
	PRT1CF |= 0x00;
	PRT2CF |= 0x00;  
	PRT3CF |= 0x00;
}

/*****************LCD子程序***********************/

//读取LCD状态字
uchar readstate(void)
{
  uchar lcd_state;
  LCD_DataPort=0xff; // 读取总线端口物理电平
  CD=1;
   _nop_();
  RD=0;
   _nop_();
  lcd_state=LCD_DataPort;
  _nop_();
  _nop_();
  RD=1;

  return lcd_state;
/*  
  DDRA=0x00;
  DDRC|=(1<<3);
  DDRE|=(1<<6);
  PORTC|=(1<<3);   // C/D=1
  PORTE&=~(1<<6);   // /RD=0
  lcd_state=PINA&0xff;   // 读取引脚A物理电平
  NOP();
  NOP();
  PORTE|=(1<<6);   // /RD=1
  return lcd_state;
*/
}
//判断指令(数据)读写状态
void st01(void)
{
  while((readstate()&0x03)!=3)
    ;   
}

//判断数据自动读状态
void st2(void)
{
  while((readstate()&0x04)!=4)
    ;
}

//判断数据自动写状态
void st3(void)
{
  while((readstate()&0x08)!=8)
    ;
}


//指令写入函数
void writecode(uchar comd0)
{
  st01();
  LCD_DataPort=comd0;
  WR=0;   // /WR=0
  _nop_();
  _nop_();
  WR=1;    // /WR=1

/*  st01();
  DDRA=0xff;   //A口方向为输出
  PORTA=comd0;   //送数据到A口寄存器
  DDRE|=(1<<7);   
  PORTE&=~(1<<7);  // /WR=0
  NOP();
  PORTE|=(1<<7);  // /WR=1
*/
}
 
 
//数据写入函数
void writedata(uchar onedata)
{
  st01();    //状态判断
  CD=0;      //C/D=0,数据通道
   _nop_();
  LCD_DataPort=onedata;
  WR=0;   // /WR=0
  _nop_();
  _nop_();
  WR=1;    // /WR=1
 
/*
  st01();
  DDRC|=(1<<3);
  PORTC&=~(1<<3);  // C/D=0,数据通道
  DDRA=0xff;   //A口方向为输出
  PORTA=onedata;  //送数据到A口寄存器
  DDRE|=(1<<7);   
  PORTE&=~(1<<7);  // /WR=0
  NOP();
  PORTE|=(1<<7);  // /WR=1 
*/
}


//数据自动写入函数
void writeauto(uchar onedata)
{
  st3();    //状态判断
  CD=0;      //C/D=0,数据通道
   _nop_();
  LCD_DataPort=onedata;
  WR=0;   // /WR=0
  _nop_();
  _nop_();
  WR=1;    // /WR=1

/*
  st3();
  DDRC|=(1<<3);
  PORTC&=~(1<<3);  // C/D=0,数据通道
  DDRA=0xff;   //A口方向为输出
  PORTA=onedata;  //送数据到A口寄存器
  DDRE|=(1<<7);   
  PORTE&=~(1<<7);  // /WR=0
  NOP();
  PORTE|=(1<<7);  // /WR=1 
*/
}

//一字节参数指令写入函数
void oneparameter(uchar onep1,uchar comd1)
{
  writedata(onep1);
  writecode(comd1);
}

//两字节参数指令写入函数
void twoparameter(uchar twop1,uchar twop2,uchar comd2)
{
  writedata(twop1);
  writedata(twop2);
  writecode(comd2);
}


/***********************************************************
 液晶初始化,清屏
***********************************************************/

//内置T6963C控制器液晶初始化函数
void lcd_init(void)
{
  twoparameter(0x00,0x00,0x40);  //文本显示区域首地址0x0000
  twoparameter(0x20,0x00,0x41);  //文本显示区域宽度32字节
  twoparameter(0x00,0x08,0x42);  //图形显示区域首地址0x0800
  twoparameter(0x20,0x00,0x43);  //图形显示区域宽度32字节
  writecode(0xa7);  //光标形状
  writecode(0x80);  //显示方式设置(使用内部CGROM,逻辑或合成)
  writecode(0x9c);  //显示开关(开文本和图形显示方式,禁止光标显示和闪烁)
}


//清除屏幕(清所有8K存储空间)
void lcd_clear(void)
{ 
  uint cl_count;
  twoparameter(0x00,0x00,0x24);  //设置显示存储器首地址
  writecode(0xb0);  //设置自动写状态
  for(cl_count=8192;cl_count>0;cl_count--)
    writeauto(0x00);
  writecode(0xb2);  //关闭自动写状态  
}


/********************************************************
    西文字符,汉字,点阵显示函数
********************************************************/
//西文字符写入函数
//x_asc:0~19;  y_asc:0~15
void writeasc(uchar x_asc,uchar y_asc,uchar code_asc)
{
  uint address;
  address=y_asc*32+x_asc;
  twoparameter((uchar)(address),(uchar)(address>>8),0x24);  //设置显示存储器地址
  oneparameter(code_asc,0xc4);  //装入字符代码,写入数据,地址不变
}


//汉字写入函数
//x_hz:0~19;  y_hz:0~127
void writehz(uchar x_hz,uchar y_hz,uchar code_hz)
{
  uchar i_hz;
  uint address,addr_hz;
  address=y_hz*32+x_hz+0x0800;  //计算显示存储器地址
  addr_hz=code_hz*32;  //计算汉字字模地址(cctab的下标)
  for(i_hz=0;i_hz<16;i_hz++)  //计数值16
   {
   twoparameter((uchar)(address),(uchar)(address>>8),0x24);  //设置显示存储器地址
   oneparameter(cctab[addr_hz++],0xc0);  //写入汉字字模左部  
   oneparameter((cctab[addr_hz++]),0xc0);//写入汉字字模右部
   address+=32;  //修改显示存储器地址,显示下一列(共16列)
   }
}
//写数字
void writenum(uchar x_asc,uchar y_asc,uchar code_asc)
{
   code_asc+=0x10;
   writeasc(x_asc,y_asc,code_asc);
}
//写字母
void writeabc(uchar x_asc,uchar y_asc,uchar code_asc)
{

   code_asc-=0x20;
   writeasc(x_asc,y_asc,code_asc);
}



/*********************主程序*******************/
void main(void)
{
 
 	WDTCN = 0xDE;   //禁止看门狗
   	WDTCN = 0xAD;

	SYSCLK_Init();  //初始化时钟
 	PORT_Init();    //初始化端口
    CE=0;

	lcd_init();
    lcd_clear();
	
//	writeasc(2,2,'2');
	while(1)
    {
//    writeasc(0,0,'0');


	writehz(1,30,0);
	writehz(1,46,1);
	writehz(1,62,2);
	writehz(1,78,3);
//	writenum(1,10,9);

	writenum(1,1,1);
	writenum(2,1,2);
	
	writenum(3,1,3);
	
	writenum(4,1,4);
	
	writenum(5,1,5);
	
	writenum(6,1,6);
	
	writenum(7,1,7);
	
	writenum(8,1,8);
	
	writenum(9,1,9);

	writeabc(0,2,'a');
	writeabc(1,2,'b');
	writeabc(2,2,'c');
	writeabc(3,2,'d');
	writeabc(4,2,'e');
	writeabc(5,2,'f');
	writeabc(6,2,'g');
	writeabc(7,2,'h');
	writeabc(8,2,'i');
	writeabc(9,2,'j');
	writeabc(10,2,'k');
	writeabc(11,2,'l');
	writeabc(12,2,'m');
	writeabc(13,2,'n');
	writeabc(14,2,'p');
	writeabc(15,2,'q');

/*	writeasc(13,0,10);
	writeasc(13,1,10);
	writeasc(13,2,10);
	writeasc(13,3,10);
	writeasc(13,4,10);
	writeasc(13,5,10);
	writeasc(13,6,10);
	writeasc(13,7,10);
	writeasc(13,8,10);
	writeasc(13,9,10);
	writeasc(13,10,10);
	writeasc(13,11,10);
	writeasc(13,12,10);
	writeasc(13,13,10);
	writeasc(13,14,10);
	writeasc(13,15,11);
//	writeasc(13,16,10);
//	writeasc(13,0,10);
	writeasc(0,0,0x10);
	writeasc(1,0,0x10);
	writeasc(2,0,0x10);
	writeasc(3,0,0x10);
	writeasc(4,0,0x10);
	writeasc(5,0,0x10);
	writeasc(6,0,0x10);
	writeasc(7,0,0x10);
	writeasc(8,0,0x10);
	writeasc(9,0,0x10);
	writeasc(10,0,0x10);
	writeasc(11,0,0x10);
	writeasc(12,0,0x10);
	writeasc(13,0,0x10);
	writeasc(14,0,0x10);
	writeasc(15,0,0x10);
	writeasc(16,0,0x10);
	writeasc(17,0,0x10);
	writeasc(18,0,0x10);
	writeasc(19,0,0x11);
*/


	}

}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -