📄 1602c.c
字号:
#include "at89x52.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define nop _nop_()
#define SCAN_CYCLE 10000
#define CYCLE 20
sbit RS=P2^7;
sbit RW=P2^6;
sbit E=P2^5;
#define DB0_DB7 P0
uchar cycle,TEMP;
uchar Dataflag,Cmdflag;
uint counti;
uint i=0;
static const uchar code wenzi[]={0x4f,0x77,0x65,0x6e,0x20,0x53,0x74,0x75,
0x64,0x69,0x6f,0x20,0x69,0x73,0x20,0x61,
0x69,0x6d,0x69,0x6e,0x67,0x20,0x61,0x74,
0x20,0x6f,0x66,0x66,0x65,0x72,0x69,0x6e,
0x67,0x20,0x73,0x74,0x61,0x74,0x65,0x2d,
0x6f,0x66,0x2d,0x61,0x72,0x74,0x20,0x64,
0x65,0x73,0x69,0x67,0x6e,0x20,0x66,0x6f,
0x72,0x20,0x63,0x75,0x73,0x74,0x6f,0x6d,
0x65,0x72,0x73,0x21};
void init();
void ScreenInitString(void);
void Write(uchar tempdata);
void WriteDDR(uchar tempdata);
void CheckBusy();
void Write1(uchar tempdata);
void WriteDDR1(uchar tempdata);
void CheckBusy1();
void Delay(uint N);
main()
{
T2CON=0x38; /*令定时器2作为串口波特率发生器
/*|TF2|EXF2|RCLK|TCLK|EXEN2|TR2|C/T2|CP/RL2|*/
TL2=0xd9; /*设定串口波特率为9600,晶振为12MHz*/
TH2=0xff;
RCAP2L=0xd9; /*根据串口波特率9600设定自动重载寄存器*/
RCAP2H=0xff;
TR2=1;
TMOD=0x11; /*Timer0工作在案MODE1,16位定时器,Timer1工作在MODE2,自动重新装载模式*/
/*| 定时器1 | 定时器1 |*/
/*| GATE|C/T| M1 | M0 | GATE|C/T| M1 | M0 |*/
TH0=(65536-SCAN_CYCLE)/256; /*设定Timer0每隔SCAN_CYCLEu中断一次*/
TL0=(65536-SCAN_CYCLE)%256; /*启动TEMER0*/
SCON=0x50; /*设定UART工作在MODE3模式,可传送和接收数据,REN=1*/
/*| SM0| SM1| SM2| REN| TB8| RB8| TI | RI |*/
IE=0x92; /*使能总中断、Timer0,1中断、外部中断1,2*/
/*| EA| - | ET2| ES | ET1| EX1| ET0| EX0|*/
cycle=50;
SP=60;
P2=0x00;
init();
counti=0;
ScreenInitString();
while(1)
nop;
}
void Delay(uint N)
{
for(i=0;i<N;i++)
i=i;
}
void init()
{
RS=0;
RW=0;
E=1;
Write(0x38);
Delay(1000);
Write(0x38);
Delay(1000);
Write(0x38);
Write(0x0F);
Write(0x06);
Write(0x01);
}
void ScreenInitString(void)
{
Write(0x80);
WriteDDR(0x3E);
WriteDDR(0x3E);
WriteDDR(0x4F);
WriteDDR(0x77);
WriteDDR(0x65);
WriteDDR(0x6E);
WriteDDR(0x20);
WriteDDR(0x20);
WriteDDR(0x53);
WriteDDR(0x74);
WriteDDR(0x75);
WriteDDR(0x64);
WriteDDR(0x69);
WriteDDR(0x6F);
WriteDDR(0x3C);
WriteDDR(0x3C);
Write(0xC0);
WriteDDR(0x44);
WriteDDR(0x65);
WriteDDR(0x73);
WriteDDR(0x69);
WriteDDR(0x67);
WriteDDR(0x6E);
WriteDDR(0x20);
WriteDDR(0x66);
WriteDDR(0x6F);
WriteDDR(0x72);
WriteDDR(0x20);
WriteDDR(0x79);
WriteDDR(0x6F);
WriteDDR(0x75);
WriteDDR(0x21);
WriteDDR(0x21);
}
void Write(uchar tempdata)
{
DB0_DB7=tempdata;
RS=0;
RW=0;
E=0;
nop;
E=1;
nop;
CheckBusy();
}
void WriteDDR(uchar tempdata)
{
DB0_DB7=tempdata;
RS=1;
nop;
RW=0;
E=0;
nop;
E=1;
nop;
CheckBusy();
}
void CheckBusy()
{
DB0_DB7=0xff;
RW=1;
RS=0;
E=0;
nop;
E=1;
do
{
nop;
TEMP=DB0_DB7;
}while((TEMP&0x80)==0x80);
RW=0;
}
void Write1(uchar tempdata)
{
DB0_DB7=tempdata;
RS=0;
RW=0;
E=0;
nop;
E=1;
nop;
CheckBusy1();
}
void WriteDDR1(uchar tempdata)
{
DB0_DB7=tempdata;
RS=1;
nop;
RW=0;
E=0;
nop;
E=1;
nop;
CheckBusy1();
}
void CheckBusy1()
{
DB0_DB7=0xff;
RW=1;
RS=0;
E=0;
nop;
E=1;
do
{
nop;
TEMP=DB0_DB7;
}while((TEMP&0x80)==0x80);
RW=0;
}
void service_int0 () interrupt 1 using 2
{
cycle--;
if(cycle==0)
{
cycle=CYCLE;
if(counti<=14)
{
WriteDDR1(wenzi[counti]);
counti++;
}
else if(counti>14 && counti<sizeof(wenzi))
{
Write1(0x07);
WriteDDR1(wenzi[counti]);
counti++;
}
else
{
counti=0;
Write1(0x01);
Write1(0x06);
}
}
TH0=(65536-SCAN_CYCLE)/256;
TL0=(65536-SCAN_CYCLE)%256;
}
void service_int1 () interrupt 4 using 1
{
if(TI==1)
{
TI=0;
return;
}
else
{
uchar v;
while(RI!=1);
{
RI=0;
v=SBUF;
if(v==65)//A
{
TR0=1; //Start timer
Write1(0x01);
counti=0;
}
else if(v==66)//B
{
TR0=0; //Stop timer
}
else if(v==67)//C
{
Write1(0x01); //CLR Screen
}
else if(v==68)//D
{
Write1(0x18); //Set string left moving
}
else if(v==69)//E
{
Write1(0x1C); //Set label right moving
}
else
{
WriteDDR1(v);
SBUF=v;
while(TI!=1);
TI=0;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -