标题:
51单片机为基础利用12864液晶利用两个中断制作的计时器和定时器 源程序注释完整
[打印本页]
作者:
阔少
时间:
2019-11-12 20:13
标题:
51单片机为基础利用12864液晶利用两个中断制作的计时器和定时器 源程序注释完整
这是我在学习了中断和LCD12864液晶后,将两者结合写出来的程序,实现了999倒计时功能,和计数器的功能。程序注释完整可用,适合学51单片机的新手,希望大家多多参考学习哦~
单片机源程序如下:
/*看书的时候要十分重点去看寄存器,看到前面我刚开始也是看完之后似懂非懂,我就一直看一直看反复记忆,等觉得自己差不多了就开始看中断程序,看了程序之后,我的天哪其实定时器初始化要写的东西并不多,程序比那些复杂的文字要简单多了,再加上程序后面的分析,我差不多就理解了,之后就用四位数码管编写了一个分秒程序,程序没有错误没有警告但是运行不了,找师兄看过之后他叫我不要深究在这里让我去做定时器液晶,现在想想可能程序还是有点问题等有空再深究一下,不然怎么别人的可以用数码管而我的不行呢。
我把程序写出来之后不行,我是这么写显示的放在主函数中
Write1_XY_string(2,0,"shi");
我知道可能是这里有了问题可我不会改,不知道如何下手,杨铭师兄就帮我改成了
Set1_XY(2,0);
write_date(0x30+shi/10);
就可以运行了,因为这些要转化成十进制的数要加上0x30所以要用这样写来转换。
后来师兄想让我做两个定时器,一个是时钟一个是定时的,他把思路告诉我了,后来我写出来程序是OK的,其实理解了中断之后多一个少一个都是一样的。
我在写的时候用上了那些C语言的符号
else if(miao1==0&&fen1!=0)
我感觉这些很好用的,之前我是不会用的,慢慢的突然就想到就会用了哈哈,定时器我是写程序的时候真的是走的挺快的因为没有出现什么错误,所以我也不知道总结点什么,看书的时候多看看重点“寄存器”吧一定要看懂才行的。
我会继续加油的!*/
/***** 液晶12864头文件 *****/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_RS=P2^4; //片选信号
sbit LCD_RW=P2^5; //数据信号
sbit LCD_EN=P2^6; //时钟信号
sbit LCD_PSB=P2^7; //串、并行选择信号
uchar shi=00,fen=00,miao=00,num,shi1=99,fen1=99,miao1=99,num1;
/*延时函数 延时xms*/
void delay(uchar xms)
{
uchar x,y;
for(x=xms;x>0;x--)
for(y=12;y>0;y--);
}
/*以串行协议把数据按位发送,相当于使用并行时接通八个DI口*/
void send_bit(uchar byte)
{
uchar i;
for(i=0;i<8;i++)
{
LCD_RW=((byte<<i)&0x80);
LCD_EN=0; //不加延时,串口中每输送一个数据都有要有个跳变沿,因此速度很快不需延时
LCD_EN=1;
}
delay(5);
}
/*写串口命令函数 */
void write_com(uchar com)
{
LCD_RS=1; //串口中只要进行数据操作RS就将拉高
send_bit(0xf8); //第一字节输入写指令
send_bit(com&0xf0); //第二字节发送高四位
send_bit((com<<4)&0xf0); //第三字节发送低四位
delay(5);
LCD_RS=0;
}
/*写数据命令函数*/
void write_date(uchar date)
{
LCD_RS=1;
send_bit(0xfa); //发送数据识别码
send_bit(date&0xf0); //发送高四位
send_bit((date<<4)&0xf0); //发送低四位
delay(5);
LCD_RS=0;
}
/*********液晶初始化*********/
void lcd_init()
{
LCD_PSB=0; //串口
LCD_EN=0;
write_com(0x30); //基本指令操作 //可加延时也可不加,一般来说液晶都是稳定的
write_com(0x0c); //开显示,关光标,反白关
write_com(0x06); //设置显示格式,光标位置
write_com(0x01); //清除显示,将DDRAM的地址计数器归零
}
///*********设定显示位置************/
void Set1_XY(uchar X, uchar Y)
{
switch(X)
{
case 1:write_com(0x80+Y); break; //当X为1时执行此程序,在第一行输入
case 2:write_com(0x90+Y); break; //第二行
case 3:write_com(0x88+Y); break; //等三行
case 4:write_com(0x98+Y); break; //第四行
}
}
//
///************写字符串***************/
//
void Write1_XY_string(uchar X, uchar Y, uchar *str)
{
uchar temp;
Set1_XY(X,Y);
temp=*str;
while(temp!=0)
{
write_date(temp); //输出字符
temp=*(++str);
}
}
//
////**************************************************//
//
///************液晶显示*************/
//
void display1()
{
Write1_XY_string(1,0,"北京时间,");
Write1_XY_string(2,0," ");
Write1_XY_string(3,0,"天气阴");
Write1_XY_string(4,0," ");
}
void main()
{
TMOD=0X10; //设置定时器工作方式
TH0=(65536-45872)/256; //装初值
TL0=(65536-45872)%256;
TH1=(65536-45872)/256; //装初值
TL1=(65536-45872)%256;
EA=1; //全局中断,打开全局中断
ET0=1; //定时器中断允许位 ,打开T1中断
ET1=1;
TR0=1; //启动定时器0.INT1电平由高到低
TR1=1;
lcd_init(); //调用
display1();
while(1)
{
// Write1_XY_string(2,0,"shi");
// Write1_XY_string(2,2,":");
// Write1_XY_string(2,3,"fen");
// Write1_XY_string(2,5,":");
// Write1_XY_string(2,6,"miao/10");
Set1_XY(2,0);
write_date(0x30+shi/10);
write_date(0x30+shi%10);
Set1_XY(2,2);
write_date(':');
Set1_XY(2,3);
write_date(0x30+fen/10);
write_date(0x30+fen%10);
Set1_XY(2,5);
write_date(':');
Set1_XY(2,6);
write_date(0x30+miao/10);
write_date(0x30+miao%10);
//********************************************//
Set1_XY(4,0);
write_date(0x30+shi1/100);
write_date(0x30+shi1%100/10);
write_date(0x30+shi1%10);
Set1_XY(4,2);
write_date(':');
Set1_XY(4,3);
write_date(0x30+fen1/100);
write_date(0x30+fen1%100/10);
write_date(0x30+fen1%10);
Set1_XY(4,5);
write_date(':');
Set1_XY(4,6);
write_date(0x30+miao1/100);
write_date(0x30+miao1%100/10);
write_date(0x30+miao1%10);
}
}
void time()interrupt 1
{
TH0=(65536-45872)/256; //重装初值
TL0=(65536-45872)%256;
num++;
if(num==20)
{
num=0;
miao++;
if(miao==60)
{
fen++;
miao=0;
if(fen==60)
{
shi++;
fen=0;
if(shi==24)
{
shi=0;
}
}
}
}
}
//************************************************************//
void time1()interrupt 3
{
TH1=(65536-45872)/256; //重装初值
TL1=(65536-45872)%256;
num1++;
if(num1==20)
{
num1=0;
if(miao1!=0)
{
miao1--;
}
else if(miao1==0&&fen1!=0)
{
fen1--;
}
else if(fen1==0&&shi1!=0)
{
shi1--;
}
if(shi1==0)
{
shi1=99;
fen1=99;
miao1=99;
}
}
}
复制代码
以上程序51hei提供下载:
中断液晶两个定时器.zip
(34.85 KB, 下载次数: 22)
2019-11-12 20:11 上传
点击文件名下载附件
可用,内容精炼,注释完整,新老手都适合参考
下载积分: 黑币 -5
作者:
杨德金
时间:
2019-11-12 21:12
谢谢 共享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1