历史上的今天
今天是:2025年05月20日(星期二)
2019年05月20日 | STC单片机之1602显示时钟
2019-05-20 来源:eefocus
/****为了简单起见,调整时间是只添加了s1和s2,删除了s3的功能,若调过了可通过s2循环一圈 ****/
/****From Brandon 2016-09-17 ****/
/****关键点:按键扫描和定时器0的中断程序比较生疏,需再看 ****/
#include sbit LCD_rs=P1^0; sbit LCD_rw=P1^1; sbit LCD_en=P2^5; sbit s1=P3^0; sbit rd=P3^7; sbit wr=P3^6; sbit s2=P3^1; sbit s3=P3^2; unsigned char code table[]=" 2016-9-15 THU"; unsigned char code table1[]=" 00:00:00"; unsigned char num,count,s1num; char miao,shi,fen; // void Delay(unsigned char i) { unsigned char j,k; for(j=i;j>0;j--) for(k=110;k>0;k--); } void LCD_Write_com(unsigned char a) { LCD_rs=0; Delay(5); LCD_rw=0; Delay(5); P0=a; Delay(5); LCD_en=1; Delay(5); LCD_en=0; } void LCD_Write_data(unsigned char b) { LCD_rs=1; Delay(5); LCD_rw=0; Delay(5); P0=b; LCD_en=1; Delay(5); LCD_en=0; Delay(5); } void LCD_init() { Delay(15); LCD_Write_com(0x38); Delay(5); LCD_Write_com(0x08); Delay(5); LCD_Write_com(0x01); Delay(5); LCD_Write_com(0x06); Delay(5); LCD_Write_com(0x0C); Delay(5); } void Time0_init() { TMOD=0x01; //定时器0工作在模式1, TH0=(65536-50000)/256; //高8位=60 TL0=(65536-50000)%256; //低8位 TR0=1; //开定时器0 ET0=1; //使能定时器0中断 EA=1; //开总中断 } void Write_sfm(unsigned char add,unsigned char date) { unsigned char shi,ge; shi=date/10; ge=date%10; LCD_Write_com(0x80+0x40+add); LCD_Write_data(0x30+shi); //0x30表示的是对应数字的ASC码 LCD_Write_data(0x30+ge); //0x30表示的是对应数字的ASC码 } void Keyscan() { rd=0; if(s1==0) //s1摁下 { Delay(5); if(s1==0) { s1num++; while(!s1);//等待s1松开 if(s1num==1) { TR0=0; //关定时器0 LCD_Write_com(0x80+0x40+10);//光标定位到1602第二行第11个字符处 LCD_Write_com(0x0f);//开显示,显示光标,光标闪烁 } } if(s1num==2) { TR0=0; LCD_Write_com(0x80+0x40+7); LCD_Write_com(0x0f); } if(s1num==3) { TR0=0; LCD_Write_com(0x80+0x40+4); LCD_Write_com(0x0f); } if(s1num==4) { s1num=0; LCD_Write_com(0x0c); //开显示,不显示光标 TR0=1; //开定时器 } } if(s1num!=0) //若s1num不等于0 { if(s2==0) //s2摁下 { Delay(5); if(s2==0) { while(!s2); //s2松开后while循环结束 if(s1num==1) { miao++; if(miao==60) miao=0; Write_sfm(10,miao); LCD_Write_com(0x80+0x40+10); } if(s1num==2) { fen++; if(fen==60) fen=0; Write_sfm(7,fen); LCD_Write_com(0x80+0x40+7); } if(s1num==3) { shi++; if(shi==24) shi=0; Write_sfm(4,shi); LCD_Write_com(0x80+0x40+4); } } } } } void main() { wr=0; LCD_init(); LCD_Write_com(0x80); //不能写到for函数里面,否则显示不正常 for(num=0;num<15;num++) { LCD_Write_data(table[num]); Delay(5); } LCD_Write_com(0x80+0x40); //不能写到for函数里面,否则显示不正常 for(num=0;num<12;num++) { LCD_Write_data(table1[num]); Delay(5); } Time0_init(); while(1) //试试此处加一个冒号,提示什么警告,感悟:调试时要会对警告进行分析 { Keyscan(); } } //以下程序待自己编写 void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; //50000*(11.0592/12)ms定时,若晶振为12MHz,则为50ms count++; if(count==18) //此处表示18个以上的数字,即1s,注意有误差 { count=0; miao++; if(miao==60) { miao=0; fen++; if(fen==60) { fen=0; shi++; if(shi==24) { shi=0; } Write_sfm(4,shi); } Write_sfm(7,fen); } Write_sfm(10,miao); } }
史海拾趣
|
大虾们,我有一个输入220V,输出53V的变压器, 但是,我只需要上限不超过28~36伏的可调直流电源 下限当然是。。。。取可调范围大的 请各位多多指教… 查看全部问答> |
|
这是我刚学C语言时写的一些程序,比较简单,希望对刚接触单片机的同胞们有所帮助吧 我使用的主控是89c51,晶振频率是11.0592m的 [ 本帖最后由 open82977352 于 2010-2-3 14:44 编辑 ]… 查看全部问答> |
|
读文件, 循环第一次读取 正常, 第二次,就退出循环了,我的文件大, 这个文件 就只读了一次 512个数组, 我看FatFS copy文件的例子,人家是一直读,知道读没了才退出的, 读第二次 那个提示是说 目录对象是无效的。   ...… 查看全部问答> |
|
新成立Linux开发-4号群68906481,欢迎做嵌入式Linux方面的相关人员加入。共同交流与提高 新成立Linux开发-4号群68906481,欢迎做嵌入式Linux方面的相关人员加入。共同交流与提高… 查看全部问答> |
|
Intel Xscale WinCE 5.0操作系统基础及实验教程 我的资源下载分用完了,需要10分下载一个文件,请大家帮忙。 上传了“Intel Xscale WinCE 5.0操作系统基础及实验教程”基于PXA270的实验配套教程包括基础篇、实战篇、实验篇。 下载地址:http://download.eeworld.net/source/580934 好心的人帮 ...… 查看全部问答> |




