📄 st7920.c
字号:
/*本程序为液晶模块ST7920的驱动程序*/
#include "config.h"
//全局变量声明
const uint8 RowNum[4]={0x80,0x90,0x88,0x98}; //定义每一行在LCM中的RAM首地址
//**************************************************
void Delay(uint16 n)
{
int i;
for (i=n;i>0x00;i--);
}
/*********串行传送一字节数据************************/
void SendByte(uint8 dat)
{
int i;
for (i=0;i<8;i++)
{
IO1CLR=ST7920_Clk; //SCK=0
if((dat & 0x80)!=0)
IO1SET=ST7920_Sda; //SID=1
else
IO1CLR=ST7920_Sda; //SID=0
Delay(5);
IO1SET=ST7920_Clk; //SCK=1;
dat = (dat<<1);
}
}
/****************写控制指令****************************/
void SendCmd(uint8 dat)
{
SendByte(0xf8);
SendByte(dat & 0xf0);
SendByte((dat<<4)&0xf0);
}
/************写显示数据;也可以写一个单字节字符********/
void SendDat(uint8 dat)
{
SendByte(0xfa);
SendByte(dat & 0xf0);
SendByte((dat<<4)&0xf0);
}
/********显示单字符***
x_addr 显示RAM地址
data 字符值
*******************************************/
void DispChar(uint8 x_addr, uint8 data)
{
SendCmd(x_addr);
SendDat(data);
}
/********显示字符口串,多余位置以空格填补***
x_addr 显示RAM地址
p 指向字符串的指针
*******************************************/
void DispChars(uint8 Addr,uint8 *p,uint8 Num)
{
uint8 i;
SendCmd(Addr);
for(i=0;i<Num;i++)
SendDat(*(p+i));
}
void Disp(uint8 x_addr, uint8 *p)
{
uint8 i,flag=0;
SendCmd(x_addr);
for(i=0;i<14;i++)
{
if(*(p+i)=='\0')
flag=1;
if(flag==0)
SendDat((uint8)*(p+i));
else
SendDat(' ');
}
}
/***************写一个汉字到 LCD 屏指定位置*************
x_add 显示 RAM 地址
high/low 为显示汉字的编码
****************************************************/
void Display(uint8 x_add,uint8 high,uint8 low)
{
SendCmd(x_add);
SendDat(high);
SendDat(low);
}
/****************************************************************************
* 名称:PreDisp()
* 功能:显示预处理
* 入口参数:data 输入输出的数据
*p 对应的字符串指针
* 出口参数:无
****************************************************************************/
void PreDispIndoorCall(uint8 *data,uint8 *p)
{
uint8 i;
for(i=0; i<16; i++)
{
if((0x40&(*(data+i)))!=0)
*(p+i)=0x08;
else
*(p+i)=0x2d;
}
}
/****************************************************************************
* 名称:PreDisp()
* 功能:显示预处理
* 入口参数:data 输入输出的数据
*p 对应的字符串指针
* 出口参数:无
****************************************************************************/
void PreDispOutdoorCallUp(uint8 *data,uint8 *p)
{
uint8 i;
for(i=0; i<16; i++)
{
if((0x20&(*(data+i)))!=0)
*(p+i)=0x08;
else
*(p+i)=0x2d;
}
}
/****************************************************************************
* 名称:PreDisp()
* 功能:显示预处理
* 入口参数:data 输入输出的数据
*p 对应的字符串指针
* 出口参数:无
****************************************************************************/
void PreDispOutdoorCallDown(uint8 *data,uint8 *p)
{
uint8 i;
for(i=0; i<16; i++)
{
if((0x10&(*(data+i)))!=0)
*(p+i)=0x08;
else
*(p+i)=0x2d;
}
}
void lcdclr(void)
{ uint8 lcdlow,lcdlie;
//清屏
for(lcdlow=0;lcdlow<4;lcdlow++)
for(lcdlie=0;lcdlie<8;lcdlie++)
Display(RowNum[lcdlow]+lcdlie,0xA1,0xA0); //0xA1A0为空格
}
//*****************************************************
void InitLcm(void) //初始化 LCM
{
IO1DIR|=(ST7920_Cs|ST7920_Clk|ST7920_Sda|ST7920_Rst);
IO1SET=ST7920_Cs; // 高电平使能
IO1CLR=ST7920_Rst;
Delay(0xff);
IO1SET=ST7920_Rst;
Delay(0xff);
SendCmd(0x30); //功能设置:一次送 8 位数据,基本指令集
SendCmd(0x04); //点设定 :显示字符/ 光标从左到右移位,DDRAM 地址加一
SendCmd(0x0f); //显示设定:开显示 ,显示光标,当前显示位反白闪动
SendCmd(0x01); //清DDRAM
SendCmd(0x02); //*DDRAM 地址归位
SendCmd(DDRAM_0); //DDRAM
SendCmd(off_cursor); //关光标
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -