|
本帖最后由 Elva 于 2022-11-3 20:49 编辑
仿真负责人:刘莹
仿真图:
仿真文件:
代码:
- /* 常规显示“时分,时间正常跑,
- 按下按键S1启停,3次按下S1后开启;
- 初始化:时间-23小时59分20秒, */
- #include<reg52.h>
- #include <elva_lcd1602.h>
- //
- //矩阵键盘IO定义
- sbit R1=P1^0;
- sbit R2=P1^1;
- sbit R3=P1^2;
- sbit R4=P1^3;
- sbit C4=P1^4;
- sbit C3=P1^5;
- sbit C2=P1^6;
- sbit C1=P1^7;
- //
- unsigned char S1_Flag;
- unsigned char S2_Flag;
- unsigned char S3_Flag;
- unsigned char S4_Flag;
- //数码管0-9
- unsigned char SMGNoDot_CA[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- unsigned char code riqi[]="2022-11-02";
- unsigned char code ck[]="Clock";
- //定义变量
- unsigned char dat_xs=23; //时钟
- unsigned char dat_fz=59;
- unsigned char dat_mi=20;
- unsigned char nn=0;
- unsigned char i;
- unsigned char dat_nxs=2; //闹钟的
- unsigned char dat_nfz=3;
- unsigned char dat_nmi=4;
- //功能选择标志
- unsigned char SetPlace=0;
- //设置模式标志位
- bit mod =0;
- //闹钟设置需要的标志位
- bit alarmset=0 , alarm=0 ;
- // lcd1602 0~9字码
- int num[10]={0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};
- unsigned char *time[]={&dat_mi,&dat_fz,&dat_xs}; //指针变量time存放进位标志位的地址,
- //由于数组不能存放标量,但是却可以存放标量的地址,采用指针的方式来间接修改变量的值
- unsigned char *nao[]={&dat_nfz, &dat_nxs}; //存放闹钟值的数组
- unsigned char statk1=0;//界面
- unsigned char statk2=0;
- unsigned char statk3=0;
- unsigned char statk4=0;
- unsigned char changeT; // 0为时钟显示,1为改变时,2为改变分,3为改变秒
- unsigned char changewarmT; // 同上,但改变的为闹钟时间
- //函数定义
- void write_sfm(unsigned char add,unsigned char dat);
- void Delayk(unsigned char t)
- {
- while(t--);
- }
- //===LCD显示时钟时分/分秒/界面
- void LCD_display()
- {
-
- //秒
- write_sfm(7,num[*time[0]/10]);
- Delayk(50);
- write_sfm(8,num[*time[0]%10]);
- //时钟模式
- // if (alarmset==0)
- // {
- write_sfm(4,num[*time[1]/10]); //分的十位
- Delayk(50);
- write_sfm(5,num[*time[1]%10]); //分的个位
- Delayk(50);
- write_sfm(1,num[*time[2]/10]); //时的十位
- Delayk(50);
- write_sfm(2,num[*time[2]%10]);
- Delayk(50);
- // }
- ////闹钟设置模式
- // if (alarmset==1) //闹钟设置模式
- // {
- // write_sfm(4,num[*nao[0]/10]); //分的十位
- // Delayk(50);
- // write_sfm(5,num[*nao[0]%10]); //分的个位
- // Delayk(50);
- // write_sfm(1,num[*nao[1]/10]); //时的十位
- // Delayk(50);
- // write_sfm(2,num[*nao[1]%10]);
- // Delayk(50);
- // }
- }
- //定时器相关的函数
- void Init_Timer0()
- {
- TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- ET0=1;
- EA=1;
- TR0=1;
- }
- void ServiceTimer0() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
-
- nn++;
- if(nn==20)
- {
- nn=0;
- dat_mi++;
- if(dat_mi==60)
- {
- dat_mi=0;
- dat_fz++;
- if(dat_fz==60)
- {
- dat_fz=0;
- dat_xs++;
- if(dat_xs==24)
- {
- dat_xs=0;
- }
- write_sfm(1,num[*time[changeT]/10]);
- Delayk(50);
- write_sfm(2,num[*time[changeT]%10]);
- }
- write_sfm(4,num[*time[changeT]/10]);
- Delayk(50);
- write_sfm(5,num[*time[changeT]%10]);
- }
- write_sfm(7,num[*time[changeT]/10]);
- Delayk(50);
- write_sfm(8,num[*time[changeT]%10]);
- }
- }
- //LCD1602
- void LcdShowInit()
- {
- //颜文字
- Write_1602com(0x80+1);
- Write_1602dat(0x6f);
- Write_1602com(0x80+2);
- Write_1602dat(0x6f);
- Write_1602com(0x80+3);
- Write_1602dat(0x5f);
- Write_1602com(0x80+4);
- Write_1602dat(0x6f);
- //日期
- Write_1602com(0x80+6);
- for(i=0;i<10;i++)
- {
- Write_1602dat(riqi[i]);
- }
- //冒号
- lcdGoXY(1,3);
- Write_1602dat(':');
- lcdGoXY(1,6);
- Write_1602dat(':');
- //英文字母
- Write_1602com(0x80+0x40+11);
- for(i=0;i<5;i++)
- {
- Write_1602dat(ck[i]);
- }
- }
- //==写时分秒函数
- void write_sfm(unsigned char add,unsigned char dat)
- {
- unsigned char a;
- a=dat;
- Write_1602com(0x80+0x40+add); //第er行
- Write_1602dat(a);
- }
- //按键相关内容
- void ScanKeyMulti()
- {
- //======第一行=======
- R1=0;
- R2=R3=R4=1;
- C1=C2=C3=C4=1;
- if(C1==0) //S1
- {
- Delayk(100);
- if(C1==0)
- {
- S1_Flag = 1;
- }while(C1==0);
- }
- else if(C2==0)
- {
- S2_Flag=1;
- while(C2==0);
- }
- else if(C3==0)
- {
- S3_Flag=1;
- while(C3==0);
- }
- else if(C4==0)
- {
- S4_Flag=1;
- while(C4==0);
- }
- R2=0; //第二行
- R1=R3=R4=1;
- C1=C2=C3=C4=1;
- if(C1==0)
- {
- while(C1==0);
- }
- else if(C2==0)
- {
- while(C2==0);
- }
- else if(C3==0)
- {
- while(C3==0);
- }
- else if(C4==0)
- {
- while(C4==0);
- }
- R3=0;
- R2=R1=R4=1;
- C1=C2=C3=C4=1;
- if(C1==0)
- {
- while(C1==0);
- }
- else if(C2==0)
- {
- while(C2==0);
- }
- else if(C3==0)
- {
- while(C3==0);
- }
- else if(C4==0)
- {
- while(C4==0);
- }
- R4=0;
- R2=R3=R1=1;
- C1=C2=C3=C4=1;
- if(C1==0)
- {
- while(C1==0);
- }
- else if(C2==0)
- {
- while(C2==0);
- }
- else if(C3==0)
- {
- while(C3==0);
- }
- else if(C4==0)
- {
- while(C4==0);
- }
- }
- //====
- void main()
- {
- lcd_init();//液晶功能初始化
- Init_Timer0(); //定时器初始化
- LcdShowInit(); //初始显示
- LCD_display(); //lcd1602显示时分秒
- while(1)
- {
- ScanKeyMulti();
- if(S1_Flag==1)
- {
- S1_Flag=0;
- if (changewarmT == 0) //设置
- {
- changeT++; //设置模式
- if (changeT == 4)
- {
- changeT = 0;
- }
- if (changeT == 0)
- {
- TR0 = 1;
- }
- else
- {
- TR0 = 0;
- }
- }
- if(S3_Flag==1)//加键
- {
- S3_Flag=0;
- if (changeT == 1) //按K1按了一下 1为秒
- {
- (*time[changeT-1])++;
- if ((((*time[changeT-1]))>=60)&&(changeT == 1))
- {
- (*time[changeT-1])=0;
- }
- write_sfm(1,num[*time[changeT-1]/10]);
- Write_1602com(0x80+0x40+1);
- Delayk(50);
- write_sfm(2,num[*time[changeT-1]%10]);//写入数据
- Write_1602com(0x80+0x40+2);
- //显示出来
- }
- if (changeT == 2)
- {
- (*time[changeT-1])++;
- if (((*time[changeT-1]))>=60&&(changeT == 2))
- {
- (*time[changeT-1])=0; //2分
- }
- }
- if (changeT == 3)
- {
- (*time[changeT-1])++;
- if (((*time[changeT-1]))>=60&&(changeT == 3))
- {
- (*time[changeT-1])=0; //为3时,设置10
- }
- }
- }
- //减键
- }
- }
- }
复制代码
目前进度:
仿真部分已经验证完毕,实现效果在LCD1602上显示时间,时,分,秒;可以复位;按键S1按下后停止,按三下时间开始;仿真所用程序由仿真负责人提供;
最后程序实现效果由程序负责人在验收之前下载到实物中的效果为准。(程序负责人目前只剩矩阵键盘部分)
遇到问题:
仿真程序的按键部分已经写了按键可以控制时间界面的加,但是效果并不能呈现出来,不知程序哪里问题
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|