📄 st7920drive.c
字号:
/******************************************************************************
模块名称:st7920 并行方式驱动12864液晶驱动
功能概要:st7920显示驱动
液晶型号: 生产厂家: 驱动芯片:st7920
******************************************************************************/
#include <reg52.h>
#include <absacc.h>
#define uint unsigned int
#define uchar unsigned char
#define x1 0x80
#define x2 0x88
#define y 0x80
#define comm 0
#define dat 1
#define ADC 0x7FFF
unsigned char bdata flag;
sbit chang_over=flag^2;
static unsigned char data a[8];
sbit RS = P3^1; //H=data; L="command";
sbit RW = P3^4; //H=read; L="write";
sbit E = P3^5; //input enable;
sbit PSB= P1^3; //H=并口; L="串口";
sbit RST= P3^0; //Reset Signal 低电平有效
sbit busy=P2^7; //lcd busy bit
void wr_lcd (uchar dat_comm,uchar content);
void chk_busy (void);
void delay (uint us);
uchar code tab1[]=
{
" 北京理工大学 " //0x80
" 学生毕业设计 " //0x90
" 应用物理系 " //0x88
" 测试程序 " //0x98
};
uchar code tab2[]=
{
" 交流电桥平衡 " //0x80
" " //0x90
" 指示仪的设计 " //0x88
" 二零零八 " //0x98
};
uchar code tab3[]=
{
"频率 :0.000 kHz" //0x80
"幅值1 : 0.00 V" //0x90
"相位差: 00.00 " //0x88
"幅值2 : 0.00 V" //0x98
};
uchar code pinlv[]= {"频率 :kHz"};
static unsigned char data p[3];
uchar code xiangwei[]={"相位差:"};
static unsigned char data x[3];
uchar code fudu1[]= {"幅值1 :V"};
static unsigned char data f1[2];
uchar code fudu2[]= {"幅值2 :V"};
static unsigned char data f2[4];
/******************************************************************************************
* 函数名称 :ADC转换子程序
* 功能描述 :
* 修改说明 :
*****************************************************************************************/
unsigned char adc_change(void)
{
unsigned char change_over;
XBYTE[ADC]=0;
do flag=P1;
while(change_over==1);
a[1]=XBYTE[ADC];
}
/******************************************************************************************
* 函数名称 :脉冲宽度测量
* 功能描述 :
* 修改说明 :
*****************************************************************************************/
/******************************************************************************************
* 函数名称 :初始化液晶屏
* 功能描述 :
* 修改说明 :
******************************************************************************************/
void init_lcd (void)
{
RST = 1;
PSB = 1;
wr_lcd(comm,0x30); /*30---基本指令动作*/
wr_lcd(comm,0x01); /*清屏,地址指针指向00H*/
wr_lcd(comm,0x06); /*光标的移动方向*/
wr_lcd(comm,0x0c); /*开显示,关游标*/
}
/******************************************************************************************
* 函数名称 :chn_disp
* 功能描述 : 显示汉字或字符
* 修改说明 :
******************************************************************************************/
void chn_disp(uchar code *chn)
{
uchar i,j;
wr_lcd(comm,0x30);
wr_lcd(comm,0x80);
for(j=0;j<4;j++)
{
for(i=0;i<16;i++)
wr_lcd(dat,chn[j*16+i]);
}
}
/******************************************************************************************
* 函数名称 :clrram
* 功能描述 : 清DDRAM
* 修改说明 :
******************************************************************************************/
void clrram(void)
{
wr_lcd(comm,0x30);
wr_lcd(comm,0x01);
}
/******************************************************************************************
* 函数名称 :wr_lcd
* 功能描述 :通过dat和comm位判断写入指令还是数据
* 修改说明 :
******************************************************************************************/
void wr_lcd(uchar dat_comm,uchar content)
{
chk_busy ();
if(dat_comm)
{
RS = 1; //data
RW = 0; //write
}
else
{
RS = 0; //command
RW = 0; //write
}
P2=content; //output data or comm
E = 1;
;
E = 0;
}
/******************************************************************************************
* 函数名称 :chk_busy
* 功能描述 :判忙
* 修改说明 :
******************************************************************************************/
void chk_busy(void)
{
P2 = 0xff;
RS = 0;
RW = 1;
E = 1;
while(busy==1);
E = 0;
}
/******************************************************************************************
* 函数名称 :
* 功能描述 :
* 修改说明 :
******************************************************************************************/
void delay(uint us) //delay time
{
while(us--);
}
void delay2(unsigned char cnt)
{
unsigned char i;
while(cnt--!=0)
for(i=10;i!=0;i--);
}
/******************************************************************************************
* 函数名称 :
* 功能描述 :
* 修改说明 :
******************************************************************************************/
void delay1(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<15;j++)
delay(1);
}
/******************************************************************************************
* 函数名称 :
* 功能描述 :
* 修改说明 :
******************************************************************************************/
void main()
{
SP=0x5f;
init_lcd();
chn_disp(tab1);
delay1(5000);
clrram();
chn_disp(tab2);
delay1(2000);
clrram();
chn_disp(tab3);
delay1(2000);
clrram();
wr_lcd(comm,0x34);
delay(2);
wr_lcd(comm,0x02);
delay(2);
wr_lcd(comm,0x30);
wr_lcd(comm,0x01);
p[0]=0x31;
p[1]=0x32;
p[2]=0x33;
p[3]=0x34;
x[0]=0x31;
x[1]=0x32;
x[2]=0x33;
x[3]=0x34;
f1[0]=0x31;
f1[1]=0x32;
f1[2]=0x33;
f2[0]=0x31;
f2[1]=0x32;
f2[2]=0x33;
for(;;)
{int i;
wr_lcd(comm,0x80);//第一行显示频率
for(i=0;i<7;i++)
{
wr_lcd(dat,pinlv[i]);
}
wr_lcd(dat,p[3]);
wr_lcd(dat,0x2E);//小数点
wr_lcd(dat,p[2]);
wr_lcd(dat,p[1]);
wr_lcd(dat,p[0]);
wr_lcd(dat,0x20);//空白
wr_lcd(dat,pinlv[7]);
wr_lcd(dat,pinlv[8]);
wr_lcd(dat,pinlv[9]);//kHz
wr_lcd(comm,0x90);//第二行显示相位
for(i=0;i<7;i++)
{
wr_lcd(dat,xiangwei[i]);
}
wr_lcd(dat,0x20);
wr_lcd(dat,x[3]);
wr_lcd(dat,x[2]);
wr_lcd(dat,0x2E);//小数点
wr_lcd(dat,x[1]);
wr_lcd(dat,x[0]);
wr_lcd(dat,0x20);//空白
wr_lcd(dat,0x20);//空白
wr_lcd(dat,0x20);//空白
wr_lcd(comm,0x88);//第三行显示幅度
for(i=0;i<7;i++)
{
wr_lcd(dat,fudu1[i]);
}
wr_lcd(dat,0x20);
wr_lcd(dat,0x20);
wr_lcd(dat,f1[2]);
wr_lcd(dat,0x2E);//小数点
wr_lcd(dat,f1[1]);
wr_lcd(dat,f1[0]);
wr_lcd(dat,0x20);
wr_lcd(dat,0x20);
wr_lcd(dat,fudu1[7]);
wr_lcd(comm,0x98);//同上
for(i=0;i<7;i++)
{
wr_lcd(dat,fudu2[i]);
}
wr_lcd(dat,0x20);
wr_lcd(dat,0x20);
wr_lcd(dat,f2[2]);
wr_lcd(dat,0x2E);//小数点
wr_lcd(dat,f2[1]);
wr_lcd(dat,f2[0]);
wr_lcd(dat,0x20);
wr_lcd(dat,0x20);
wr_lcd(dat,fudu2[7]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -