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

📄 ts128647921chuank.c

📁 7921驱动的12864 LCD串行驱动程序 程序注释详细
💻 C
📖 第 1 页 / 共 2 页
字号:
/*********************************************
1.功能:ts12864LCD(内控芯片st7920)串行显示程序
2.I/O脚使用
				io_LCDsid(数据)---------串行数据输入端
				io_LCDsclk(时钟)------串行同步时钟端

3.调试环境:12M晶振(51系列12时钟模式)
			若为其他时钟则作如下修改:
					(1)修改宏定义delaycomm.h
					
					(3)修改宏定义DELAY1US_M

3.程序大小(ROM估计):
				
4.数据大小(RAM估计):

5.运行时间(与调用函数有关):


***********************************************/
				


//#define  __TS128647921CHUANK_DEBUG__     	//调试后,屏蔽此定义
//#ifdef  __TS128647921CHUANK_DEBUG__
//	#include<wywcomm.h>



 	#define uint8 unsigned char
	#define uint16 unsigned int
	#define int16  int

	#include<reg51.h>

	sbit io_LCDsid  = P3^0;    /*串行数据输入端	*/	//液晶显示所用端口
    sbit io_LCDsclk = P3^5;    /*串行同步时钟端	*/

//此模块调用其它模块的外部变量和函数的声明(此程序无)
#include  "E:\ouyw\delaycomm\src\delaycomm.h"
//此模块的宏定义(常数等)
#define DELAY1US_M  _nop_()
//此模块必要的库函数包含(include)
#include<intrins.h>
#include<math.h>
//全局变量(静态或一般)的定义
//以下为函数定义
static void v_write_f(uint8 x)    //写数据函数
  {
 	uint8 i;
 	for(i=8;i>0;i--)
  		{ io_LCDsclk = 0; 
    		if (x  & 0x80 )  io_LCDsid = 1;              
    		else             io_LCDsid = 0;     //将并行数据转换成串行             
		DELAY1US_M;
    	io_LCDsclk = 1;                  //给一个CP脉冲
		DELAY1US_M;

		x<<=1;//x=_crol_(x,1); 好像前一种的效果更好
  		}

 	v_DelayX10us_f(16);

  }



//屏蔽的程序
/********每个位进行 串行-并行转换  送数据到MUC***********
static  uint8 read()
 {
  uint8 i,fan=0x00;
  for(i=0;i<8;i++)
    {io_LCDsclk = 0;
     if(io_LCDsid == 1) fan+=1;
     if(i != 7)fan=fan<<1;
     io_LCDsclk = 1;} 
  return fan;   
}



//*************LCD问忙**********************/ 
static void lcd_mang(void)
{ 
 uint8 i=1;
 while(i)
  { 
    v_write_f(0xfc);  
    io_LCDsclk = 1;
    if(io_LCDsid ==1 )    i=1;
    else               i=0;
    io_LCDsclk = 0;
   }

}
  
//******根据串行协议读出数据或控制指令******/



/*static  uint8 lcd_du(uint8 fang_s)
{ 
  uint8 fan;
  lcd_mang();
  if(fang_s==0) v_write_f(0xfc);	  //H表示读出LCD内部RAM,L表示读出BF与AC
  else          v_write_f(0xfe); 
  fan=read();
  fan=fan|(read()>>4);
  return fan;
 }
 */
 



void v_WriteIns_f(uint8 x)
 {
   lcd_mang();
   v_write_f(0xf8);	 
   v_write_f( x & 0xf0 );		   
   v_write_f( x << 4) ;
 }



static void v_WriteData_f(uint8 x)
 {
  lcd_mang();
   v_write_f(0xfa);	 
   v_write_f( x & 0xf0 );		   
   v_write_f( x << 4) ;
 }


 //**************写入位置转换************
static void LcdWritePlace(uint8 yx)
{
   uint8 i;
   switch(yx>>4)
   { case 0:i=0x80;break;
     case 1:i=0x90;break;
	 case 2:i=0x88;break;
	 case 3:i=0x98;break;
	 default:i=0x80;break;
   }
   v_WriteIns_f((yx&0x0f)+i);
}

//***************初始化**************
void v_LcdWriteCharIni_f(void)
 { 
    v_WriteIns_f(0x30); //写指令,使用基本指令
    v_WriteIns_f(0x01); //写指令,清屏
	v_DelayX10ms_f(1);
//	v_write_f_ins(0,0x02);
    v_WriteIns_f(0x06); //写指令,写入时游标右移
    v_WriteIns_f(0x0c); //写指令,显示开,游标关
 }


//*************光标控制***************
//功能:光标闪烁控制
//说明:输入k    :控制光标闪烁,k=0光标闪烁,k=1光标不闪烁
void v_LcdCursorCommend_f(bit k)
{
   if(k)  v_WriteIns_f(0x0c); //光标关,光标反白禁止
   else   v_WriteIns_f(0x0f); //光标开,光标反白容许
}



//************写入中文字符*************
void v_LcdWriteChar_f(uint8 yx,uint8 code *shuju)
{
   
   LcdWritePlace(yx);
   v_WriteData_f(*shuju);
   shuju++;
   v_WriteData_f(*shuju);
}

//**************************************************************************************
//功能:	显示六位以下的带小数点的数字
//说明:    输入yx(16进制)y表示:指出个LCD中y坐标的位置,    取值范围:0~3。
// 						    x表示:指出个LCD中x坐标的位置,    取值范围:0~7。
//          输入d           d表示:小数点相对数字的显示位置,  取值范围:0~4。超过范围表示不显示。
//			输入shuju 表示:显示任意有符号十进制数,           取值范围:-32768~32767。
//***************************************************************************************
void v_LcdWriteNumber_f(uint8 yx,uint8 dian,int16 shuju)
{
   bit b0=1,b1=0,b2=1;
   uint8 i,xx=5;
  
   LcdWritePlace(yx-3);		//写入坐标
   v_WriteData_f(' '); 
    
   if(shuju < 0)   b0 = 0;	  //判断正负数
   
   shuju=abs(shuju);	   //取绝对值
				   
   while(xx)		       //写入5次数字
   {
     switch(xx)
      {
        case 5: i=shuju/10000;break;
        case 4: i=shuju%10000/1000;break;
        case 3: i=shuju%1000/100;break;
        case 2: i=shuju%100/10;break;
        case 1: i=shuju%10;
       }  
     							
     if(i||(dian==xx-1)||b1||(xx==1))     //判断显示内容
      { 
        if(b2)						   //第一次显示内容

⌨️ 快捷键说明

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