历史上的今天
今天是:2025年03月02日(星期日)
2021年03月02日 | 51单片机LCD液晶屏按键电子时钟的设计
2021-03-02 来源:eefocus
液晶屏为JM12864或FYD12864(带字库),我用这两种型号的屏没问题, 4行*8列汉字=32 串行通信 接/口P1.5--P1.7,可根据你的电路修改相应的接口。

#include
#define uchar unsigned char
voidLCD_ini();
void ascii_change(void);
void delay();
void wri_add(uchar com);
void wri_dat(uchar com1);
void shan(void);
void disp();
void tkey(void);
sbit cs=P1^7;
sbit sid=P1^6;
sbit sclk=P1^5;
bit flag=1;
uchar dat,count,f=1;//f测试哪个单元为当前闪烁状态
uchar data cLOCk[3]={23,45,12};
uchar code clockname[10]={“北京时间:”};
uchar data num[6];
/*******主程序*************/
void main()
{
lcd_ini();
count=10;//机器周期为1us,每次定时50ms,此变量用来控制循环次数,在下面赋值为20,共定时1秒
TMOD=0x01;
TL0=0XB0;
TH0=0X3C;
EA=1;
ET0=1;
IT0=1;
EX0=1;
TR0=1;
while(1)
{
back:ascii_change();
disp();
delay();
if(flag==1)
goto back;
tkey();
shan();
delay();
}
}
/****lcd初始化*******/
void lcd_ini()
{
wri_add(0x30);
delay();
wri_add(0x0c);
delay();
wri_add(0x01);
delay();
wri_add(0x06);
delay();
}
/********定时程序*************/
voidtimer1() interrupt 1 using 2
{
TL0=0XB0;
TH0=0X3C;
count--;
if(count==0)
{
count=10;
clock[2]++;//秒//
}
else
goto out;
if(clock[2]==60)
{
clock[2]=0;
clock[1]++;//分//
}
if(clock[1]==60)
{
clock[1]=0;
clock[0]++;
}
if(clock[0]==24)//时//
clock[0]=0;
out:_nop_();
}
/*******十位个位转换成ASCII码************/
void ascii_change(void)
{
num[5]=clock[2]-(clock[2]/10)*10+0x30;
num[4]=clock[2]/10+0x30;
num[3]=clock[1]-(clock[1]/10)*10+0x30;
num[2]=clock[1]/10+0x30;
num[1]=clock[0]-(clock[0]/10)*10+0x30;
num[0]=clock[0]/10+0x30;
}
/********廷时程序*************/
void delay()
{
uchar i,j;
for (i=250;i》0;i--)
for (j=250;j》0;j--);
}
/*****Write address*********/
void wri_add(uchar com)
{
uchar i,j,k;
cs=0;
cs=1;
dat=0xf8;
for(i=1;i《=8;i++)
{
sid=(bit)(dat&0x80);
sclk=0;
sclk=1;
sclk=0;
dat=dat《《1;
}
dat=com;
dat=dat&0xf0;
for(j=1;j《=8;j++)
{
sid=(bit)(dat&0x80);
sclk=0;
sclk=1;
sclk=0;
dat=dat《《1;
}
dat=com;
dat=_cror_(dat,4);// 此为高低四位交换
dat=dat&0xf0;
for(k=1;k《=8;k++)
{
sid=(bit)(dat&0x80);
sclk=0;
sclk=1;
sclk=0;
dat=dat《《1;
}
}
/*********Write data*************/
void wri_dat(uchar com1)
{
uchar i,j,k;
cs=0;
cs=1;
dat=0xfa;
for(i=1;i《=8;i++)
{
sid=(bit)(dat&0x80);
sclk=0;
sclk=1;
sclk=0;
dat=dat《《1;
}
dat=com1;
dat=dat&0xf0;
for(j=1;j《=8;j++)
{
sid=(bit)(dat&0x80);
sclk=0;
sclk=1;
sclk=0;
dat=dat《《1;
}
dat=com1;
dat=_cror_(dat,4);// 此为高低四位交换
dat=dat&0xf0;
for(k=1;k《=8;k++)
{
sid=(bit)(dat&0x80);
sclk=0;
sclk=1;
sclk=0;
dat=dat《《1;
}
}
/******display program***********/
void disp()
{
uchar i,k=0;
wri_add(0x80);
for (i=1;i《=9;i++)
wri_dat(clockname[i-1]);
wri_add(0x90);
for (i=1;i《=6;i++)
{
k++;
if(k==3||k==5)
wri_dat(clockname[8]);//时间之间的冒号。
wri_dat(num[i-1]);
}
}
/*******闪烁程序*************************/
void shan(void)
{
uchar i,k=0;
wri_add(0x90);
if(f==1)
{
num[0]=‘ ’;
num[1]=‘ ’;
}
else
goto next;
for (i=1;i《=6;i++)
{
k++;
if(k==3||k==5)
wri_dat(clockname[8]);//时间之间的冒号。
wri_dat(num[i-1]);
}
goto return1;
next: if(f==2)
{
num[2]=‘ ’;
num[3]=‘ ’;
}
else
goto next1;
for (i=1;i《=6;i++)
{
k++;
if(k==3||k==5)
wri_dat(clockname[8]);//时间之间的冒号。
wri_dat(num[i-1]);
}
goto return1;
next1: if(f==3)
{
num[4]=‘ ’;
num[5]=‘ ’;
}
else
goto return1;
for (i=1;i《=6;i++)
{
k++;
if(k==3||k==5)
wri_dat(clockname[8]);//时间之间的冒号。
wri_dat(num[i-1]);
}
return1:_nop_();
}
/*******外部中断***********/
void intr0() interrupt 0 using 2
{
flag=~flag;//判断是否闪烁位//
TR0=~TR0; //闪关定时否则开定时
f=1;
}
/**********按键程序************/
void tkey(void)
{
uchar judcekey;
judcekey=P1&0x0f;
if(judcekey==0x0f)
goto return2;
/*******移位键*********/
if (judcekey==0x0e)
f++;
if (f==4)
f=1;
/**********加一键*********/
if(judcekey==0x0d)
{clock[f-1]++;}
if (f==1)
{ if (clock[f-1]==24){
clock[f-1]=0;}
}
else{ if (clock[f-1]==60)
clock[f-1]=0;
}
/******减一键***********/
if(judcekey==0x0b)
{clock[f-1]--;}
if (f==1)
{ if (clock[f-1]==0xff){
clock[f-1]=23;}
}
else
{ if (clock[f-1]==0xff)
clock[f-1]=59;
}
return2:_nop_();
}
史海拾趣
|
遇到大麻烦了,PB6.0在编译wince系统的时候 在NETCFV2_MODULES= dotnetv2处失败了。 一下子就没了头绪,网上只有问的却没有解答的。google了快一天了,没有答案。 编译日志如下 配置sysgen参数 User selected the following SYSGEN variables sysgen_as_base=1 sysgen_as_file=1 sysgen_audio=1 sysgen_auth=1 ............. ...… 查看全部问答> |
|
在文件过滤驱动中,如何禁止系统创建新的系统服务? 原来是想将注册表HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services设为只读, 但是发现系统有时会自己修改这个位置,比如说插入一个U盘, 设为只读会导致蓝屏。 所以问问大家,如何 ...… 查看全部问答> |
|
中国有多少工作很多年的电子工程师;中国每年有多少电子新手需要开始全新的技术生涯;他们有什么困惑需要去解开;他们最关心的问题是什么?他们对未来的期待是什么? 中国缺少什么样的电子工程师?中国缺少满嘴胡须的电子工程师;中国缺少坐轮椅 ...… 查看全部问答> |
|
因公司业务发展,急需招聘兼职人员,要求: 1、具有DSP/FPGA/ARM/CPLD方面的研发经验,熟悉数字电路、模拟电路设计; 2、熟悉嵌入式系统设计,熟练掌握C语言; 3、有4层以上PCB板设计经验,熟悉PCB板的设计规范; 4、对电磁兼容设计有了解; 5 ...… 查看全部问答> |
|
因为只做过一个DIY 只好炒冷饭了。 这个是我觉得DIY完成后该做的一个文档的一个大致内容。 它的目的只有一个 以简洁的方式,让读者了解整个设计的目标,优缺点,以及无需太多个人创造性工作即可原样复制该DIY; 曾经的那个收官资料,只是资 ...… 查看全部问答> |
|
这里介绍一个纽扣电池供电的LED灯电路 主要控制芯片是比较常用NE555,纽扣电池供电,其他器件图上标的相当的清楚了,,就是连接电路是有点麻烦,可以自己腐蚀一块电路板,, … 查看全部问答> |
|
这周主体硬件完成,开始写程序,在调试GPS模块的时候,发现无法定位,如图所示 以下是串口调试助手显示的数据,可以看出没有定位 $GPGGA,,,,,,0,0,99.99,,,,,,*78 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,4,1,14,01,,,33,06,,,3 ...… 查看全部问答> |




