24Mhz下,c805f020+1602显示程序

本文介绍了一个基于C8051F020微控制器的1602A LCD显示模块的控制程序实现。该程序通过定义LCD控制函数实现了初始化、发送命令、显示字符等功能,并通过主循环展示了如何在LCD上显示特定字符串和进行自动滚动显示。
摘要由CSDN通过智能技术生成

#include "C8051F020.h"
#include"string.h"
#include"stdio.h"
#include <intrins.h> 
typedef unsigned char uchar;
typedef unsigned int uint;
//typedef unsigned long ulong;
//#define toup sendc(0x14)  //lcd光标右移
//#define todown sendc(0x10)//lcd光标左移
//#define curshow sendc(0x0f)//显示光标
//#define home sendc(0x02)//移到首行
uchar code lcdbuf1[]={"my lady gaga"} ;
uchar code lcdbuf2[]={"my friend!"} ;
#define cls write_code(0x01)//清屏
#define lcd_data P7 //数据接口

//sbit lcdrs=P1^2; //硬件控制接口
//sbit lcdrw=P1^1;
//sbit lcdcs=P1^0;

sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;

 /************************系统配置************************/
void config (void)  
{ int n = 0;
    //看门狗禁止
 EA=0;   //关闭中断 ,中断的关闭是为了保证两条操作码能在4个周期内完成
    WDTCN = 0xDE;  
    WDTCN = 0xAD;
    EA=1;         //恢复中断
    XBR0 = 0x00; 
    XBR1 = 0x00; 
    XBR2 = 0x40; //交叉开关使能,使得P0-P3口能输出  
    P0MDOUT = 0x00;
    P1MDOUT = 0x00;
 P2MDOUT = 0x00;
 P1MDIN=0x00;
 P74OUT = 0x00;

 
 OSCXCN = 0x67;//外部晶振24MHZ
   for (n = 0; n < 255; n++) ; //等待1ms以上,确保时钟稳定
   while ( !(OSCXCN & 0x80) );  //等待外部时钟稳定
 OSCICN = 0x88;        //选择外部晶振作为系统时钟源,允许时钟丢失检测
 
}  
/*****************延迟1ms*time,这不是一个精确值************/
void delay1ms(uint time) 
{         
 uint i;
 uint j;
 for (i=0;i<time;i++)
 {
  for(j=0;j<500;j++);
 }
}
 
/****************************1602A读忙状态函数**************************/
uchar lcd_readstatus(void)
{ lcd_data=0x80;    //检测忙信号比较重要 
  //lcdrs=0;
  //lcdrw=1;   
   //lcdcs=0;    //若晶振速度太高可以在这后加小的延时   
  //lcdcs=0;  //延时
  //lcdcs=1;
  P5=0x02;
  P5=0X02;
  P5=0X06;
  delay1ms(200);    
  //while(lcd_data & 0x80);//检测忙信号     
  return(lcd_data);
}

/**********************给lcd送命令*************/
void write_code(uchar c) 
{             
 EA=0;
 lcd_readstatus(); //查忙
 lcd_data=c;
 //lcdrs=0;  //选择指令寄存器
 //lcdrw=0;  //写操作
 //lcdcs=1;
 P5=0X04;
    delay1ms(15);
 //lcdcs=0;
 P5=0X00;
 EA=1;
}

 /********************给lcd送数据 *****************/
void write_data(uchar c) 

 EA=0;
 lcd_readstatus(); //查忙
 lcd_data=c;
 //lcdrs=1; //选择数据寄存器
 //lcdrw=0;  //写操作
 //lcdcs=1;
 P5=0X05;
    delay1ms(15);
 //lcdcs=0;
 P5=0X01;
 EA=1;
}
 

/*********************lcd显示初始化*************/
void lcd_init(void)   
{
 lcd_data=0;
 //delay1ms(2000);
 write_code(0x38);//三次显示模式设置,不检测忙信号
 //delay1ms(2000);
 write_code(0x38);
 //delay1ms(2000);
 write_code(0x38);
 //delay1ms(2000);
 write_code(0x38);//8位,2行,5*7字体
    //delay1ms(2000);
    write_code(0x08);//显示关闭
    //delay1ms(2000);
    write_code(0x01);//显示清屏
 //delay1ms(2000);
 write_code(0x06);//增量方式,现不移动
 //delay1ms(2000);
 write_code(0x0c);//显示开,光标关;不闪 
//delay1ms(1);
 //delay1ms(2000);
}


 /********************设置光标位置,X是列号,Y是行号*********************/
 void display_xy(uchar x,uchar y)
{
      //y &= 0x1;
  // x &= 0xF;//限制X不能大于15,Y不能大于1
  if(y==1)
  x+=0x40;
  x+=0x80;
  write_code(x);//wogaide difang
  //write_data(x);

}

/*****************在具体位置显示单个字符,x是列号,y是行号******************/
void display_char(uchar x,uchar y,uchar dat)
{
   display_xy(x,y);
   write_data(dat);
}

/*******************在具体位置显示字符串,x是列号,y是行号****************/
void display_string(uchar x,uchar y,uchar *s)
{
   display_xy(x,y);
   while(*s)
   {
     write_data(*s);
  s++;
 }
}


/***************主程序*************************/
void main()
{  xdata uchar i;
   uchar *s;
 //s=&lcdbuf1[0];
 config();
 lcd_init();
   while(1){
   display_string(2,0,lcdbuf1);

  /*  while(1)
 {
 
   if(key1==0)
    {  
       display_string(2,0,lcdbuf1);  
    
  }
   if(key2==0)
  {
          display_string(1,1,lcdbuf2);
   }
   if(key3==0)
  {
          cls;
   }
    if(key4==0)
  {
         for(i=0;i<11;i++)
    {
      display_char(i+2,0,*(s+i));
    }
   }

     }*/
/*******************在第一个行显示16个字母************
 
   
    //cls;//清屏
    //write_code(0x40); //设置显示地址
 //display_string(2,1,lcdbuf2);
     for(i=0;i<16;i++)
    {
     write_code(0x40); //设置显示地址
     write_data('a'+i);//第一行显示
     } 


/*********************自动移位显示*********************
  
     write_code(0x07);//设置为移动显示模式,AC自增
 for(i=0;i<26;i++)
 {
  display_char(i,0,'A'+i);//当CG RAM地址自增超过第一行地址时,自动跳到第二行地址
  delay1ms(50);
    delay1ms(200);  
 }  
  
   delay1ms(200); 
 for(i=0;i<26;i++)
 {
  display_char(i,1,'a'+i);
  delay1ms(50);
  delay1ms(200); 
 } */
   }
 
 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值