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

📄 st7920.c

📁 一些关于显示器st4920的驱动程序(并行方式)
💻 C
📖 第 1 页 / 共 3 页
字号:
/***************************************************/ 
/*设计:焦进星 */ 
/*
12864(ST7920)串口C51驱动程序,11.0592M晶振 

本程序我已经测试通过了。欢迎大家提出意见。  

引脚定义:RS(CS)=====>PB0
          RW(SID)====>PB1
          EN(SCLK)===>PB2
    D0=========>PA0
          :
          :
    D7=========>PA7
    PSB为硬件控制,
	接高电平为8位或4位的并行模式,接低电平为串行模式
****************************************************/
/***************************************************/ 
#include <AT89X52.H> 
#include <intrins.h>



#define uint     unsigned int 
#define uchar    unsigned char
#define uint8_t  unsigned char
#define uint16_t unsigned int
#define nop()    _nop_()
#define left     0x18
#define right    0x1c

/******************************
12864(ST7920)引脚定义
******************************/ 
sbit CS=P1^0; 
sbit SID=P1^1; 
sbit SCLK=P1^2; 

/*******************************
延时
*******************************/
void Delay(uint16_t ms)
{
    uint8_t j;
    for(; ms>0; ms--)
    for(j=100; j>0; j--)
  {
     nop();
     nop();
  }
}
/**********************************
写器件命令
***********************************/
void send_command(uchar command_data) 
{ 
uchar i; 
uchar i_data; 
i_data=0xf8; 	   //11111000
CS=1; 
SCLK=0; 
for(i=0;i<8;i++) 
{ 
SID=(bit)(i_data&0x80); 
SCLK=0; 
SCLK=1; 
i_data=i_data<<1; 
} 

i_data=command_data; 
i_data&=0xf0; 
for(i=0;i<8;i++) 
{ 
SID=(bit)(i_data&0x80); 
SCLK=0; 
SCLK=1; 
i_data=i_data<<1; 
} 

i_data=command_data; 
i_data<<=4; 
i_data&=0xf0; 
for(i=0;i<8;i++) 
{ 
SID=(bit)(i_data&0x80); 
SCLK=0; 
SCLK=1; 
i_data=i_data<<1; 
} 
CS=0; 
} 
/*****************************
写器件数据
******************************/
void send_data(uchar command_data) 
{ 
uchar i; 
uchar i_data;
i_data=0xfa; 	   //11111010 11111ABC A为数据传送方向控制:H表示数据从LCD到MCU,L表示数据从MCU到LCD B为数据类型选择:H表示数据是显示数据,L表示数据是控制指令C固定为0

CS=1; 
for(i=0;i<8;i++) 
{ 
SID=(bit)(i_data&0x80); //10000000
SCLK=0; 
SCLK=1; 
i_data=i_data<<1; 
}
 
i_data=command_data; 
i_data&=0xf0; 
for(i=0;i<8;i++) 
{ 
SID=(bit)(i_data&0x80); 
SCLK=0; 
SCLK=1; 
i_data=i_data<<1; 
} 

i_data=command_data; 
i_data<<=4; 
i_data&=0xf0; 
for(i=0;i<8;i++) 
{ 
SID=(bit)(i_data&0x80); 
SCLK=0; 
SCLK=1; 
i_data=i_data<<1; 
} 
CS=0; 
}
/******************************
设置行
*******************************/
void set_line(uchar y,uchar xx) 
{

 if(y == 0)
 {
   send_command((0x80+xx)); 
 }
 if(y == 1)
 {
  send_command((0x90+xx));
 }
 if(y == 2)
 {
  send_command((0x88+xx));
 }
 if(y == 3)
 {
  send_command((0x98+xx));
 }
}
/*************************************************/
/***************************
屏幕闪烁
***************************/
void Lcd_flash(uint16_t delay_t,uint8_t times)
{
   uint8_t j;
  for(j=0;j<times;j++)
  {
  send_command(0x08);  //关闭显示
  Delay(delay_t);  //软件延时
  send_command(0x0c);  //开显示
  Delay(delay_t);  //软件延时
  }
}
/*************************************************/
/***************************
屏幕移动
***************************/
void Move(uint8_t step,uint8_t dirction,uint16_t time)
{
   uint8_t i;
  for(i=0;i<step-1;i++)       //移动的步数
  {
     send_command(dirction);      //文字移动方向                                    
         Delay(time);             //控制移动时间
  }
}
/***************************
中英文混合显示
***************************/
 void disp_str(uchar line,uchar xx,unsigned char *p)
{
	unsigned char i=0; 

    set_line(line, xx);

	while(*p)
	{					  
	send_data(*p);
          p++;	
		  i++;
		 if(i==16)
		 { i=0;
		   line++; 
		   line%=4;
		   set_line(line, 0);
		 }
	}

}

/************************
设置字符方式
************************/
void Set_Text() 
{ 

send_command(0x30); /*功能设置:一次送8位数据,基本指令集*/ 

send_command(0x04); /*点设定:显示字符/光标从左到右移位,DDRAM地址加1*/ 

send_command(0x0c);   /*显示设定:开显示,不显示光标,当前显示位不反白闪动*/  
 }
/*****************************
清文本区
*****************************/
void LcmClearTXT( void )
{			
unsigned char i;

send_command(0x30); /*8BitMCU,基本指令集合*/

send_command(0x02); /*DDRAM地址归位*/  

send_command(0x80); /*把显示地址设为0X80,即为第一行的首位*/ 
 for(i=0;i<64;i++)
        send_data(0x20);
}

/***************************
清除画图区
***************************/
void LcmClearBMP( void )
{
     unsigned char i,j;
     send_command(0x34);      //8Bit扩充指令集,即使是36H也要写两次
     send_command(0x36);      //绘图ON,基本指令集里面36H不能开绘图
     for(i=0;i<32;i++)            //12864实际为256x32
     {
           send_command(0x80|i);      //行位置
           send_command(0x80);        //列位置
           for(j=0;j<32;j++)          //256/8=32 byte
                send_data(0);
     }
}
/*************************
清屏(所有)
**************************/
void lcd_clean() 
{
LcmClearBMP();
LcmClearTXT();
}

 uchar code my1[]=
{/*--  调入了一幅图像:D:\My Documents\SPLC501Music\pic\ON_03.BMP  --*/
/*--  宽度x高度=128x64  --*/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFC,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFD,0x7F,0xC1,0xC1,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x80,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x90,0x04,0x00,0x00,0x07,0xFF,0xFF,0xFE,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x93,0x67,0xFF,0xFF,0x73,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x91,0x46,0x34,0xA5,0x53,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x95,0xD5,0xD3,0x9D,0xD3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x94,0x94,0x17,0xBC,0x13,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x96,0x35,0xF4,0xB7,0x63,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

⌨️ 快捷键说明

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