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

📄 yejing.txt

📁 该程序由ST7920控制器控制液晶显示 //其中单片机的P0.0~P0.7接ST7920的D0~D7
💻 TXT
字号:
//该程序由ST7920控制器控制液晶显示
//其中单片机的P0.0~P0.7接ST7920的D0~D7,P2.7接RS,P2.6接RW,P2.5接E
//用P0.7获取ST7920的忙标志

//源程序1_1如下:
#include<stdio.h>
#include<reg51.h>
#define unchar unsigned char
#define unint unsigned char

sbit bf=P0^7;
sbit rs=P2^7;
sbit rw=P2^6;
sbit e=P2^5;

#define F_TM F0 //自定义标志位,作为中断标志位

//延迟函数
void delay(unsigned int i)     //当i为25时约延时10毫秒       
{
unsigned char j;           //当i为2500时约延时1秒 
   while(i)
   {
    i--;
    for(j=0;j<100;j++) 
    {
     ;
    } 
}
} 


//读忙标志函数
void rbf(void)
{
do
     {
    rs=0;     //设置读忙时的状态
     rw=1;
        delay(1);    //延迟一会儿
        e=1;     //开使能端
}while(bf);     //不忙则跳出 
e=0;      //关使能
}


//写指令函数与写数据函数 wcd(i,n) 
//当i为0的时候为写指令n,i为1时候为写数据n
void wcd(unchar i,unchar n)
{
rbf();
     switch(i)
{
        case 0:rs=0;rw=0;P0=n;break; //设置写指令时的状态
        case 1:rs=1;rw=0;P0=n;break; //设置写数据时的状态
      case 2:rs=1;rs=1;
      }
          //将要写入的值设置为P0的状态 
   e=1;        //开使能,ST7920开始工作
delay(1);
   e=0;        //关使能
}


//初始化液晶界面函数,作用是清屏
void start()
{ 
unchar i;
unchar code a[5]={0x30,0x01,0x02,0x0c,0xC0}; //DDRAM初始化的指令格式   
for(i=0;i<5;i++)
{
    wcd(0,a[i]);          //依次写入指令
}
}


//初始界面函数,作用是开机时显示的数据
void begin()
{
unchar *p;
unchar i,j;
unchar code c[3]={0x91,0x89,0x9c};     //设置写数据的首地址
p="南京秦泰教育科技有限公司-唐老师";    //写入的数据
start();           //初始化
for(j=0;j<2;j++)
{
        wcd(0,c[j]);         //写入首地址
      for(i=0;i<12;i++)        //写入12个字符(6个字),写完后换首地址再写
        {
          wcd(1,*p);         //依次写入数据
          delay(100);
          p++;          //数据地址自增一
        }
}
wcd(0,c[j]);          //写入最后一行首地址0x9c
for(i=0;i<8;i++)
{
        wcd(1,*p);
        delay(100);
        p++;
}
}

//箭头数据函数
void arrowhead(unchar place)
{
unchar code a[]={0x00,0x00,0x00,0x00,0x04,0x00,0x0c,0x00,          //箭头数据
       0x1c,0x00,0x3c,0x00,0x7f,0xff,0xff,0xff,
       0xff,0xff,0x7f,0xff,0x3c,0x00,0x1c,0x00,
       0x0c,0x00,0x04,0x00,0x00,0x00,0x00,0x00};
unchar i ;
unchar code b[]={0x34,0x02,0x30,0x40};         //自建字型的指令格式


for(i=0;i<4;i++)
{
      wcd(0,b[i]);              //将指令依次写入
}
for(i=0;i<32;i++)
{
    wcd(1,a[i]);              //将数据依次写入
}
wcd(0,place);          //显示箭头的首地址
wcd(1,0x00);
wcd(1,0x00);

}


//菜单函数menu()
void menu(void)
{
unchar *p;
unchar i,j;
unchar code c[3]={0x80,0x90,0x88};    //设置显示地址
p="一、公司简介二、进入菜单三、时间设置";
start();
for(j=0;j<3;j++)
{
        wcd(0,c[j]);
      for(i=0;i<12;i++)
        {
          wcd(1,*p);
          delay(100);
          p++;
        }
} 
}


//时间函数time(时,分,秒)
void time(unchar x,unchar y,unchar z)
{
unchar code a[][2]= {'0','0','0','1','0','2','0','3','0','4','0','5','0','6','0','7','0','8','0','9', //时间字符数据
                 '1','0','1','1','1','2','1','3','1','4','1','5','1','6','1','7','1','8','1','9', 
                 '2','0','2','1','2','2','2','3','2','4','2','5','2','6','2','7','2','8','2','9', 
                 '3','0','3','1','3','2','3','3','3','4','3','5','3','6','3','7','3','8','3','9', 
                 '4','0','4','1','4','2','4','3','4','4','4','5','4','6','4','7','4','8','4','9', 
                 '5','0','5','1','5','2','5','3','5','4','5','5','5','6','5','7','5','8','5','9'};     
unchar i,j,m,n;
i=z;         //时分秒的初始化
m=x;
n=y;
while(1)
{
     if(TF1==1)
{ 
   for(;i<60;i++)      //秒的变化
      {  
          wcd(0,0x99);     //时间显示的初地址
          for(j=0;j<2;j++)
          {
           wcd(1,a[m][j]);    //显示时
          }
          wcd(1,':');
          for(j=0;j<2;j++)
          {
           wcd(1,a[n][j]);    //显示分
          }  
          (i%2==0)?wcd(1,':'):wcd(1,' '); //让分与秒之间的冒号闪烁 
          for(j=0;j<2;j++)
          {   
           wcd(1,a[i][j]);    //显示秒   
          }
          if(i==59)
          {
           i=0;      //秒位达到59后清零
           n++;      //秒达到59后分自加一
           if(n>59)
           {
              m++;     //分达到60后时自加一
              if(m>23)
              {
                m=0;    //时位达到24清零
              }
              n=0;     //分位达到60清零
           }
       }    
      }
   TH1=0X63;
      TL1=0XC0;
      TR1=1;          //开始启动定时
}
}
}


//串口接收数据函数receive()
unchar receive()
{
unchar ch;
while(!RI) //当接收标志位为0时(即未产生一个串口接收中断),则等待
{
   ;
}
     ch=SBUF;     //读出数据     
     RI=0;       //清RI 
     return ch;
}


//箭头控制函数arrowcon()
void arrowcon()
{
unchar code a[3]={0x87,0x97,0x8f};
unchar place,k,i;

k=receive();
if(k==0x03||k==0x07||k==0x0b||k==0x0f) //判断四个键(上\下\取消\确认)按下时箭头的位置
{
      for(i=0;i<3;i++)
      {
       wcd(0,a[i]);
       wcd(2,0);
       place=a[i];
       if(P0!=0x20)break;
      }
}
switch(place)
{
      case 0x87:
      if(k==0x03)
        {
          wcd(0,0x87);
    wcd(1,0x20);wcd(1,0x20); 
          arrowhead(0x8f);
        }
        if(k==0x07)
        {
          wcd(0,0x87);
    wcd(1,0x20);wcd(1,0x20);         
          arrowhead(0x97);
        }
        break;
      case 0x97: 
   if(k==0x03)
        {
          wcd(0,0x97);
       wcd(1,0x20);wcd(1,0x20);         
          arrowhead(0x87);
        }
        if(k==0x07)
        {
          wcd(0,0x97);
       wcd(1,0x20);wcd(1,0x20);
          arrowhead(0x8f);
        }
        break;
      case 0x8f:
      if(k==0x03)
        {
          wcd(0,0x8f);
    wcd(1,0x20);wcd(1,0x20);         
          arrowhead(0x97);
        }
        if(k==0x07)
        {
          wcd(0,0x8f);
    wcd(1,0x20);wcd(1,0x20); 
          arrowhead(0x87);
        }
        break;
}
}

void IntTimer1() interrupt 2
{
      F_TM=1;
}


//主函数
void main()
{
TMOD=0x10;      //定时器1工作在工作方式1
   TH1=0x63;      //存入定时初值,定时20ms
   TL1=0xc0;   
   IE=0x88;
IP=0x10;
   SCON=0x50;     //允许接收数据,串口方式1
PCON=0x00;     //24MHz 1200波特率
//TCON=0x00;
TR1=1;          //开始启动定时                              
while(1)
{
   if(F_TM==1)
      {
    begin();
    menu();
    arrowhead(0x87);
       TH1=0X63;
       TL1=0XC0;
    TR1=1;
       time(0,0,0);
             //开始启动定时
    while(1)
    {
     arrowcon(); 
    }
      }
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -