帮我看看 stc12c5a60s2 和lcd12864 的程序 有问题吗?

2019-07-16 05:29发布

#include <reg52.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define clear   0x01  //清屏幕,约1.6ms 清除显示屏幕,把DDRAM位址计数器调整为"00H"
#define home    0x02  //把DDRAM位址计数器调整为"00H",游标回原点,该功能不影响显示DDRAM
#define f_set   0x30  //基本指令集动作
#define dis_on  0x0f  //打开显示,光标,闪烁功能
#define in_mode 0x06  //输入方式,地址增1,光标右移
/*------------LCD-----------*/
sbit P_RS=P1^0;
sbit P_RW=P1^1;
sbit P_E= P1^2;

uchar time[6];         //显示时间数组
uchar str1[] ;
bit flag=0;
/********************************************
简单的送8位数据程序
********************************************/

void bit8_serial_input(uchar ix)
{
uchar i;
P_E=0;

    for(i=0x80;i>=0x01;i=i>>1)
    {
      if((ix&i)==0) P_RW=0; else P_RW=1;
                P_E=1;
    P_E=0;
    }
}
/*---------------------------------------------------------*/
/*-----------MCU写指令到指令寄存器IR--------------*/
void instruct(uchar dat)  //只有3个指令RS,RW不同时为0
{
uchar ch;
P_RS=1;   //选通
ch=0xf8;
bit8_serial_input(ch); //和单片机进行同步5个1;
ch=dat&0xf0; //写入高四位
bit8_serial_input(ch);
ch=dat<<4; ///写低四位
bit8_serial_input(ch);
P_RS=0;  //结束作业
}

/*-------------MCU写数据到数据寄存器DR--------------*/
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;  //结束作业
}
void dis_str(uchar x, uchar y, uchar *str)
{
uchar loc,*p;
uchar xline[5]={0,1,3,2,4};
p=str;
x=xline[x];
instruct(home);
loc=(16*(x-1)+y-1);
if(loc&0x01){
       loc/=2;
       instruct(loc|0x80);
       write_abyte(' ');
       }else{
       loc/=2;
       instruct(loc|0x80);
       }
while(*p){
       write_abyte(*p++);
       }
}
/*--------对液晶显示屏初始化--------------------*/
void initial(void)
{
data uchar i,j;
P_RS=0;           //串行不选通
P_E=0;   //串行方式
instruct(f_set);    //0x30;     //设定使用基本指令集动作,有11条指令
for(i=0;i<30;i++){}
for(i=0;i<250;i++){}
for(i=0;i<250;i++){}
instruct(f_set);
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++){}
   }
instruct(in_mode);     //0x06;    //光标右移、地址增1 方式
for(i=0;i<30;i++){}
instruct(home);

}
//
void init_timer(void)
{
    TMOD=0x01;       //定时器0
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
//*****************************************************************************
//
// The interrupt handler for the first timer interrupt.
//
//*****************************************************************************

//  主函数(程序入口)
void main(void)
{
   int second;
initial();
init_timer();
    dis_str(1,3,"东北农业大学");
dis_str(2,1,"2011年07月23日");
dis_str(4,9,"saturday");
instruct(0x0c); //关闭光标



    for (;;)
    {  
  if(flag==1)
  {  
   flag=0;
   second++;   
            time[0]=second/600%6+'0';
            time[1]=second/60%10+'0';
            time[2]=':';
            time[3]=second/10%6+'0';
            time[4]=second%10+'0';
            time[5]='';
            dis_str(3,5,time);
  }
    }
}
void timer0() interrupt 1
{
uchar t;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
        t++;
if(t%20==0)
{
      flag=1;   
}
         
   
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
hujiulin163
1楼-- · 2019-07-16 06:24
 精彩回答 2  元偷偷看……
hujiulin163
2楼-- · 2019-07-16 11:39
求高手看看要怎么改
hujiulin163
3楼-- · 2019-07-16 14:01
人工置顶
hujiulin163
4楼-- · 2019-07-16 15:56
没人???
hujiulin163
5楼-- · 2019-07-16 20:24
hujiulin163
6楼-- · 2019-07-16 20:45
 精彩回答 2  元偷偷看……

一周热门 更多>