📄 demo.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 + -