万年历矩阵式键盘程序_第1页
万年历矩阵式键盘程序_第2页
万年历矩阵式键盘程序_第3页
万年历矩阵式键盘程序_第4页
万年历矩阵式键盘程序_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/ 给力者单片机开发学习系统,开发学习都给力! / 学习51单片机,其实可以很简单 / 万年历程序 / 日期:2015年06月18日 /#include <AT89X52.h> /调用51单片机的头文件/-/1602液晶相关I/O设置sbit E=P23; /1602液晶的E脚接在P2.3口上sbit RW=P24; /1602液晶的RW脚接在P2.4口上sbit RS=P25; /1602液晶的RS脚接在P2.5口上/-unsigned char i;/-/1602液晶寄存器设置unsigned int second=0; /设置16位的unsigend int型寄存器用来暂存1

2、602要显示的秒数 unsigned int minute=0; /设置16位的unsigend int型寄存器用来暂存1602要显示的分钟数unsigned int hour=0; /设置16位的unsigend int型寄存器用来暂存1602要显示的小时数unsigned int day=1; /设置16位的unsigend int型寄存器用来暂存1602要显示的日期unsigned int month=1; /设置16位的unsigend int型寄存器用来暂存1602要显示的月份unsigned int year=0; /设置16位的unsigend int型寄存器用来暂存1602要显

3、示的年份unsigned int x=0;unsigned int y=0;/-/-/8独立按键相关I/O设置sbit P1key=P10; /按键P1接在P2.0口上sbit P2key=P11; /按键P2接在P2.1口上sbit P3key=P12; /按键P3接在P2.2口上sbit P4key=P13; /按键P4接在P2.3口上sbit P5key=P14; /按键P5接在P2.4口上sbit P6key=P15; /按键P6接在P2.5口上sbit P7key=P16; /按键P7接在P2.6口上sbit P8key=P17; /按键P8接在P2.7口上/-/-/按键部分用寄存器

4、设置unsigned char KEYbuf; /设置8位的寄存器用来暂存按键键值数据unsigned char KEYcon;bit KEYbit;bit enterbit;/-#define RIGHT P10;#define LEFT P11;#define UP P12;#define DOWN P13;#define ENTER P14;#define ESC P15;#define REST P16;/-/名称:定时器0中断服务程序/适用:给力者GL9单片机开发学习系统/公司:/网址:/日期:2015年06月18日/-void Timer0(void) interrupt 1 /定

5、时25000微秒 TL0=0xFF; /重新给TL0赋初值 TH0=0x4B; /重新给TH0赋初值 /*此处用户自行添加定时器T0中断处理程序*if(+i>39) /对中断计次,记到40次后,刚好1秒钟i=0; /对计次用寄存器清零,以被下一个计次循环/*给1602显示寄存器赋值(0-9999)*if(+second>59) second=0; /秒60进制 if(+minute>59) minute=0; /分钟60进制 if(+hour>23) hour=0; /小时24进制if(month=1|month=3|month=5|month=7|month=8|mo

6、nth=10|month=12)&(+day>31)|(month=4| month=6|month=9|month=11)&(day>30)|(year%4!=0)&(month=2)&(day>28)|(year%4=0)&(month=2)&(day>29) /月份对应相应天数 day=1; if(+month>12) month=1; /月份12进制 if(+year>9999) year=0; /* /*/-/名称:1602液晶用延时函数/适用:给力者GL9单片机开发学习系统/公司:/网址:/日期:2

7、015年06月18日/-void Delay1602(unsigned int t) unsigned int k; /定义一个16位寄存器用来做延时用 for(k=0;k<t;k+); /延时 /-/名称:1602液晶忙检测函数/适用:给力者GL9单片机开发学习系统/公司:/网址:/日期:2015年06月18日/-void LCD1602_busy(void) P0_7=1; /将P0.7置1,为读状态做准备 RS=0; /RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入 RW=1; /RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入 E=1; /RS=

8、0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入 while(P0_7=1); /由P0.7读入1,表示1602液晶忙,需要等待 E=0; /读完以后,恢复E的电平 /-/名称:1600写命令函数/适用:给力者GL9单片机开发学习系统/公司:/网址:/日期:2015年06月18日/-void LCD1602_Write_com(unsigned char combuf) RS=0; /选择指令寄存器 RW=0; /选择写状态 P0=combuf; /将命令字通过P0口送至DB E=1; /E高电平将命令字写入1602液晶 E=0; /写完以后,恢复E的电平 /-/名称:1602写命令

9、函数(带忙检测)/适用:给力者GL9单片机开发学习系统/公司:/网址:/日期:20150529/-void LCD1602_Write_com_busy(unsigned char combuf) LCD1602_busy(); /调用忙检测函数 LCD1602_Write_com(combuf); /调用忙检测函数 /-/名称:1602写数据函数(带忙检测)/适用:给力者GL9单片机开发学习系统/构荆?/网址:/日期:2015年06月18日/-void LCD1602_Write_data_busy(unsigned char databuf) LCD1602_busy(); /调用忙检测函

10、数 RS=1; /选择数据寄存器 RW=0; /选择写状态 P0=databuf; /将命令字通过P0口送至DB E=1; /E高电平将命令字写入1602液晶 E=0; /写完以后,恢复E的电平 /-/名称:1602液晶显示地址写函数/适用:给力者GL9单片机开发学习系统/公司:/网址:/日期:2015年06月18日/-void LCD1602_Write_address(unsigned char x,unsigned char y) x&=0x0f; /列地址限制在0-15间 y&=0x01; /行地址限制在0-1间 if(y=0) /如果是第一行 LCD1602_Writ

11、e_com_busy(x|0x80); /将列地址写入 else /如果是第二行 LCD1602_Write_com_busy(x+0x40)|0x80); /将列地址写入 /-/名称:1602液晶指定地址显示函数/适用:给力者GL9单片机开发学习系统/公司:/网址:/日期:2015年06月18日/-void LCD1602_Disp(unsigned int x,unsigned int y,unsigned char buf) LCD1602_Write_address(x,y); /先将地址信息写入 LCD1602_Write_data_busy(buf); /再写入要显示的数据 /-/

12、名称:1602液晶初始化函数/适用:给力者GL9单片机开发学习系统/公司:/网址:/日期:20150618/-void LCD1602_init(void) Delay1602(1500); /调用延时函数 LCD1602_Write_com(0x38); /8位数据总线,两行显示模式,5*7点阵显示 Delay1602(500); /调用延时函数 LCD1602_Write_com(0x38); /8位数据总线,两行显示模式,5*7点阵显示 Delay1602(500); /调用延时函数 LCD1602_Write_com(0x38); /8位数据总线,两行显示模式,5*7点阵显示 LCD1

13、602_Write_com_busy(0x38); /8位数据总线,两行显示模式,5*7点阵显示 LCD1602_Write_com_busy(0x08); /显示功能关,无光标 LCD1602_Write_com_busy(0x01); /清屏 LCD1602_Write_com_busy(0x06); /写入新的数据后,光标右移,显示屏不移动 LCD1602_Write_com_busy(0x0C); /显示功能开,有光标,光标闪烁 /-/名称: 按键扫描函数/适用:给力者GL9单片机开发学习系统/公司:宁波芯动电子有限公司/网址:www.MovingC/日期:2015年06月18日/-u

14、nsigned char ScanKey(void) /*4×4矩阵按键扫描部分* /按K1-K16键,返回参数1-16 P1=0xFE; /将第一行置零,以扫描K1-K4是否被按下 if(P1_4=0) return 1; /如果K1键按下,返回1 else if(P1_5=0) return 2; /如果K2键按下,返回2 else if(P1_6=0) return 3; /如果K3键按下,返回3 else if(P1_7=0) return 4; /如果K4键按下,返回4 P1=0xFD; /将第二行置零,以扫描K5-K8是否被按下 if(P1_4=0) return 5;

15、/如果K5键按下,返回5 else if(P1_5=0) return 6; /如果K6键按下,返回6 else if(P1_6=0) return 7; /如果K7键按下,返回7 else if(P1_7=0) return 8; /如果K8键按下,返回8 P1=0xFB; /将第三行置零,以扫描K9-K12是否被按下 if(P1_4=0) return 9; /如果K9键按下,返回9 else if(P1_5=0) return 10; /如果K10键按下,返回10 else if(P1_6=0) return 11; /如果K11键按下,返回11 else if(P1_7=0) retu

16、rn 12; /如果K12键按下,返回12 P1=0xF7; /将第四行置零,以扫描K13-K16是否被按下 if(P1_4=0) return 13; /如果K13键按下,返回13 else if(P1_5=0) return 14; /如果K14键按下,返回14 else if(P1_6=0) return 15; /如果K15键按下,返回15 else if(P1_7=0) return 16; /如果K16键按下,返回16 return 0; /如果无按键按下,返回0/*/名称:LCD1602液晶显示部分程序/适用:给力者GL9单片机开发学习系统/公司:/网址:/日期:2015年06月

17、18日/*void LCD1602_Disp_xy(void) /分隔符显示 /* LCD1602_Disp(4,0,'-'); /在第1行的第5列显示- LCD1602_Disp(7,0,'-'); /在第1行的第8列显示-LCD1602_Disp(2,1,':'); /在第1行的第12列显示: LCD1602_Disp(5,1,':'); /在第1行的第15列显示: /*1602液晶显示0-9999年份* LCD1602_Disp(0,0,year/1000+'0'); /在第1行的第1列显示千位 LCD160

18、2_Disp(1,0,(year%1000)/100+'0'); /在第1行的第2列显示百位 LCD1602_Disp(2,0,(year%100)/10+'0'); /在第1行的第3列显示十位 LCD1602_Disp(3,0,year%10+'0'); /在第1行的第4列显示个位 /*1602液晶显示0-12月* LCD1602_Disp(5,0,(month%100)/10+'0'); /在第1行的第3列显示十位 LCD1602_Disp(6,0,month%10+'0'); /在第1行的第4列显示个位 /*

19、1602液晶显示0-31日* LCD1602_Disp(8,0,(day%100)/10+'0'); /在第1行的第3列显示十位 LCD1602_Disp(9,0,day%10+'0'); /在第1行的第4列显示个位 /*1602液晶显示0-24小时* LCD1602_Disp(0,1,(hour%100)/10+'0'); /在第1行的第3列显示十位 LCD1602_Disp(1,1,hour%10+'0'); /在第1行的第4列显示个位/*1602液晶显示0-60分钟* LCD1602_Disp(3,1,(minute%100

20、)/10+'0'); /在第1行的第3列显示十位 LCD1602_Disp(4,1,minute%10+'0'); /在第1行的第4列显示个位/*1602液晶显示0-60秒* LCD1602_Disp(6,1,(second%100)/10+'0'); /在第1行的第3列显示十位 LCD1602_Disp(7,1,second%10+'0'); /在第1行的第4列显示个位/*/*/名称:日期加法执行程序/适用:给力者GL9单片机开发学习系统/公司:/网址:/日期:2015年06月18日/*void date_plus(void)

21、if(y=0) /日期行显示 if(x=0)year=year+1000; /千位加1 if(x=1)year=year+100; /百位加1 if(x=2)year=year+10; /十位加1 if(x=3)year+; /个位加1 if(year>=10000)year=year-10000; /年满10000,减10000 if(x=5); if(x=6)month+; if(month>12)month=month-12; /月份满12,减12 if(x=8)day=day+10; if(x=9)day+; if(month=1|month=3|month=5|month

22、=7|month=8|month=10|month=12) / 31天的月份,满31天后为1日 if(day>31)day=1; else if(month=4|month=6|month=9|month=11) / 30天的月份,满30天后为1日 if(day>30)day=1; else if(month=2&year%4=0) / 闰年2月 29天,满29天后为1日 if(day>29)day=1; else if(month=2&year%4!=0) /闰年2月 28天,满28天后为1日 if(day>28)day=1; /*/名称:日期减法执行

23、程序/适用:给力者GL9单片机开发学习系统/公司:/网址:/日期:2015年06月18日/*void date_subtraction(void) if(y=0) /日期行显示 if(year<1000&x=0|year<100&x=1|year<10&x=2|year=0&x=3)year=year+10000; /年份数不够往最高位借位 if(x=0)year=year-1000; if(x=1)year=year-100; if(x=2)year=year-10; if(x=3)year-; if(x=5); /月份只能个位设置 if(m

24、onth=1&x=6)month=12; /月份为一月时要减一,则见月份赋值为12月 else if(month>1&month<=12&x=6)month-; /月份减一 if(month=1|month=3|month=5|month=7|month=8|month=10|month=12)&x=8) / 当31天的月份,日期十位减一键按下 if(day<=1)day=day+30; /当日期为0或1时,日期加30 else if(day>1&day<=10)day=day+20; /当日期为2到10时,日期加20 el

25、se if(day>10&day<=31)day=day-10; /当日期为11到31时,天数减10 else if(month=1|month=3|month=5|month=7|month=8|month=10|month=12)&x=9) /当31天的月份,日期个位减一键按下 if(day=1)day=31; /当日期为1的时候,下一日期为31日 else if(day>1&day<=31)day-; /当日期为2到31日时,日期减一 else if(month=4|month=6|month=9|month=11)&x=8) /当

26、30天的月份,日期十位减一键按下 if(day=1)day=30; /当日期为1日时,下一日期为为30 else if(day>1&day<=10)day=day+20; /当日期为到10日时,日期十位加2 else if(day>10&day<=30)day=day-10; /当日期为10到30日时,日期十位减1 else if(month=4|month=6|month=9|month=11)&x=9) /30天的月份,个位按键减一键按下 if(day=1)day=30; /当日期为1时,下一日期为30 else if(day>1&am

27、p;day<=30)day-; /当日期为2到30时,下一日期减一 else if(month=2&year%4=0)&x=8) /闰年时2月份,十位按键减一键按下 if(day>=1&day<10)day=day+20; /当日期为2到9时,日期十位加2 else if(day=10)day=29; /当日期为10时,下一日期为29 else if(day>10&day<=29)day=day-10; /当日期为11到29时,日期十位减1 else if(month=2&year%4=0)&x=9) /当闰年2月份

28、,按键减一键按下 if(day=1)day=29; /当日期为1日时,下一日期为29日 else if(day>1&day<=29)day-; /当日期为2到29日时,日期减一 else if(month=2&year%4!=0)&x=8) /2月份平年,十位按键减一键按下 if(day>=1&day<=8)day=day+20; /当日期为1时,日期十位加一? else if(day=9|day=10)day=28; /当日期为9或10时,日期下一位为28 else if(day>10&day<=28)day=day

29、-10; /当日期为11到28时,日期十位减1 else if(month=2&year%4!=0)&x=9) /当月份为平年2月份,按键个位减一键按下 if(day=1)day=28; /当日期为1时,下一日期为28日 else if(day>1&day<=28)day-; /当日期为2到28日,日期减一 /*/名称:时间加法执行程序/适用:给力者GL9单片机开发学习系统/公司:/网址:/日期:2015年06月18日/*void time_plus(void) if(y=1) /时间行显示 if(x=0)hour=hour+10; if(x=1)hour+

30、; if(hour>=24)hour=0; /满24小时,时间为0 if(x=3)minute=minute+10; if(x=4)minute+; if(minute>=60)minute=minute-60; /满60分钟,分钟数为0 if(x=6)second=second+10; if(x=7)second+; if(second>=60)second=second-60; /满60秒,秒数为0 /*/名称:时间减法执行程序/适用:给力者GL9单片机开发学习系统/公司:/网址:/日期:2015年06月18日/*void time_subtraction(void) i

31、f(y=1) /时间行显示 if(x=0) / 显示地址为(0,1) if(hour<=4)hour=hour+20; /当小时数为小于4,小时数加20 else if(hour>4&hour<10)hour=hour+10; /当小时数为5到9时,小时数加10 else if(hour>=10&hour<=24)hour=hour-10; /当小时数为为10到24,小时数十位减1 if(x=1) if(hour=0)hour=24; hour-; /当小时数为0,借位24小时 if(x=3) if(minute<10)minute=minu

32、te+50; /分钟数小于10,十位加5 else if(minute>=10&minute<60)minute=minute-10; /分钟数大于等于10小于60,分钟数十位减1 if(x=4) if(minute=0)minute=60; minute-; /当分钟数为0时,借位60分钟 if(x=6) if(second<10)second=second+50; /秒数小于10,十位加5 else if(second>=10&second<60)second=second-10; /秒数大于等于10小于60,秒数十位减1 if(x=7) if

33、(second=0)second=60; second-; /-/名称: 主函数/适用:给力者GL9单片机开发学习系统/公司:/网址:/日期:2015年06月18日/-void main(void) /主函数,单片机开机后就是从这个函数开始运行 unsigned char k; unsigned char k5con;unsigned int keycon;unsigned int enter_bit=0;bit keybit;/* LCD1602_init(); /调用1602液晶初始化函数 /* /*定时器Timer0初始化* TMOD&=0xF0; /将TMOD的低4位定时器0控制部分清零 TMOD|=0x01; /设置定时器0为方式1 TL0=0xFF; /设置定时器0初值低8位 TH0=0x4B; /设置定时器0初值高8位 TR0=1; /启动定时器0 ET0=1; /Timer0中断允许 /* /*开全局中断设置* /定时器Timer0设置了中断允许,此处要开全局中断 EA=1; /开全局中断 /* while(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论