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

📄 demo.c

📁 89C52单片机的底层代码,包括A/D,D/A转换,键盘,LED显示等
💻 C
字号:
#include <reg51.H>
#include <absacc.h>
#define  LCD_WR_COM XBYTE[0x4000]
#define  LCD_RD_STA XBYTE[0x4001]
#define  LCD_WR_DAT XBYTE[0x4002]
#define  LCD_RD_DAT XBYTE[0x4003]

char code cgram[]={0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,
                   0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00,
                   0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00};
char code string1[]={0x44,0x50,0x2d,0x35,0x31,0x48};
char code string2[]={0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10};//16个空格
char code string3[]={0x5a,0x4c,0x47,0x32,0x30,0x30,0x33,0x00,0x37,0x01,0x31,0x32,0x02};


sbit CS=P1^0;
sbit CLK=P1^1;
sbit DIO=P1^2;
sbit AD_OK=P3^2;
char KeyCode;
char dispbuff[8];
char adconvert(char channel);
char ReadKB();
void sent(unsigned char sent_buf);
void init_lcd(char mode);
void test_LCD();
void write_cgram();
void Left_loop();
void right_loop();
void printf_lcd(char *p);
void printf_lcdxy(char x,char y,char *p);
void delay(unsigned char time);
void display();
char TICK;
char ADresult;
void Timer0() interrupt 1
{
   TMOD=0x01;
   TH0=0x3c;
   if(TICK==5)
   {
    display();
	TICK=0;
    ADresult=adconvert(0);
	}
	TICK++;
}
void KeyBoard() interrupt 2
{
   KeyCode=ReadKB();
}
main()
{
   char i;
   EX1=1;
   EA=1;
   CS=1;
   IT1=1;
   init_lcd(0);
   write_cgram();
   test_LCD();
   Left_loop();
   right_loop();
   TMOD=0x01;
   TH0=0x3c;
   TL0=0xb0;
   ET0=1;
   TR0=1;
   TICK=0;
  
   for (i=0;i<8;i++)
   { 
   dispbuff[i]=1+i;
   
   }
   while(1)
   {
      dispbuff[0]=KeyCode/16;
	  dispbuff[1]=KeyCode%16;
	  dispbuff[6]=(ADresult/16)&0x0f;
	  dispbuff[7]=(ADresult%16)&0x0f;
	  
   }

 }
char ReadKB()
{  char kb=0,i;
   CS=1;
   CLK=0;
   delay (50);
   sent(0x15);//发送读键盘指令
   delay(10);
   DIO=1;
   CLK=1;
   delay(50);
   for(i=0;i<8;i++)
  {CLK=0;
   kb=kb*2+(char)DIO;//读1位数据
   delay(10);
   CLK=1;
   delay(10);
   } 
   CS=1;
   return(kb);}
void sent(unsigned char sent_buf)
{
char i;
CLK=0;                            /*置SPI时钟线为低*/
CS=0;                              /*置SPI片选线为低*/
delay (50);                          /*延时50us*/

for(i=0;i<8;i++)                      /*发送8位数据*/
{
sent_buf=sent_buf<<1;     /*从数据最高位开始,将要发发送的数据位移入进位位CY*/
DIO=CY;                          /*数据位送数据线*/
CLK=1;                           /* 置SPI时钟线为高*/
delay (10);                         /*延时10us*/
CLK=0;                          /* 置SPI时钟线为低,发送完1位数据*/
delay (10);/*延时10us*/
}
DIO=0;
}
void delay(unsigned char time)
{
  unsigned char i;
  for(i=0;i<time;i++);

}

char adconvert(char channel)
{
   char result;
   char xdata *adport;
   adport=0x0000+channel;  //AD转换通道选择
   *adport=0;   // 启动转换
   while(AD_OK==1);  //等待转换结束
   result=*adport; // 读转换结果
   return result;
}	
void display()
{
 char i;
 for(i=0;i<8;i++)
   {
     CS=1;
	 sent(0xc8+i);
	 sent(dispbuff[i]);
	 CS=1;
   }
}
void init_lcd(char mode)
{ 
  unsigned char i;
  i=mode;

  LCD_WR_COM=0x38;   //设置为8位数据总线,16*2,5*7点阵
    delay(255);

  LCD_WR_COM=0x01;//清屏幕
    delay(255);

  LCD_WR_COM=0x06;//光标移动,显示区不移动,读写操作后AC加1
    delay(255);

  LCD_WR_COM=0x0c;//开显示,关光标,不闪烁
    delay(255); 
}


void test_LCD()
{
  char i;

  delay(255);
  LCD_WR_COM=0x84;//从第一行第5位开始
  for(i=0;i<6;i++)
   { 
     delay(255);
     LCD_WR_DAT=string1[i];//DP-51H
   }

   delay(255);
   LCD_WR_COM=0xc2;//第二行第3位开始显示
    for(i=0;i<13;i++)
      { 
	   delay(255);
	   LCD_WR_DAT=string3[i];
	  } 
}

void Left_loop()
	{
	  unsigned char i,j;
	 
	  delay(255);
	  LCD_WR_COM=0x07;
	  delay(255);
	  LCD_WR_COM=0x8f;
	  delay(255);
     for(i=0;i<16;i++)
       {
	    LCD_WR_DAT=string2[i];
       for(j=0;j<200;j++)
        delay(255);
  	    }
	}
 void right_loop()
	{
	  unsigned char i,j;
	   
	  delay(255);
	  LCD_WR_COM=0x05;
	  delay(255);
	  LCD_WR_COM=0x80;
	  delay(255);
     for(i=0;i<16;i++)
       {
	    LCD_WR_DAT=string2[i];
       for(j=0;j<200;j++)
        delay(255);
  	    }
	}
void write_cgram()
{
   char i;

   LCD_WR_COM=0x40;
   
   for(i=0;i<24;i++)
   { 
     delay(255);
     LCD_WR_DAT=cgram[i]; 
   }
}








⌨️ 快捷键说明

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