📄 3208_v4.01.00.c
字号:
/**********************************************************************************************/
void Load_time(void){ //时间组合与显示
bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)
if(read_clock(0x85) > read_clock(0xc3) && read_clock(0x85) < read_clock(0xc5)){//设定范围内整点报时
if(hour_renew != read_clock(0x85)){//当小时值更新时则启动报时
hour_renew = read_clock(0x85);//将新的小时值放入更新寄存器//这里会导致开机时报一次整点,因为开机pp值不等于小时值。
Beep();//启动正点报时 ---V4.0注
}
}
putin_buf(read_clock(0x85)/16);//显示小时值(十位,为0时消隐)
putin_buf(read_clock(0x85)%16);//显示小时值(个位)
putin_buf(17);//显示冒号“:
putin_buf(read_clock(0x83)/16);//显示分钟值(十位)
putin_buf(read_clock(0x83)%16);//显示分钟值(个位)
}
/**********************************************************************************************/
void Load_T_week(void){ //温度、星期组合与显示
if(timecount<=201)//由于第三种显示方式每次装数据都要读温度值时需要进行温度转换,
//要花较长时间,导致显示较暗。这里改成显示的时候只读取一次数据。
//当timecount为201-250时,只在201时转换一次温度数据,其它时间不转换。
//只有在第三种显示方式timecount才会大于200。
ty = printTemperature();//取得的温度值放入温度寄存器变量
bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)
if(ty >60){//当温度高于99度或未发现温度传感器(DS18B20)时显示“--”
putin_buf(18);//显示“--
putin_buf(18);
}
else{//温度小于99度并发现温度传感器(DS18B20)时,显示温度值
if(ty/10 != 0){//为0时消隐
putin_buf(ty/10);//温度值的十位
}
putin_buf(ty%10);//温度值的个位
}
putin_buf(19);//显示摄氏度符号“oC”
putin_buf(23);//显示摄氏度符号“周”----V4.0
putin_buf(read_clock(0x8b)+9);//显示星期数据
}
/**********************************************************************************************/
void disbuf_pro (void){//将待显缓冲区内容放入显示缓冲区的处理。---V4.0
uchar i;
if(read_clock(0xc3+7*6+4)==1){//显示模式1--静态显示时间
timecount=0;//对定时器的计数清零,防止溢出。
clearBuf();//清待显缓冲
Load_time();
for(i=0;i<40;i++){ //对80字节待显数据进行移位。
Ledplay_buf [i]=Ledplay_buf [i+40];
}
}
if(read_clock(0xc3+7*6+4)==2){//显示模式2--流动显示所有信息
if(timecount>(read_clock(0xc3+7*6)+4))//控制左移的速度。加4为了避免默认速度飞快//原数据为timecount>8
{ //加4也可以调节最高与最低速的平衡。
timecount=0;
left_move_time++;
Ledplay_buf [79]=0x00;//对最后一帧数据清零,当left_move_time=40的时候相当于将后四十个字节全部清零。
for(i=0;i<79;i++){ //对80字节待显数据进行移位。
Ledplay_buf [i]=Ledplay_buf [i+1];
}
if(left_move_time>=40){//左移次数判断
left_move_time=0;
disbuf_flag++;
if(disbuf_flag==5)disbuf_flag=1;
//以下为根据不同的标志向待显缓冲区放入不同的内容。
if(disbuf_flag==1){
Load_date();
}
if(disbuf_flag==2){
Load_time();
}
if(disbuf_flag==3){
Load_T_week();
}
if(disbuf_flag==4){}//显示一屏空数据
}
}
}
if(read_clock(0xc3+7*6+4)==3){//显示模式3--整页切换显示所有信息
if((timecount>=0)&&(timecount<=150)){//显示时间timecount<--限定范围显示才正确,不然会乱跳。
clearBuf();//清待显缓冲
Load_time();
for(i=0;i<40;i++){ //对80字节待显数据进行移位。
Ledplay_buf [i]=Ledplay_buf [i+40];
}
}
if((timecount>150)&&(timecount<=200)){//显示日期
clearBuf();//清待显缓冲
Load_date();
for(i=0;i<40;i++){ //对80字节待显数据进行移位。
Ledplay_buf [i]=Ledplay_buf [i+40];
}
}
if((timecount>200)&&(timecount<=250)){//显示温度及星期
clearBuf();//清待显缓冲
Load_T_week();//
for(i=0;i<40;i++){ //对80字节待显数据进行移位。
Ledplay_buf [i]=Ledplay_buf [i+40];
}
}
if(timecount>250)timecount=0;
}
}
/**********************************************************************************************/
void Timer0_Init(void){//定时器0初始(主函数中被调用一次)
TMOD=0x01;//定时器方式设置(定时器工作方式1-16位定时)
TH0=(65535-10000)/256;//50MS
TL0=(65535-10000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断允许
TR0=1;//启动定时器0
}
/**********************************************************************************************/
void Timer0(void) interrupt 1 using 0{//定时器中断入口,使用第1工作组寄存器=定时器中断函数(产生显示切换)
TH0=(65535-10000)/256; //50ms定时(定时器工作方式1)
TL0=(65535-10000)%256; //----------------定时改为10MS
timecount++;//软件计数加1
}
/**********************************************************************************************/
void MENUadd1 (void){//主菜单加1或减1
if(Add_Key == 0 || Add2_Key == 0){
DelayM(20);//去抖
if(Add_Key == 0){
MENU++;
Beep_key();//调时提示音
if(MENU >12){//减少两组闹钟,增加三个功能,menu由11改为12
MENU = 1;
}
}
if(Add2_Key == 0){
MENU--;
Beep_key();//调时提示音
if(MENU <1){
MENU = 12;
}
}
key_off ();//等待键放开
}
}
/**********************************************************************************************/
void MENUexit (void){//退出菜单项 回到时钟显示
if(int_Key == 0){
DelayM(20);//去抖
if(int_Key == 0){
key_off ();//等待键放开
Beep_set();//调时提示音
clearRAM();//清空显示缓冲区数据
//timecount = 19;//将显示切换值调到41,使开机画面停留2秒
MENU = 0;
Timer0_Init();//定时器初始化
}
}
}
/**********************************************************************************************/
void main(void){ //主函数
uchar b,a = 0;//定义变量用于数据提取指针
Init_1302();//调用时间初始化函数
Beep();//启动发出报时音(测试扬声器)
clearBuf();//清空待显BUF,避免开机后流动的第一屏有乱码。
do{//显示开机画面“DoYoung
Ledplay[bn] = DoYoung[a];//将二维数组中的一组数据放入显示缓冲区
a++;//换下一个提取字节
bn++;//换下一个显示缓冲字节
}
while(DoYoung[a] != 0x99);//当显示数据为0时结束循环
//timecount = 41;//将显示切换值调到41,使开机画面停留2秒
display_delay(255);//用显示来作为大致的延时,一举两得!!!
Timer0_Init();//定时器初始化
MENU = 0;//显示标志为0表示正常显示
BEEP_bit = 0;
/**********************************************************************************************/
while(1){//主线程
/**********************************************************************************************/
if(BEEP_bit == 1 && read_clock(0xc7) == 1){
ET0 = 0;//关定时器中断(停止显示切换)
TR0 = 0;
bn=0;//计数清零,使数据从第一个字节开始存放。
clearRAM();//清空显示缓冲区数据
putin(read_clock(0x85)/16);//显示小时值(十位,为0时消隐)
putin(read_clock(0x85)%16);//显示小时值(个位)
putin(17);//显示冒号“:
putin(read_clock(0x83)/16);//显示分钟值(十位)
putin(read_clock(0x83)%16);//显示分钟值(个位)
for(b=0;b<140;b++){ //扫描键盘
Beeplll();
for(a=0;a<6;a++){
if(OK_Key == 0 || int_Key == 0 || Add_Key == 0 || Add2_Key == 0){
b = 200;
v = read_clock(0x83);//按键停止后设置分=V,可防止松开键后再次响
}
display ();//正常扫描显示驱动
Led_EA = 1;//关列显示驱动,防止出现拖尾现象。
}
}
BEEP_bit = 0;
ET0 = 1;//关定时器中断(停止显示切换)
TR0 = 1;
}else{
Led_EA = 1;//关列显示驱动,防止出现拖尾现象。
display ();//正常扫描显示驱动---[整个系统的显示程序]---
Led_EA = 1;
if(v != read_clock(0x83)){//当分不再是闹钟的分时,则设置V是211 不会有冲突
v = 0xfe;
}
}
/**********************************************************************************************/
if(MENU == 0) {//时钟显示,主画面
disBuf_2_disRam();//缓冲数据转存至显示缓冲区
ET0 = 0;TR0 = 0;
disbuf_pro();//这里处理待显示的数据
ET0 = 1;TR0 = 1;
search_time();//--------检测闹钟
Time_adj();//-----------时间校准。
if(OK_Key == 0){//OK键 全部LED点亮 测试用
DelayM(10);//去抖20MS左右,[感觉按键有点干扰似的,老是很快的红屏]
if(OK_Key==0){
for(bn=0;bn<32;bn++){//
Ledplay[bn] = 0xff;//将数据放入显示缓冲区
}
}
}
if(Add_Key == 0){//按+键显示LOGO “DOYOUNG”
bn = 0;a=0;
clearRAM();//清空显示缓冲区数据
while(DoYoung[a] != 0x99){//显示画面“DOYOUNG”
Ledplay[bn] = DoYoung[a];//
a++;//换下一个提取字节
bn++;//换下一个显示缓冲字节
}
display_delay(255);
}
if(Add2_Key == 0){//按-键显示版本号 V3.0
bn = 0;a=0;
clearRAM();//清空显示缓冲区数据
while(V30[a] != 0x99){//显示开机画面“ALARM”
Ledplay[bn] = V30[a];//将二维数组中的一组数据放入显示缓冲区
a++;//换下一个提取字节
bn++;//换下一个显示缓冲字节
}
display_delay(255);
}
if(int_Key == 0){//接MENU键 进入设置菜单
DelayM(20);//去抖
if(int_Key == 0){
key_off ();//等待键放开
ET0 = 0;//关定时器中断(停止显示切换)
TR0 = 0;
MENU++;//MENU菜单切换值加1 跳入菜单项目
Beep_set();//调时提示音
}
}
}
/**********************************************************************************************/
if(MENU >0 && MENU < 7){//ALARM1~8 闹钟设置菜单 //ALARM1~6 闹钟设置菜单 ---V4.0
bn = 0;a=0;
clearRAM();//清空显示缓冲区数据
while(ALARM[a] != 0x99){//显示开机画面“ALARM”
Ledplay[bn] = ALARM[a];//将二维数组中的一组数据放入显示缓冲区
a++;//换下一个提取字节
bn++;//换下一个显示缓冲字节
}
putin(MENU);//显示闹钟组号 --V4.0 //这里是把数据直接放到待显示RAM中
if(OK_Key == 0){//确定进入此号闹钟
DelayM(20);//去抖
if(OK_Key == 0){
key_off ();//等待键放开
Beep_set();//调时提示音
a = MENU;
MENU = 200;
b = 200;
}
}
MENUadd1 ();//菜单加1
MENUexit ();//
}
/**********************************************************************************************/
if(MENU == 200){//闹钟调时设置项
uchar y = 0;
bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)
clearRAM();//清空显示缓冲区数据
switch (b){//显示设置项的说明
case 200:
while(Mode[y] != 0x99){//显示开机画面“MODE”
Ledplay[bn] = Mode[y];//将二维数组中的一组数据放入显示缓冲区
y++;//换下一个提取字节
bn++;//换下一个显示缓冲字节
}
putin(read_clock(0xc3+a*6));//根据闹钟组号读出设置值
break;//
case 201:
bn = 0;
clearRAM();//清空显示缓冲区数据
while(A[y] != 0x99){//显示
Ledplay[bn] = A[y];//将二维数组中的一组数据放入显示缓冲区
y++;//换下一个提取字节
bn++;//换下一个显示缓冲字节
}
putin(read_clock(0xc3+a*6+2)/16);//显示(十位)
putin(read_clock(0xc3+a*6+2)%16);//显示(个位)
putin(24);//显示“时”表示
break;//
case 202:
bn = 0;
clearRAM();//清空显示缓冲区数据
while(A[y] != 0x99){//显示
Ledplay[bn] = A[y];//将二维数组中的一组数据放入显示缓冲区
y++;//换下一个提取字节
bn++;//换下一个显示缓冲字节
}
putin(read_clock(0xc3+a*6+4)/16);//显示分(十位)
putin(read_clock(0xc3+a*6+4)%16);//显示分(个位)
putin(25);//显示“分”表示
break;//
}
if(OK_Key == 0){//确定进入此号闹钟
DelayM(20);//去抖
if(OK_Key == 0){
key_off ();//等待键放开
Beep_set();//调时提示音
b++;//设置下一项
if(b>202){ b = 200;}
}
}
Set_time(b,a);
MENUexit ();
}
/**********************************************************************************************/
if(MENU == 7){//TIME 调时设置项 -----V4.0--(7)
bn = 0;a=0;
clearRAM();//清空显示缓冲区数据
while(Time[a] != 0x99){//显示开机画面“ALARM”
Ledplay[bn] = Time[a];//将二维数组中的一组数据放入显示缓冲区
a++;//换下一个提取字节
bn++;//换下一个显示缓冲字节
}
MENUadd1 ();//菜单加1
MENUexit ();
if(OK_Key == 0){
DelayM(20);//去抖
if(OK_Key == 0){
key_off ();//等待键放开
Beep_set();//调时提示音
MENU = 100;
a = 1;
}
}
}
/**********************************************************************************************/
if(MENU == 100){//TIME 调时设置项
uchar y = 0;
bn = 0;//显示位累加寄存器清零(从头开始写入显示缓冲区)
clearRAM();//清空显示缓冲区数据
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -