【51单片机清翔开发板V3.0实物运行LCD1602时钟+呼吸灯荔枝】2023-10-1
经过国庆几天假期实物板子运行对比使用非阻塞程序定时器作为时钟运行精度和仿真一样准确。#include reg52.h sbit _RS P3^5;//RS端数据命令选择(H/L) sbit _RW P3^6;//RW端读写选择(H/L) sbit _EN P3^4;//EN端使能信号上升沿25ns sbit k1 P3^0; sbit k2 P3^1; sbit k3 P3^2; sbit k4 P3^3; sbit fmq P2^3; sbit ledP1^0; sbit fmkP1^7; //sbit clkP1^0; //sbit dioP1^1; //sbit cs P1^2; unsigned char Js0; //unsigned char ADC0832QD(unsigned char x,unsigned char t) //{ // unsigned char sj0,js0,mc0; // dioclkcs1;mc;//初始化 // clk0;mc;cs0;mc;clk1;mc;//第一脉冲 // diox;mc;clk0;mc;clk1;mc;//第二脉冲 // diot;mc;clk0;mc;dioclk1;mc7;//第三脉冲选择单通道0/1转换 // zh:if(mc--) // { // clk0; // if(mc7){sj|dio;sj1;} // else {js|dio;js1;} // clk1; // goto zh; // } // cs1; // return sj; //} //void XK_1302(unsigned char SD, bit k) //{ // unsigned char cs8,zh1; // if(k){_EN_RW0;_EN1;} // xf:if(cs--) // { // _RSSD0x01;//低位起16进制 // _RW1;//上升沿写数据 // SD1;//右移 // _RW0;//为下次上升沿准备时钟 // goto xf; // }//发送命令时不能RST0表示结束 // if(!k){_RW1;_EN0;} //} //unsigned char Du_1302(unsigned char Dz) //{ // unsigned char cs8,zh1,sj0; // XK_1302(Dz,1);//读地址命令 // SJ_RW0; // xf:if(cs--) // { // SJ_RS*zh;//位为BCD码形式 // _RW1;//为下次下降沿准备时钟 // zh*2;//直接转化为10进制数据 //// if(cs4){sjSJ;SJ0;zh1;} // _RW0;//下降沿读数据 // goto xf; // } // _EN0; // return SJ/16*10SJ%16;//SJ*10sj; //} //void Xie_1302(unsigned char Dz,unsigned char Sj) //{ // XK_1302(0x8E,1);XK_1302(0x00,0);//取消写保护 // XK_1302(Dz,1);XK_1302(Sj,0);//写入数据 // XK_1302(0x8E,1);XK_1302(0x80,0); //} void PanDuan1602(/*LCD1602忙判断*/) { static unsigned char y47; _RS 0;/*根据规定RS为低电平RW为高电平时可以读状态*/ _RW 1; do{_EN 0;P0 0xFF;_EN 1;while(--y);}while(P0 0x80); } void Xie_MinLin_ShuJu(unsigned char MinLin_ShuJu,bit XZ)/*LCD1602写入8位命令/数据函数*/ { unsigned char y0; PanDuan1602();/*忙则等待*/ _RS XZ; _RW 0; while(y47);//地址建立时间 P0 MinLin_ShuJu;/*写入命令*/ _EN 1;/*拉高使能端 数据被传输到LCD1602内*/ y0;while(y74);//退出时间 _EN 0;/*拉低使能以便于下一次产生上升沿*/ } void Xie_String(unsigned char *ShuJu,unsigned char w,bit x)/*LCD1602写入8位字符串数据子函数*/ { Xie_MinLin_ShuJu((x?0xC0:0x80) w, 0);//1表示第二行0表示第一行 while (*ShuJu ! \0) Xie_MinLin_ShuJu(*ShuJu, 1);//1表示写数据0表示写命令 } void LCD1602ChuShiHua(/*LCD1602初始化子程序*/) { _RS _RW _EN 0; Xie_MinLin_ShuJu(0x38, 0);/*显示模式设置16*2显示5*7点阵8位数据接口*/ Xie_MinLin_ShuJu(0x06, 0);/*显示光标移动设置读写一字节后地址指针加1*/ Xie_MinLin_ShuJu(0x0C, 0);/*显示开及光标设置*/ Xie_MinLin_ShuJu(0x01, 0);/*显示清屏*/ } void fanbo() {//占空比按秒渐亮与渐灭 static unsigned char t2; static bit k1; ledk?(Jst?1:0):(Jst?0:1); if(t50)t2; if(Js0){k!k;t2;} } void ZhongDuan() interrupt 1 { Js; TH0(65536-9216*2)/256; TL0(65536-9216*2)%256; } void xieshi(unsigned char* sj,unsigned char* shi) { sj[0]*shi/100; sj[1]*shi%100; Xie_MinLin_ShuJu(0x80 5, 0); Xie_MinLin_ShuJu(sj[0], 1); Xie_MinLin_ShuJu(sj[1], 1); Xie_MinLin_ShuJu(0x80 14, 0); Xie_MinLin_ShuJu(sj[9], 1); } void xiefen(unsigned char* sj,unsigned char* fen) { sj[3]*fen/100; sj[4]*fen%100; Xie_MinLin_ShuJu(0x80 8, 0); Xie_MinLin_ShuJu(sj[3], 1); Xie_MinLin_ShuJu(sj[4], 1); } void xiemiao(unsigned char* sj,unsigned char* miao) { sj[6]*miao/100; sj[7]*miao%100; Xie_MinLin_ShuJu(0x80 11, 0); Xie_MinLin_ShuJu(sj[6], 1); Xie_MinLin_ShuJu(sj[7], 1); } void xietian(unsigned char* rq,unsigned char* tian) { rq[6]*tian/100; rq[7]*tian%100; Xie_MinLin_ShuJu(0xC0 12, 0); Xie_MinLin_ShuJu(rq[6], 1); Xie_MinLin_ShuJu(rq[7], 1); } void xieyue(unsigned char* rq,unsigned char* yue) { rq[3]*yue/100; rq[4]*yue%100; Xie_MinLin_ShuJu(0xC0 9, 0); Xie_MinLin_ShuJu(rq[3], 1); Xie_MinLin_ShuJu(rq[4], 1); } void xienian(unsigned char* rq,unsigned char* nian) { rq[0]*nian/100; rq[1]*nian%100; Xie_MinLin_ShuJu(0xC0 6, 0); Xie_MinLin_ShuJu(rq[0], 1); Xie_MinLin_ShuJu(rq[1], 1); } void xiezhou(unsigned char* rq,unsigned char* zhou) { rq[9]*zhou0; Xie_MinLin_ShuJu(0xC0 15, 0); Xie_MinLin_ShuJu(rq[9], 1); } //void LcdXian(unsigned char zf,unsigned char x) //{ // Xie_MinLin_ShuJu(0xC0 x, 0); // Xie_MinLin_ShuJu(zf, 1); //} unsigned char yt(unsigned int n,unsigned char y) { if (y 2){ if ((!(n % 4) n % 100) || !(n % 400)) return 29; else return 28; } else if ((y 7 y % 2) || (y 7 !(y % 2)))return 31; else return 30; } unsigned char nzhou(unsigned int nian) {//自适应跳过400倍年之前返回1月1日是周1的值需要1。 return ((nian 400 ? nian --nian - nian / 400 * 400 : --nian) ? 365 * nian nian / 4 - nian / 100 : 0) % 7; } unsigned char jzhou(unsigned int n, unsigned char y, unsigned char t) { unsigned int ts t; js:if (--y){ ts yt(n, y); goto js; } return (ts nzhou(n)) % 7; } void main() {//缘由https://ask.csdn.net/questions/7966081/54243086 unsigned char xd0,xf0,fx0, sj[11]{07:04:47 AM},rq[10]{23-10-01-0}, shi7,fen4,miao47,nian23,ye10,tian1,zhoujzhou(2000nian,ye,tian); bit mx0,km0,jh0; LCD1602ChuShiHua(); // miaoDu_1302(0x81);fenDu_1302(0x83);shiDu_1302(0x85); // nianDu_1302(0x8D);yeDu_1302(0x89);tianDu_1302(0x87);zhouDu_1302(0x8B)-1; // rq[0]nian/100;rq[1]nian%100;rq[3]ye/100;rq[4]ye%100;rq[6]tian/100;rq[7]tian%100;rq[9]zhou0; // xieshi(sj,shi);xiefen(sj,fen);xiemiao(sj,miao);Xie_String(sj,5,0); Xie_String(Time ,0,0);sj[9](shi11?P:A);Xie_String(sj,5,0);Xie_String(HJ474 ,0,1);Xie_String(rq,6,1); TH0(65536-9216*2)/256; TL0(65536-9216*2)%256; TMOD0X01; TR0ET0EA1; while(1) { if(fx6){fx0;fanbo();} if(mx1km1)fmq0;else fmq1;//有源蜂鸣器时间和次数控制 if(shi23shi5fen15miao2||fen30miao4||fen45miao6||fen59miao8)fmkmx1;else {mx0;fmk~led;} if(Js50)//20毫秒定时器如果LCD屏出现秒计数跳变说明定时不足处理干扰则调整长些以便中断外程序有足够处理时间。 { Js0;miao;km!km; if(miao60) { fen;miao0; if(fen60) { shi;fen0; if(shi24) { zhou;xiezhou(rq,zhou);//更新周 tian;shi0; if(tianyt(2000nian,ye)) { ye;tian1; if(ye12) { nian;ye1;xienian(rq,nian);//更新年 }xieyue(rq,ye);//更新月 }xietian(rq,tian);//更新天 }sj[9](shi11?P:A);xieshi(sj,shi);//上午下午切换//更新小时 }xiefen(sj,fen);//更新分钟 }xiemiao(sj,miao);//更新秒钟 // dyADC0832QD(1,0);dy*1.9685;LcdXian(dy/1000,2);LcdXian(dy/10%100,3);LcdXian(dy%100,4); if(!xf){Xie_MinLin_ShuJu(0x80 4, 0);Xie_MinLin_ShuJu( , 1);}//-提示符号消除时间 } if(!k1xd0){if(jh){if(shi24){tian;zhou;shi0;}}else{if(--shi0){--tian;--zhou;shi23;}}sj[9](shi11?P:A);xieshi(sj,shi);xietian(rq,tian);xiezhou(rq,zhou);while(!k1);}//-小时 if(!k2xd0){if(jh){if(fen60)fen0;}else{if(--fen0)fen59;}xiefen(sj,fen);while(!k2);}//-分钟 if(!k3xd0){if(jh){if(miao60)miao0;}else{if(--miao0)miao59;}xiemiao(sj,miao);while(!k3);}//-秒钟 if(!k4xd0){jh!jh;xf0;Xie_MinLin_ShuJu(0x80 4, 0);Xie_MinLin_ShuJu(jh?:-, 1);while(!k4);}//-切换 } }「是菩薩摩訶薩安住靜慮波羅蜜多修行一切靜慮、解脫、等持、等至乃至圓滿所求無上正等菩提常不捨離所修靜慮波羅蜜多。「是菩薩摩訶薩行道相智方便引發一切相智安住其中永斷一切習氣相續能正自利亦正利他能與一切世間天、人、阿素洛等作淨福田堪受世間供養恭敬。