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

📄 sscreen.c

📁 液晶屏128*64的原程序代码编写程序
💻 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 + -