📄 yejing.txt
字号:
//该程序由ST7920控制器控制液晶显示
//其中单片机的P0.0~P0.7接ST7920的D0~D7,P2.7接RS,P2.6接RW,P2.5接E
//用P0.7获取ST7920的忙标志
//源程序1_1如下:
#include<stdio.h>
#include<reg51.h>
#define unchar unsigned char
#define unint unsigned char
sbit bf=P0^7;
sbit rs=P2^7;
sbit rw=P2^6;
sbit e=P2^5;
#define F_TM F0 //自定义标志位,作为中断标志位
//延迟函数
void delay(unsigned int i) //当i为25时约延时10毫秒
{
unsigned char j; //当i为2500时约延时1秒
while(i)
{
i--;
for(j=0;j<100;j++)
{
;
}
}
}
//读忙标志函数
void rbf(void)
{
do
{
rs=0; //设置读忙时的状态
rw=1;
delay(1); //延迟一会儿
e=1; //开使能端
}while(bf); //不忙则跳出
e=0; //关使能
}
//写指令函数与写数据函数 wcd(i,n)
//当i为0的时候为写指令n,i为1时候为写数据n
void wcd(unchar i,unchar n)
{
rbf();
switch(i)
{
case 0:rs=0;rw=0;P0=n;break; //设置写指令时的状态
case 1:rs=1;rw=0;P0=n;break; //设置写数据时的状态
case 2:rs=1;rs=1;
}
//将要写入的值设置为P0的状态
e=1; //开使能,ST7920开始工作
delay(1);
e=0; //关使能
}
//初始化液晶界面函数,作用是清屏
void start()
{
unchar i;
unchar code a[5]={0x30,0x01,0x02,0x0c,0xC0}; //DDRAM初始化的指令格式
for(i=0;i<5;i++)
{
wcd(0,a[i]); //依次写入指令
}
}
//初始界面函数,作用是开机时显示的数据
void begin()
{
unchar *p;
unchar i,j;
unchar code c[3]={0x91,0x89,0x9c}; //设置写数据的首地址
p="南京秦泰教育科技有限公司-唐老师"; //写入的数据
start(); //初始化
for(j=0;j<2;j++)
{
wcd(0,c[j]); //写入首地址
for(i=0;i<12;i++) //写入12个字符(6个字),写完后换首地址再写
{
wcd(1,*p); //依次写入数据
delay(100);
p++; //数据地址自增一
}
}
wcd(0,c[j]); //写入最后一行首地址0x9c
for(i=0;i<8;i++)
{
wcd(1,*p);
delay(100);
p++;
}
}
//箭头数据函数
void arrowhead(unchar place)
{
unchar code a[]={0x00,0x00,0x00,0x00,0x04,0x00,0x0c,0x00, //箭头数据
0x1c,0x00,0x3c,0x00,0x7f,0xff,0xff,0xff,
0xff,0xff,0x7f,0xff,0x3c,0x00,0x1c,0x00,
0x0c,0x00,0x04,0x00,0x00,0x00,0x00,0x00};
unchar i ;
unchar code b[]={0x34,0x02,0x30,0x40}; //自建字型的指令格式
for(i=0;i<4;i++)
{
wcd(0,b[i]); //将指令依次写入
}
for(i=0;i<32;i++)
{
wcd(1,a[i]); //将数据依次写入
}
wcd(0,place); //显示箭头的首地址
wcd(1,0x00);
wcd(1,0x00);
}
//菜单函数menu()
void menu(void)
{
unchar *p;
unchar i,j;
unchar code c[3]={0x80,0x90,0x88}; //设置显示地址
p="一、公司简介二、进入菜单三、时间设置";
start();
for(j=0;j<3;j++)
{
wcd(0,c[j]);
for(i=0;i<12;i++)
{
wcd(1,*p);
delay(100);
p++;
}
}
}
//时间函数time(时,分,秒)
void time(unchar x,unchar y,unchar z)
{
unchar code a[][2]= {'0','0','0','1','0','2','0','3','0','4','0','5','0','6','0','7','0','8','0','9', //时间字符数据
'1','0','1','1','1','2','1','3','1','4','1','5','1','6','1','7','1','8','1','9',
'2','0','2','1','2','2','2','3','2','4','2','5','2','6','2','7','2','8','2','9',
'3','0','3','1','3','2','3','3','3','4','3','5','3','6','3','7','3','8','3','9',
'4','0','4','1','4','2','4','3','4','4','4','5','4','6','4','7','4','8','4','9',
'5','0','5','1','5','2','5','3','5','4','5','5','5','6','5','7','5','8','5','9'};
unchar i,j,m,n;
i=z; //时分秒的初始化
m=x;
n=y;
while(1)
{
if(TF1==1)
{
for(;i<60;i++) //秒的变化
{
wcd(0,0x99); //时间显示的初地址
for(j=0;j<2;j++)
{
wcd(1,a[m][j]); //显示时
}
wcd(1,':');
for(j=0;j<2;j++)
{
wcd(1,a[n][j]); //显示分
}
(i%2==0)?wcd(1,':'):wcd(1,' '); //让分与秒之间的冒号闪烁
for(j=0;j<2;j++)
{
wcd(1,a[i][j]); //显示秒
}
if(i==59)
{
i=0; //秒位达到59后清零
n++; //秒达到59后分自加一
if(n>59)
{
m++; //分达到60后时自加一
if(m>23)
{
m=0; //时位达到24清零
}
n=0; //分位达到60清零
}
}
}
TH1=0X63;
TL1=0XC0;
TR1=1; //开始启动定时
}
}
}
//串口接收数据函数receive()
unchar receive()
{
unchar ch;
while(!RI) //当接收标志位为0时(即未产生一个串口接收中断),则等待
{
;
}
ch=SBUF; //读出数据
RI=0; //清RI
return ch;
}
//箭头控制函数arrowcon()
void arrowcon()
{
unchar code a[3]={0x87,0x97,0x8f};
unchar place,k,i;
k=receive();
if(k==0x03||k==0x07||k==0x0b||k==0x0f) //判断四个键(上\下\取消\确认)按下时箭头的位置
{
for(i=0;i<3;i++)
{
wcd(0,a[i]);
wcd(2,0);
place=a[i];
if(P0!=0x20)break;
}
}
switch(place)
{
case 0x87:
if(k==0x03)
{
wcd(0,0x87);
wcd(1,0x20);wcd(1,0x20);
arrowhead(0x8f);
}
if(k==0x07)
{
wcd(0,0x87);
wcd(1,0x20);wcd(1,0x20);
arrowhead(0x97);
}
break;
case 0x97:
if(k==0x03)
{
wcd(0,0x97);
wcd(1,0x20);wcd(1,0x20);
arrowhead(0x87);
}
if(k==0x07)
{
wcd(0,0x97);
wcd(1,0x20);wcd(1,0x20);
arrowhead(0x8f);
}
break;
case 0x8f:
if(k==0x03)
{
wcd(0,0x8f);
wcd(1,0x20);wcd(1,0x20);
arrowhead(0x97);
}
if(k==0x07)
{
wcd(0,0x8f);
wcd(1,0x20);wcd(1,0x20);
arrowhead(0x87);
}
break;
}
}
void IntTimer1() interrupt 2
{
F_TM=1;
}
//主函数
void main()
{
TMOD=0x10; //定时器1工作在工作方式1
TH1=0x63; //存入定时初值,定时20ms
TL1=0xc0;
IE=0x88;
IP=0x10;
SCON=0x50; //允许接收数据,串口方式1
PCON=0x00; //24MHz 1200波特率
//TCON=0x00;
TR1=1; //开始启动定时
while(1)
{
if(F_TM==1)
{
begin();
menu();
arrowhead(0x87);
TH1=0X63;
TL1=0XC0;
TR1=1;
time(0,0,0);
//开始启动定时
while(1)
{
arrowcon();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -