📄 sscreen.c
字号:
/*
pin: 1--GND 2--+5V 3--NC (对比度 背光) 4--RS 5--R/W 6--E
7~14==D0~D7
15--PSB 16--NC 17--/rst 18--NC
19--A 20--K (19,20可能是背光)
1、 initial()在运行前对液晶显示屏初始化
2、 instruct(uchar x) 将x作为命令送给液晶显示屏
x==0x01 清屏幕 约1.6ms
x==0x02 地址和光标归零 HOME
0x06 光标右移、地址增加方式
0x09 闪烁
0x0a 显示光标
0x0c 显示内容
0x0f 内容、光标、闪烁全显示
3、 write_abyte(uchar x)
3.1 显示字母数字1--9 a--z
地址自动增1
可显示四行,分别为1 3 2 4行
3.2 显示汉字
调用两次,如下:
p=&"汉";
hanzi=*p; //两个字节
ch=hanzi>>8; cl=hanzi; ch为高字节 cl为低字节
write_abyte(ch);
write_abyte(cl);
/*
*/
#pragma LARGE// 外部存储器
#include <absacc.h>
#include <reg52.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define command P1
#define data1 P1
#define clear 0x01 //清屏幕,约1.6ms
#define home 0x02 //光标回零(左上角)/
#define f_set 0x30 //并行、基本指令 ?????
#define dis_on 0x0f //打开显示,光标,闪烁功能
#define in_mode 0x06 //输入方式,地址增1,光标右移
#define C_ad 5
sbit P_RS=P0^7;
sbit P_RW=P0^6;
sbit P_E= P0^5;
//sbit P_PSB=P0^1;
bdata uchar ab,bc;
sbit abit0=ab^0;sbit abit1=ab^1;sbit abit2=ab^2;sbit abit3=ab^3;
sbit abit4=ab^4;sbit abit5=ab^5;sbit abit6=ab^6;sbit abit7=ab^7;
//idata uchar string[50];
data uchar str2[6];
/*---------------------------------------------------------*/
void bit8_serial_input(uchar ix)
{
data uchar i,j,nc;
P_E=0; //clk=0; P_E为sclk P_RW为 sid
ab=ix;
for(i=0;i<8;i++){
P_RW=abit7; //din=abit7;
ab<<=1;
P_E=1;
for(j=0;j<10;j++)nc=0; //延时
P_E=0;
}
}
/*---------------------------------------------------------*/
void instruct(uchar dat)
{
data uchar ch;
P_RS=1; //选通
ch=0xf8; ///1111 1110 按照时序前五位必须为1 六七位任意 八位为0
bit8_serial_input(ch); //sid前八位
ch=dat&0xf0; //连接dat与0xf0 取higher data
bit8_serial_input(ch);
ch=dat<<4; //左移动4位 取lower data
bit8_serial_input(ch); //80送到液晶里表示什么意义 instruct中无此命令
P_RS=0; //结束作业 1 byte发完
}
void write_abyte(uchar dat)
{
data uchar ch;
P_RS=1; //读数据--选通 选通
ch=0xfa; //RS=1 RW=0;
bit8_serial_input(ch);
ch=dat&0xf0; //RS=1 RW=0;
bit8_serial_input(ch);
ch=dat<<4;
bit8_serial_input(ch);
P_RS=0; //结束作业
}
/*
写一个汉字到x,Y坐标处其中X为8列y为4行
*/
void write_word(uint w) //w为双字节变量
{
data uchar ch,cl;
ch=w>>8;
cl=w; //w右移8位给ch 那cl直接取 w 低8位
write_abyte(ch);
write_abyte(cl);
}
dis_hz(uchar x, uchar y, uint *p_hz) //单个汉字、字符显示、两个字母
{
data uchar loc;
data uint hz;
code uchar xline[5]={0,1,3,2,4};
x=xline[x];
instruct(home); //光标home
loc=((x<<3)+y-9)|0x80; //??"|"
instruct(loc); hz=*p_hz; //loc 不同导致开始显示层数不同?????
write_word(hz);
}
dis_hz_str(uchar x, uchar y, uint *p_hz) //功能 汉字字符串显示
{
data uchar loc;
data uint *p;
code uchar xline[5]={0,1,3,2,4};
x=xline[x];
instruct(home);
loc=((x<<3)+y-9)|0x80;
instruct(loc);
p=p_hz;
while(*p){
write_word(*p++);
}
}
/*
显示字母数字在x,y处
*/
void dis_str(uchar x, uchar y, uchar *str) // 多个数字字母 显示
{
data uchar loc,*p;
code uchar xline[5]={0,1,3,2,4};
p=str;
x=xline[x];
instruct(home);
loc=(16*(x-1)+y-1); //loc=16*(1-1)+10-1=9 如何
if(loc&0x01){
loc/=2;
instruct(loc|0x80);
//ch=' '; //字符串前加空格(0x20 )
write_abyte(' ');
}else{
loc/=2;
instruct(loc|0x80);
}
while(*p){
write_abyte(*p++); //str为字符串 p为字符串写的时候一个一个字写
}
}
void initial(void) //光标置左上角
{
data uchar i,j;
P0=0xff;
P_RS=0; //串行--不选通
//P_PSB=0;
P_E=0; //串行方式
instruct(f_set); //0x30; //8位并行接口 基本指令 用串行方式 这句是不是没用
for(i=0;i<30;i++){}
for(i=0;i<250;i++){} //等待液晶屏反应
for(i=0;i<250;i++){}
instruct(f_set); //0x30; //8位并行接口 基本指令
for(i=0;i<30;i++){}
for(i=0;i<250;i++){}
for(i=0;i<250;i++){}
instruct(dis_on); //0x0f); //开启屏幕 光标 闪烁
for(i=0;i<30;i++){} //维持高电平 等待液晶反应
instruct(clear); //0x01); //清屏幕 clear
for(j=0;j<10;j++){
for(i=0;i<250;i++){} //1.6ms
}
instruct(in_mode); //0x06); //光标右移、地址增1 方式 液晶屏接受信息的形式
for(i=0;i<30;i++){}
instruct(home); //光标复位(行首)
}
/*---------------------------------------------------------*/
//void itoa(int x,unsigned char *str2)
void itoa(int x)
{ //功能 二进制转为ascii码
data unsigned int n;
data unsigned char chn,*p,*p2,str1[5];
data unsigned char i,j;
p2=str2;
if(x<0){
*p2++='-';
x=-x;
}
n=x;
p=&str1;
j=0;
while(n!=0){
chn=n%10;
n=n/10;
*p++=chn+'0';
j++;
}
if(j!=0){
p--;
for(i=0;i<j;i++)*p2++=*p--;
}
else *p2++='0';
*p2=0;
return;
}
/*---------------------------------------------------------*/
/*----------------------------------------------------*/
void main(void)
{
data uchar ch,i,j,count,min;
data uint str1[10];
//code uint alpha[6]={0xc5b7,0xd1f4,0}; //ghijklmnopqrstuvwxyz"}; //uint hz_tbl[12]={"一","二","三","四","五","六","七","八","九","十"} ;
code uint *Va={"交流电压"};
code uint *Ia={"直流电流"};
code uint *Ta={"电解液温度"};
code uint *mk={"i love this exci"};
code uint *hmk={"ting game very m"};
code uint *fhmk={"uch"};
code uint *Ha={"时间"};
code uint *me={"东北农业大学"} ;
code uint *lme={"落善良勇敢的人们"} ;
//uint name=&"一";
P_RS=0;
initial();
/*
instruct(0x34); 做反显示
instruct(0x04);
write_abyte('1');
write_abyte('2');
instruct(0x30);
instruct(0x0c);
ch=0;
*/
for(i=0;i<10;i++)str1[i]=0;
strcpy(str1,Va);
dis_hz_str(1,1,str1); dis_str(1,10,"380.0"); dis_str(1,16,"V");
for(i=0;i<10;i++)str1[i]=0;
strcpy(str1,Ia);
dis_hz_str(2,1,str1); dis_str(2,10,"100.0"); dis_str(2,16,"A");
for(i=0;i<10;i++)str1[i]=0;
strcpy(str1,Ta);
dis_hz_str(3,1,str1); dis_str(3,11,"20.0"); dis_hz(3,8,"℃");
for(i=0;i<10;i++)str1[i]=0;
strcpy(str1,Ha);
dis_hz_str(4,1,str1); dis_str(4,10,"00:00"); dis_str(4,16,"S");
for(i=0;i<10;i++)str1[i]=0;
strcpy(str1,me);
dis_hz_str(1,1,str1);
for(i=0;i<10;i++)str1[i]=0;
strcpy(str1,lme);
dis_hz_str(2,1,str1);
/*for(i=0;i<10;i++)str1[i]=0;
strcpy(str1,mk);
dis_str(1,1,str1);
for(i=0;i<10;i++)str1[i]=0;
strcpy(str1,hmk);
dis_str(2,1,str1);
for(i=0;i<10;i++)str1[i]=0;
strcpy(str1,fhmk);
dis_str(3,1,str1); */
ch=0;count=0; min=0; instruct(0x0c);
while(1){
for(i=0;i<200;i++){
for(j=0;j<250;j++){}
for(j=0;j<250;j++){}
for(j=0;j<250;j++){}
for(j=0;j<250;j++){}
for(j=0;j<250;j++){}
for(j=0;j<250;j++){}
for(j=0;j<250;j++){}
for(j=0;j<250;j++){}
for(j=0;j<250;j++){}
for(j=0;j<250;j++){}
for(j=0;j<250;j++){}
}
count++;
if(count>=60){
count=0; min++;
if(min>=60)min=0;
}
itoa(min); //itoa函数
dis_str(4,10," ");
if(min<10)dis_str(4,11,str2); else dis_str(4,10,str2);
itoa(count); // //itoa函数
dis_str(4,13," ");
if(count<10) dis_str(4,14,str2); else dis_str(4,13,str2);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -