STC12C5A60S2与12864显示

/**************************************************
        功能:12864显示汉字
        单片机:STC12C5A60S2
        晶振:11.0592M
        并行输出
*****************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit E=P3^7;//脉冲使能
sbit RW=P3^6;//读写选择
sbit RS=P3^5;//数据命令选择
sbit rst=P1^0;//12864复位
uchar code table3[]="欲穷千里目";
uchar code table4[]="更上一层楼";
uchar code table1[]="白日依山尽";
uchar code table2[]="黄河入海流";
// 延时ms函数:
void Delayms(uint t)//STC12C5A60S2  1ms
{
    uint i,j;
    for(i=t;i>0;i--)
             for(j=0;j<840;j++);
}

// 12864写命令函数:
void Write12864Command(uchar com)
{ 
                Delayms(10);
       P0=com;//赋值
       E=0;//写命令前三控制线的状态
                Delayms(10);
       RS=0;
       RW=0;
       E=1;//拉高,写命令
                Delayms(10);//延时必须加
       E=0;//写命令后三控制线的状态
                Delayms(10);//延时必须加
       RS=1;
       RW=1;
}
//12864写数据函数:
void Write12864Data( uchar dat)
{
           Delayms(10);
       P0=dat;//赋值
       E=0;//写数据前三控制线的状态
                Delayms(10);
       RS=1;
       RW=0;   
       E=1;//拉高,写数据
           Delayms(10);//延时必须加
       E=0;//写数据后三控制线的状态
                Delayms(10);//延时必须加
       RS=0;
       RW=1;
}    
//12864初始化函数:
void Initialize12864()
{ 
       rst=0;//复位12864
       Delayms(30);
       rst=1;
       Delayms(20);
       Write12864Command(0x30);//功能设定:8位控制方式,使用基本指令
       Write12864Command(0x08);//显示关
       Write12864Command(0x01);//清屏
       Write12864Command(0x06);//地址计数器加一、光标右移
       Write12864Command(0x0c);//显示开
}
//在指定行和列显示汉字
void LCD12864DisplayString( uchar y, uchar x, uchar *pstr)
  //y-行数值0-3,x-列数值0-7,pstr-字符串指针
 //12864可以显示32个汉字(四行每行8个),一个地址对应一个汉字
//可以显示64个ASCII码字符(四行每行16个),一个地址对应两个字符
  //为了实现自动换行功能,这个函数比较繁琐
{
     uchar row,n=0;
     Write12864Command(0x30);//基本指令
     Write12864Command(0x06);//地址计数器自动加以,光标右移
     switch(y)//根据行号选择行地址
     {
                 case 0:row=0x80;break;//第一行首地址
                 case 1:row=0x90;break;//第二行首地址
                 case 2:row=0x88;break;//第三行首地址
                 case 3:row=0x98;break;//第四行首地址
                 default:;
     }
        Write12864Command(row+x);//写地址
     while(*pstr!='\0')
     {
                Write12864Data(*pstr);//写字符
                pstr++;
                n++;//计数
                if((n+x*2)==16)//如果一行写完,继续写第二行
                {
                       if(y==0) Write12864Command(0x90);//写下一行地址
                       else if(y==1) Write12864Command(0x88);//写下一行地址
                       else if(y==2) Write12864Command(0x98);//写下一行地址
                       else ;
                }
                else if((n+x*2)==32)//如果第二行写完,继续写第三行
                {
                        if(y==0) Write12864Command(0x88);//写下一行地址
                        else if(y==1) Write12864Command(0x98);//写下一行地址
                        else ;
                }
                else if((n+x*2)==48)//如果第三行写完,继续写第四行
                {
                        if(y==0) Write12864Command(0x98);//写下一行地址
                        else ;
                }
                else ;
    }
}    
//清屏
void Clear12864Screen()
{
        Write12864Command(0x01);//清屏
        Write12864Data(0x00);//清屏
}
void main()
{
        uchar i;
        Delayms(100);
        Initialize12864();
        Clear12864Screen();
        while(1)
		{
        Write12864Command(0x80);
        for(i=0;i<11;i++)
        {
                Write12864Data(table1[i]);
                Delayms(200);
        }
		Clear12864Screen();
        Write12864Command(0x90);
        for(i=0;i<11;i++)
        {
                Write12864Data(table2[i]);
                Delayms(200);
        }
		Clear12864Screen();
        Write12864Command(0x88);
        for(i=0;i<12;i++)
        {
                Write12864Data(table3[i]);
                Delayms(200);
        }
		Clear12864Screen();
        Write12864Command(0x98);
        for(i=0;i<12;i++)
        {
                Write12864Data(table4[i]);
                Delayms(200);
        }
		Clear12864Screen();
        LCD12864DisplayString(0, 0, "--登鹳雀楼");
        Delayms(4000);
		Clear12864Screen();
        }
                
}
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值