📄 st7920.c
字号:
/***************************************************/
/*设计:焦进星 */
/*
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 + -