单片机LCD1602显示年月日时钟带星期和闹钟

单片机LCD1602显示年月日时钟带星期和闹钟
单片机LCD1602显示年月日时钟带星期和闹钟

长春工业大学

测控技术与仪器专业

单片机LCD1602显示年月日时钟带星期和闹钟,可识别闰年

下载文档即可完全复制

#include

#define uchar unsigned char

#define uint unsignedint

sbitlcdrs = P0^7; //液晶引脚定义

sbitled_cs = P0^6;

sbitlcden = P0^5;

sbit boom = P3^6;

sbit key1 = P3^5;

sbit key2 = P3^4;

sbit key3 = P3^3;

sbitkeyE = P3^2;

uchar

num,key1num,key2num,count,hour,min,sec,day,mon,year,shi,fen,miao ,week;

char ye1,ye2;

uchar code cg_1602[]={ 0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,

0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00,

0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00,

0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,};//"年月日"

/*延时函数*/

void delay(uintxms)

{

uinti,j;

for(i=xms;i>0;i--)

for(j=114;j>0;j--);

}

/*1602液晶*/

void write_com(uchar com)//写命令{

lcdrs=0;

lcden=0;

P2=com;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

void write_data(uchar date)//写数据{

lcdrs=1;

lcden=0;

P2=date;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

void write_by_xy(ucharx,uchar y)//坐标定位

{

uchar address;

if(y==0)

address=0x80+x;//y=0,写第一行

else

address=0xc0+x;//y=1,写第二行

write_com(address);

}

/*void write_char(ucharx,uchary,uchar date)//坐标定位显示{

write_by_xy(x,y);//先定位

write_data(date);//后写数

}*/

void write_string(ucharx,uchary,uchar *s)//写字符串

{

write_by_xy(x,y);//设定显示位置

while(*s)//write character

{

P2=*s;

write_data(*s);

}

}

void write_sfm(ucharadd,uchar date)//写时分秒函数

{

ucharhour,ge;

hour=date/10;//分解一个2位数的十位和个位

ge=date%10;

write_com(0x80+add);//设置显示位置

write_data(0x30+hour);//送去液晶显示十位

write_data(0x30+ge); //送去液晶显示个位

}

void write_cg()//写入固定汉字和符号

{

write_com(0x40); //设定CGRAM地址

for(num=0;num<24;num++) //将自定义字型码写入CGRAM中{

write_data(cg_1602[num]);

}

write_com(0xc4);//年

{

write_data(0);

write_com(0xc7);//月

{

write_data(1);

}

write_com(0xca);//日

{

write_data(2);

}

write_string(2,0,":");

write_string(5,0,":");

write_string(0x0a,0,":");

write_string(0x0d,0,":");

write_string(0x0c,1,"W");

write_string(0x0d,1,"K");

}

void init_1602()//初始化

{

led_cs=0;

hour=23;min=59;sec=55;key1num=0;count=0;day=28;mon=2;ye1=2 0;ye2=13;year=ye1*100+ye2;boom=0;shi=0;fen=0;miao=0;week=7;

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x01);

write_string(0,1,"2013");

write_string(5,1,"02");

write_string(8,1,"28");

write_sfm(8,shi);

write_sfm(0x0b,fen);

write_sfm(0x0e,miao);

write_sfm(0,hour);

write_sfm(3,min);

write_sfm(6,sec);

write_sfm(0x48,day);

write_sfm(0x45,mon);

write_sfm(0x40,ye1);

write_sfm(0x42,ye2);

write_sfm(0x4e,week);

write_cg();

TMOD=0x01;//设置定时器0工作模式1 TH0=(65536-50000)/256;//定时器装初值TL0=(65536-50000)%256;

EA=1; //开总中断

ET0=1; //开定时器0中断

TR0=1; //启动定时器0

}

/*键盘扫描函数*/

void keyscan()//按键扫描函数

{

//keyE =0;

if(key1==0)

{

delay(5);

if(key1==0)//确认功能键被按下

{

key1num++;//功能键按下次数记录

while(!key1);//释放确认

if(key1num==1)//第一次被按下时

{

TR0=0; //关闭定时器

write_com(0x80+7);//光标定位到秒位置

write_com(0x0f); //光标开始闪烁

}

if(key1num==2)//第二次按下光标闪烁定位到分钟位置

{

write_com(0x80+4);

}

if(key1num==3)//第三次按下光标闪烁定位到小时位置{

write_com(0x80+1);

}

if(key1num==4)//第四次按下光标闪烁定位到日位置{

write_com(0x80+0x49);

}

if(key1num==5)//第五次按下光标闪烁定位到月位置{

write_com(0x80+0x46);

}

if(key1num==6)//第六次按下光标闪烁定位到年2位置{

write_com(0x80+0x43);

}

if(key1num==7)//第七次按下光标闪烁定位到年1位置{

write_com(0x80+0x41);

}

if(key1num==8)//第八次按下光标闪烁定位到星期位置

{

write_com(0x80+0x4f);

}

if(key1num==9)//第九次按下

{

key1num=0;//记录按键数清零

write_com(0x0c);//取消光标闪烁

TR0=1; //启动定时器使时钟开始走

}

}

}

if(key1num!=0)//只有功能键被按下后,增加和减小键才有效{

if(key2==0)

{

delay(5);

if(key2==0)//增加键确认被按下

{

while(!key2);//按键释放

if(key1num==1)//若功能键第一次按下

{

sec++; //则调整秒加1

if(sec==60)//若满60后将清零

sec=0;

write_sfm(6,sec);//每调节一次送液晶显示一下

write_com(0x80+7);//显示位置重新回到调节处}

if(key1num==2)//若功能键第二次按下

{

min++;//则调整分钟加1

if(min==60)//若满60后将清零

min=0;

write_sfm(3,min);//每调节一次送液晶显示一下write_com(0x80+4);//显示位置重新回到调节处}

if(key1num==3)//若功能键第三次按下

{

hour++;//则调整小时加1

if(hour==24)//若满24后将清零

hour=0;

write_sfm(0,hour);;//每调节一次送液晶显示一下write_com(0x80+1);//显示位置重新回到调节处}

if(key1num==4)//若功能键第四次按下

{

day++;//则调整日加1

if(day>31)//若大于31后将置一

day=1;

write_sfm(0x48,day);//每调节一次送液晶显示一下write_com(0x80+0x48);//显示位置重新回到调节处}

if(key1num==5)//若功能键第五次按下

{

mon++;//则调整月加1

if(mon>12)//若大于12后将置一

mon=1;

write_sfm(0x45,mon);//每调节一次送液晶显示一下write_com(0x80+0x45);//显示位置重新回到调节处}

if(key1num==6)//若功能键第六次按下

{

ye2++;//则调整年加1

if(ye2==0x0a)//若满99后将清零

ye2=0;

year=ye1*100+ye2;

write_sfm(0x42,ye2);//每调节一次送液晶显示一下

write_com(0x80+0x42);//显示位置重新回到调节处}

if(key1num==7)//若功能键第七次按下

{

ye1++;//则调整年加100

if(ye1==0x0a)//若满99后将清零

ye1=0;

year=ye1*100+ye2;

write_sfm(0x40,ye1);//每调节一次送液晶显示一下

write_com(0x80+0x40);//显示位置重新回到调节处}

if(key1num==8)//若功能键第八次按下

{

week++;//则调整周加一

if(week>7)//若大于7后置一

week=1;

write_sfm(0x4f,week);//每调节一次送液晶显示一下

write_com(0x80+0x4f);//显示位置重新回到调节处}

}

}

if(key3==0)

{

delay(5);

if(key3==0)//确认减小键被按下

{

while(!key3);//按键释放

if(key1num==1)//若功能键第一次按下

{

sec--;//则调整秒减1

if(sec==-1)//若减到负数则将其重新设置为59

sec=59;

write_sfm(6,sec);//每调节一次送液晶显示一下

write_com(0x80+7);//显示位置重新回到调节处}

if(key1num==2)//若功能键第二次按下

{

min--;//则调整分钟减1

if(min==-1)//若减到负数则将其重新设置为59

min=59;

write_sfm(3,min);//每调节一次送液晶显示一下write_com(0x80+4);//显示位置重新回到调节处

}

if(key1num==3)//若功能键第三次按下

{

hour--;//则调整小时减1

if(hour==-1)//若减到负数则将其重新设置为23 hour=23;

write_sfm(0,hour);//每调节一次送液晶显示一下

write_com(0x80+1);//显示位置重新回到调节处

}

if(key1num==4)//若功能键第四次按下

{

day--;//则调整日减1

if(day==0)//若日为零时将置一

day=31;

write_sfm(0x48,day);//每调节一次送液晶显示一下write_com(0x80+0x49);//显示位置重新回到调节处}

if(key1num==5)//若功能键第五次按下

{

mon--;//则调整月减1

if(mon==0)//若月为零将置一

mon=12;

write_sfm(0x45,mon);//每调节一次送液晶显示一下write_com(0x80+0x45);//显示位置重新回到调节处}

if(key1num==6)//若功能键第六次按下

{

ye2--;//则调整年减1

if(ye2<0)//若小于零后将设置为99

ye2=99;

year=ye1*100+ye2;

write_sfm(0x42,ye2);//每调节一次送液晶显示一下write_com(0x80+0x42);//显示位置重新回到调节处}

if(key1num==7)//若功能键第七次按下

{

ye1--;//则调整年减100

if(ye1<0)//若小于零后将设置为99

ye1=99;

year=ye1*100+ye2;

write_sfm(0x40,ye1);//每调节一次送液晶显示一下write_com(0x80+0x40);//显示位置重新回到调节处}

if(key1num==8)//若功能键第八次按下

{

week--;//则调整周减一

if(week==0)//若等于0后将置7

week=7;

write_sfm(0x4f,week);//每调节一次送液晶显示一下

write_com(0x80+0x4f);//显示位置重新回到调节处}

}

}

}

if(keyE==0)

{

delay(5);

if(keyE==0)//确认功能键被按下

{

key2num++;//功能键按下次数记录

while(!keyE);//释放确认

if(key2num==1)//第一次被按下时

{

TR0=0; //关闭定时器

write_com(0x80+0x0f);//光标定位到秒位置

write_com(0x0f); //光标开始闪烁

}

if(key2num==2)//第二次按下光标闪烁定位到分钟位置

{

write_com(0x80+0x0c);

}

if(key2num==3)//第三次按下光标闪烁定位到小时位置

{

write_com(0x80+9);

}

if(key2num==4)//第八次按下

{

key2num=0;//记录按键数清零

write_com(0x0c);//取消光标闪烁

TR0=1; //启动定时器使时钟开始走

}

}

}

if(key2num!=0)//只有功能键被按下后,增加和减小键才有效{

if(key2==0)

{

delay(5);

if(key2==0)//增加键确认被按下

{

while(!key2);//按键释放

if(key2num==1)//若功能键第一次按下

{

miao++; //则调整秒加1

if(miao==60)//若满60后将清零

miao=0;

write_sfm(0x0e,miao);//每调节一次送液晶显示一下

write_com(0x80+0x0e);//显示位置重新回到调节处}

if(key2num==2)//若功能键第二次按下

{

fen++;//则调整分钟加1

if(fen==60)//若满60后将清零

fen=0;

write_sfm(0x0b,fen);//每调节一次送液晶显示一下

write_com(0x80+0x0b);//显示位置重新回到调节处}

if(key2num==3)//若功能键第三次按下

{

shi++;//则调整小时加1

if(shi==24)//若满24后将清零

shi=0;

write_sfm(8,shi);;//每调节一次送液晶显示一下

write_com(0x80+8);//显示位置重新回到调节处

}

}

}

if(key3==0)

{

delay(5);

if(key3==0)//确认减小键被按下

{

while(!key3);//按键释放

if(key2num==1)//若功能键第一次按下

{

miao--;//则调整秒减1

if(miao==-1)//若减到负数则将其重新设置为59

miao=59;

write_sfm(0x0e,miao);//每调节一次送液晶显示一下

单片机电子时钟程序

程序开始 ORG 0000H AJMP MAIN ORG 000BH AJMP CLOCK ORG 0100H 主程序开始: MAIN: MOV SP,#70H MOV 6EH,#00H ;显示缓存器初始值设定 MOV 6DH,#00H MOV 6CH,#00H MOV 6BH,#00H MOV 6AH,#00H MOV 69H,#00H MOV 50H,#00H ;秒,分,小时初始值设定 MOV 51H,#00H MOV 52H,#00H MOV DPTR,#0F003H ;8255端口定义,PA,PB为输出 MOV A,#80H MOVX @DPTR,A MOV 4FH,#00H MOV TMOD,#01H ;定时器T0及TL0,TH0初始值设定 MOV TH0,#3CH MOV TL0,#0B0H SETB EA ;开总中断 SETB ET0 ;开定时器中断 SETB TR0 循环程序开始,并显示时间: START: MOV A,50H LCALL BCD MOV 6AH,A ;显示秒十位 MOV 69H,B ;显示秒个位 MOV A,51H LCALL BCD MOV 6CH,A ;显示分十位 MOV 6BH,B ;显示分个位 MOV A,52H LCALL BCD ;调用十六进制至BCD码转换子程序 MOV 6EH,A MOV 6DH,B LCALL DIS ;调用显示子程序 LCALL KEY ;调用键盘子程序 AJMP START ;主程序结束

BCD: MOV B,#0AH ;BCD码转换子程序 DIV AB RET CLOCK: PUSH ACC ;保护现场 PUSH PSW CLR TR0 MOV TH0,#3CH ;定时参数重新设置 MOV TL0,#0B0H SETB TR0 INC 4FH ;100ms单元加1 MOV A,4FH CJNE A,#0AH,D0 ;100ms单元=10,就秒单元加1 MOV 4FH,#00H ;100ms单元内容清0 MOV A,50H ADD A,#01H ;秒单元加1 MOV 50H,A CJNE A,#3CH,D0 ;秒单元内容=60,则秒单元清0 MOV 50H,#00H MOV A,51H ;分,时单元代码 ADD A,#01H MOV 51H,A CJNE A,#3CH,D0 MOV 51H,#00H MOV A,52H ADD A,#01H LCALL RING ;报警子程序 MOV 52H,A CJNE A,#18H,D0 MOV 52H,#00H D0: POP PSW ;出栈,退出中断子程序 POP ACC RETI RING: MOV R3,A CLR P1.0 LCALL DELL50 SETB P1.0 LCALL DELL50 DJNZ R3,RING RET 键盘子程序: KEY: JB P1.7,MSET ;秒设定子程序 LCALL DELL ;防抖动延时 JB P1.7,MSET INC 50H

LCD1602汇编显示程序

;1602显示ABC LCD_RS EQU P2.5 LCD_RW EQU P2.6 LCD_EN EQU P2.7 LCD_DATA EQU P3 ;----------------- ORG0000H JMP START ORG0030H ;----------------- LCD: CALL LCD_INIT MOV A, #80H CALL LCD_WCMD MOV A, #'A' CALL LCD_WDATA MOV A, #'B' CALL LCD_WDATA MOV A, #'C' CALL LCD_WDATA AJMP$ ;---------------- DELAY5MS: MOV R6, #10 DL1:DJNZ R7, $ DJNZ R6, DL1 RET ;---------------- LCD_INIT: CALL DELAY5MS MOV A, #38H CALL LCD_WCMD CALL DELAY5MS

CALL DELAY5MS MOV A, #06H CALL LCD_WCMD MOV A, #01H CALL LCD_WCMD MOV A, #0CH CALL LCD_WCMD RET ;===================================== LCD_WCMD: CALL CHECKBUSY CLR LCD_RS JMP W_LCD ;---------------- LCD_WDATA: CALL CHECKBUSY SETB LCD_RS W_LCD: CLR LCD_RW MOV LCD_DATA, A SETB LCD_EN NOP CLR LCD_EN RET ;---------------- CHECKBUSY: PUSH ACC MOV LCD_DATA, #255 CLR LCD_RS SETB LCD_RW BUSYLOOP: SETB LCD_EN NOP MOV A, LCD_DATA CLR LCD_EN JB ACC.7, BUSYLOOP POP ACC RET

单片机电子时钟显示

单片机综合实验报告 题目:电子时钟(LCD)显示 班级: 0310405班 学号: 学生姓名:张金龙 指导老师:高林 2013年 6 月 17 日 一、实验内容: 以AT89C51单片机为核心的时钟,在LCD显示器上显示当前的时间: ●使用字符型LCD显示器显示当前时间。 ●显示格式为“时时:分分:秒秒”。 ●用4个功能键操作来设置当前时间,4个功能键接在P1.0~P1.3引脚上。 功能键K1~K4功能如下。 ●K1—进入设置现在的时间。 ●K2—设置小时。 ●K3—设置分钟。 ●K4—确认完成设置。 程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“00:00:00”,然后开始计时。 二、实验电路及功能说明 1)单片机主控制模块

以AT89C51单片机为核心进行一系列控制。 2)时钟显示模块 用1602为LCD显示模块,把对应的引脚和最小系统上的引脚相连, 连接后用初始化程序对其进行简单的功能测试。测试成功后即可为实 验所用,如图: 3)时间调整电路 用4个功能键操作来设置当前时间,4个功能键接在P1.0~P1.3引脚 上。功能键K1~K4功能如下。K1—进入设置现在的时间。K2—设 置小时。K3—设置分钟。K4—确认完成设置。如图: 三、实验程序流程图: 主程序: 时钟主程序流程 子程序:

保护现场 设置计数初值 1S到? (40H)=10? 0 (40H)(40H)+1 (40H)(41H)+1 (41H) (46H)=4? 0 (46H) (0)(47H) 恢复现场 返回 N N 中断服务流程图 (41H)=5? 0 (41H) (43H)=10? 0 (43H)(43H)+1 (43H)(44H)+1 (44H) (44H)=5? 0 (44H) (46H)+1 (46H) (47H)=2? (46H)+1 (46H) N N (46H)=10? 0 (46H) (47)+1 (47) N N 四、实验结果分析

单片机电子时钟汇编语言程序

51单片机架构下时钟控制程序 ;KEY A A键功能程序开启/关闭定时器 ;KEYB B键功能程序时值加1 ;KEYC C键功能程序分值加1 ;KEYD D键功能程序秒值加1 ;KEYE E键功能程序12/24时值转换 ;BEEP_BL整点报时 ;P0 显示接口 ;系统初始化程序**************************************************** KEY A EQU P3.0 ;单片机控制设置 KEYB EQU P3.1 ;单片机控制设置 KEYC EQU P3.2 ;单片机控制设置 KEYD EQU P3.3 ;单片机控制设置 KEYE EQU P3.4 ;单片机控制设置 BEEP EQU P3.7 ;单片机控制设置 ORG 0000H AJMP MAIN ;转到系统初始化程序 ORG 000BH AJMP PITO ;转到定时器0中断服务程序 ORG 0100H MAIN: MOV SP, #60H ;确立堆栈区 MOV TMOD, #01H ;设定定时器0为工作方式1 MOV TL0, #0DCH ;装计数器初值 MOV TH0, #0BH CLR 21H.0 CLR TR0 ; TR0置"0",定时关闭 SETB EA ; EA置"1",中断总允许 SETB ET0 ; ET0置"1",定时器0中断 ; 允许 MOV 30H, #10H ; 循环次数 MOV 7EH, #0AH ; P.点显示初始化 MOV R0, #79H MOV R1, #05H PP: MOV @R0, #0BH INC R0 DJNZ R1, PP MOV R0, #31H ; 时、分、秒值存储单元清零

单片机时钟程序

单片机时钟程序 #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 sbit KEY_ADD=P3^3; //定义按键输入端口 sbit KEY_DEC=P3^4; #define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换 sbit LATCH1=P2^2;//定义锁存使能端口段锁存 sbit LATCH2=P2^3;// 位锁存 unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9 unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码 unsigned char TempData[8]; //存储显示值的全局变量 unsigned char h,m,s; void DelayUs2x(unsigned char t);//函数声明 void DelayMs(unsigned char t); void Display(unsigned char FirstBit,unsigned char Num); void Init_Timer0(void); /*------------------------------------------------ 主函数 ------------------------------------------------*/

lcd1602按键显示程序

#include<> #include<> //包含_nop_()函数定义的头文件 typedef unsigned int uint ; typedef unsigned char uchar ; sbit RS=P2^0; //寄存器选择位,将RS位定义为引脚 sbit RW=P2^1; //读写选择位,将RW位定义为引脚 sbit E=P2^2; //使能信号位,将E位定义为引脚 sbit BF=P0^7; //忙碌标志位,,将BF位定义为引脚 " uchar keyscan(); void delay1ms(); void delay(unsigned char n); unsigned char BusyTest(void); void WriteInstruction (unsigned char dictate); void WriteAddress(unsigned char x); … void WriteData(unsigned char y); void LcdInitiate(void); void delay1ms() { unsigned char i,j; for(i=0;i<10;i++) for(j=0;j<33;j++); } ! void delay(unsigned char n) { unsigned char i; for(i=0;i

单片机时钟程序

首先要掌握lcd1602编程,红外遥控原理,当然,单片机基本的要懂得 此程序是用stc89c52单片机,所用的IO口程序有说明。 #include #define uchar unsigned char #define uint unsigned int #define tt 46080 //设置时间间隔,对应11.0592MHZ的晶振 sbit en=P3^4; sbit rs=P3^5; //用于控制1602 sbit rw=P3^6; sbit dula=P2^6; sbit wela=P2^7; //用于控制晶体管 sbit IRIN=P3^2; //红外接收器数据线IO口 bit L=1; uchar t,key=0,hh=0,mm=0,ss=0; uchar IRCOM[4]=0; //定义数组IRCOM,分别装解码后得到的数据 //IRCOM[0] 低8位地址码 //IRCOM[1] 高8位地址码 //IRCOM[2] 8位数据码 //IRCOM[3] 8位数据码的反码 uchar code table[]="Input password"; uchar code table1[]="Welcome to use!"; uchar code table2[]="Password error!"; uchar code wish[]="Happy every day!"; uchar code time[]="00:00:00"; uchar code loading[]="Loading..."; ///////////////////////////////////////////////////// void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=112;y>0;y--); //大约是1ms,因为单片机的时钟周期为11.0592mhz。} void write_com(uchar com) { rs=0; //指令 P0=com; //写指令函数

lcd1602显示程序

lcd1602显示程序 液晶显示简介①液晶显示原理 液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。 ②液晶显示器的分类 液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。除了黑白显示外,液晶显示器还有多灰度有彩色显示等。如果根据驱动方式来分,可以分为静态驱动(StaTIc)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(AcTIve Matrix)三种。 ③液晶显示器各种图形的显示原理: 线段的显示 点阵图形式液晶由MN个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共168=128个点组成,屏上6416个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。例如屏的第一行的亮暗由RAM区的000H00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。这就是LCD显示的基本原理。 字符的显示 用LCD显示一个字符时比较复杂,因为一个字符由68或88点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为1,其它的为0,为1的点亮,为0的不亮。这样一来就组成某个字符。但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显

单片机实现时钟的显示

单片机原理及系统课程设计 专业:电气工程及其自动化 班级:电气091 姓名: 学号: 指导教师: 2012 年 7月1日

1 引言 基于单片机课程的学习,在本次课程设计中利用单片机实现时钟的显示,利用键盘和门电路控制时间的调整,在设计上采用硬件计数与软件计数相结合的方式,并且定时器T0采用了中断方式。 2 系统方案及原理 本次课程设计是用80C51单片机CPU及接口电路设计一个数字时钟,其核心部件是80C51,时钟的显示采用6个共阴极LED显示灯,四个开关方便的对秒、分、时分别调整,保证功能完善,工作可靠。硬件方面:独立式键盘可以消除时间误差的和方便时间的调整;显示电路采用LED动态显示方式,共阴极端由P2口线控制,分为段选线和位选线,利用人的视觉停留达到显示的效果,段选线控制字符选择,位选线控制显示位的亮或暗,从而简化串行口线的连接。软件方面:四个键盘输入与门74LS21,其输出用作中断信号,当四个键盘有一个键按下后就会向CPU申请中断,这样就可以提高CPU 工作效率,达到调整时间的快速性与准确性;定时采用片内定时器定时,提高了电子时钟的准确度。显示电路可以采用点阵液晶显示模块(LED)。一上电,数码管显示的起始时间为0时0分0秒,也就是数码管显示000000,然后每过一秒,秒位加一,到9后10秒位加一,秒位回0.10秒位显示5,秒位显示9后一秒,分钟加一,秒位回0。以此类推,时钟显示的最大值位23小时59分钟59秒。 3 硬件设计 3.1 硬件原理图 根据要求,设计一个时钟。能够显示时间格式为时.分.秒,并且设置键盘,根据按键任意调整时间。利用8051内部定时器0与软件结合来实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将时字节清零。显示部分用共阴极的LED显示等显示。硬件原理图如图一所示。四个开关方便的对秒、分、时分别调整,保证功能完善,工作可靠,定时采用片内定时器定时,提高了电子时钟的准确度。根据题目要求设计的总体框图,如图1所示。

51单片机数码管时钟程序

本人初学51,编写简单时钟程序。仅供参考学习 #include #define uint unsigned int #define uchar unsigned char Uchar code table_d[16] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1 }; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0xef}; void delay(uint); unsigned long i,num,t=1; void main() { TMOD=0X01; TH0=(65536-10000)/256; TL0=(65536-10000)%256; EA=1; ET0=1; TR0=1; while(1) { num=i/20;//i为秒位 if(i==1728000)//一天大概是这个秒吧,,,应该是,呵呵。就是世间到24时就归零。 i=0; //也可用下面这个部分来代替上面的。 /*if(i==20) { i=0; num++; if(num==5184000) num=0; }*/ //num=9; P2=7;//P2口为数码管控制端,我的是38译码器控制,就直接对其赋值来控制时,分,秒的显示; P0=table[i%100%10]; delay(t); P2=6; P0=table[i%100/10]; delay(t); P0=table_d[(num%60)%10]; P2=5; delay(t); P0=table[(num%60)/10]; P2=4;

已经采用过-LCD1602显示字符和(RAM)数字的汇编程序

单片机LCD1602显示字符和数字的汇编程序(无聊原创) 1,单片机和LCD1602的连线,和程序结果显示如下图: 2,LCD第一行显示字符XIAORENGUANG第二行显示RAM中40H到46H中的数字。程序如下: ORG 0000H AJMP MAIN RS EQU P2.4 RW EQU P2.5 E EQU P2.6 MAIN: MOV SP,#60H MOV 40H,#01H MOV 41H,#02H MOV 42H,#03H MOV 43H,#04H MOV 44H,#05H MOV 45H,#06H MOV 46H,#07H ACALL DD1 ;DD1是LCD初始化

MOV DPTR,#TABLE1 ACALL DD2;DD2是LCD第一行显示TABLE1 ACALL PPP ;PPP是LCD第二行显示RAM中40H到46H中的数据 SJMP $ DD1: MOV p0,#01H ;清屏 CALL ENABLE MOV p0,#38H ;显示功能 CALL ENABLE MOV p0,#0FH ;显示开关控制 CALL ENABLE MOV p0,#06H ;+1 CALL ENABLE RET DD2: MOV p0,#80H;第一行的开始位置 cALL ENABLE CALL WRITE1;到TABLE1取码? RET DD3: MOV p0,#0C0H;第二行的位置 CALL ENABLE CALL WRITE1;到TABLE2 取码 RET ENABLE: CLR RS ;送命令 CLR RW CLR E CALL DELAY SETB E RET WRITE1: MOV R1,#00H ;显示table中的值 A1: MOV A,R1;到table取码 MOVC A,@A+DPTR call wRITE2 ;显示到lcd INC R1 CJNE A,#00H,A1 ;是否到00h RET WRITE2:MOV p0,A ;显示 SETB RS CLR RW CLR E CALL DELAY SETB E RET

8位数码管显示电子时钟c51单片机程序

8位数码管显示电子时钟c51单片机程序 时间:2012-09-10 13:52:26 来源:作者: /* 8位数码管显示时间格式05—50—00 标示05点50分00秒 S1 用于小时加1操作 S2 用于小时减1操作 S3 用于分钟加1操作 S4 用于分钟减1操作 */ #include sbit KEY1=P3^0; //定义端口参数 sbit KEY2=P3^1; sbit KEY3=P3^2; sbit KEY4=P3^3; sbit LED=P1^2; //定义指示灯参数 code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极数码管0—9 unsigned char StrTab[8]; //定义缓冲区 unsigned char minute=19,hour=23,second; //定义并初始化为12:30:00 void delay(unsigned intt) { while(--cnt); } /******************************************************************/ /* 显示处理函数 */ /******************************************************************/ void Displaypro(void) { StrTab[0]=tab[hour/10]; //显示小时 StrTab[1]=tab[hour%10]; StrTab[2]=0x40; //显示"-" StrTab[3]=tab[minute/10]; //显示分钟 StrTab[4]=tab[minute%10]; StrTab[5]=0x40; //显示"-" StrTab[6]=tab[second/10]; //显示秒 StrTab[7]=tab[second%10]; } main()

51单片机时钟程序

51单片机时钟程序 #include #define uint unsigned int #define uchar unsigned char uchar code duan[]= {0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,}; uchar code we[]={0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff,}; uint z; void display(uchar miao,uchar fen,uchar xiaoshi); uchar t=0,miao,fen,xiaoshi,shi1,ge1,shi2,ge2,shi,ge,a; void delay(uint z) { uint x,y; for(x=80;x>0;x--) for(y=z;y>0;y--); } void InitTimer0() { TMOD=0x01; TH0=0x3C; TL0=0x0B0; EA=1; ET0=1; TR0=1; } void Timer0Interrupt() interrupt 1 { TH0=0x3C;

TL0=0x0B0; t++; } void main() { InitTimer0(); miao=0; fen=10; xiaoshi=21; while(1) { if(t==20) { t=0; miao++; if(miao==60) { miao=0; fen++; if(fen==60) { fen=0; xiaoshi++; if(xiaoshi==24)

基于单片机的数字时钟程序

钟〔★〕这里用了两种编写方法(即汇编语言与C语言) (1.开机时,显示12:00:00的时间开始计时; (2.P0.0/AD0控制“秒”的调整,每按一次加1秒; (3.P0.1/AD1控制“分”的调整,每按一次加1分; (4.P0.2/AD2控制“时”的调整,每按一次加1个小时; 2.电路原理图 3.系统板上硬件连线 (1.把“单片机系统”区域中的P1.0-P1.7端口用8芯排线连接到“动态数码显示”区域中的A-H端口上; (2.把“单片机系统:区域中的P3.0-P3.7端口用8芯排线连接到“动态数码显示”区域中的S1-S8端口上; (3.把“单片机系统”区域中的P0.0/AD0、P0.1/AD1、P0.2/AD2端口分别用导线连接到“独立式键盘”区域中的SP3、SP2、SP1端口上; 4.相关基本知识 (1.动态数码显示的方法 (2.独立式按键识别过程 (3.“时”,“分”,“秒”数据送出显示处理方法 5.程序框图 6.汇编源程序 SECOND EQU 30H MINITE EQU 31H HOUR EQU 32H HOURK BIT P0.0 MINITEK BIT P0.1 SECONDK BIT P0.2 DISPBUF EQU 40H DISPBIT EQU 48H T2SCNTA EQU 49H T2SCNTB EQU 4AH TEMP EQU 4BH ORG 00H LJMP START ORG 0BH LJMP INT_T0 START: MOV SECOND,#00H MOV MINITE,#00H MOV HOUR,#12 MOV DISPBIT,#00H MOV T2SCNTA,#00H MOV T2SCNTB,#00H MOV TEMP,#0FEH LCALL DISP

lcd1602液晶封装函数

//端口定义 #define DBPort P0 //LCD数据端口 sbit LcdRs = P2^0; sbit LcdRw = P2^1; sbit LcdEn = P2^2; sbit Lcdbf = P0^7; //LCD忙标志Busy Flag void delay(unsigned int t) //延时 { while(t--); } void LCD_Wait(void) //读忙状态 { LcdRs=0; LcdRw=1; LcdEn=1;delay(10);LcdEn=0; //下降沿 while(Lcdbf) { LcdEn=0;LcdEn=1; //仿真才需要此语句,实际硬件中不需要} } void LCD_Write(bit style, unsigned char input) //写数据1/命令0 { LcdRs=style; LcdRw=0; DBPort=input; LcdEn=1;delay(10);LcdEn=0; LCD_Wait(); } void LCD_Initial(void) //初始化LCD { LCD_Write(0,0x38); //8位数据端口,2行显示,5*7点阵 delay(300); LCD_Write(0,0x0c); //显示模式 LCD_Write(0,0x01); //清屏 LCD_Write(0,0x06); //输入模式 } void GotoXY(unsigned char x, unsigned char y) //移动光标到指定位置{ if(y==0) LCD_Write(0,0x80|x);

单片机电子时钟设计(内含源程序和电路图仿真地址)

课程名称:单片机课程设计 设计题目:电子时钟设计 院系:电气工程系 专业:电子信息工程 年级:***** 姓名:* * * 指导教师:* * * 西南交通大学峨眉校区 2012年6月15日

课程设计任务书 专业电子信息工程姓名*** 学号******** 开题日期:2012 年3 月1 日完成日期:2012年6月15 日题目电子时钟设计 一、设计的目的 单片计算机即单片微型计算机。由RAM ,ROM,CPU构成,定时,计数和多种接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。而51系列单片机是各单片机中最为典型和最有代表性的一种。这次课程设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。 二、设计的内容及要求 ●在数码管通过一个控制键转换来显示相应的时间和日期; ●能通过多个控制键用来实现时间和日期的调节; ●熟练运用应用keil软件实现单片机电子时钟系统的程序设计,用Proteus 的ISIS软件实现仿真。 三、指导教师评语 四、成绩 指导教师(签章) 年月日

摘要 单片计算机即单片微型计算机。由RAM ,ROM,CPU构成,定时,计数和多种接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。而51系列单片机是各单片机中最为典型和最有代表性的一种。这次课程设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。 本设计主要设计了一个基于AT89C51单片机的电子时钟。在数码管通过一个控制键转换来显示相应的时间和日期。并通过多个控制键用来实现时间和日期的调节。应用keil软件实现单片机电子时钟系统的程序设计,用Proteus的ISIS软件实现仿真。该方法仿真效果真实、准确,节省了硬件资源。 关键字:单片机时钟键盘控制 (电路图仿真地址:https://www.360docs.net/doc/126231750.html,/file/e70jgofp) 一、电子时钟 1.1电子时钟简介 1957年,Ventura发明了世界上第一个电子表,从而奠定了电子时钟的基础,电子时钟开始迅速发展起来。现代的电子时钟是基于单片机的一种计时工具,采用延时程序产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零。从而达到计时的功能,是人民日常生活补课缺少的工具。 1.2 电子时钟的基本特点 现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调试,数字式电子钟用集成电路计时,译码代替机械式传动,用LED显示器代替指针显示进而显示时间和日期,减小了误差,这种表具有时、分、秒显示时间的功能和年月日显示日期的功能,还可以进行校对,片选的灵活性好。

1602液晶显示计算器电路图及程序

#include #include #include #include unsigned char code Error[]={"error"}; unsigned char code Systemerror[]={"system error"}; unsigned char code Lcd[]={"lcd calculate"}; char str[16]; sbit RS=P2^0; sbit RW=P2^1; sbit E=P2^2; sbit BF=P0^7; /*********************** 函数功能:延时1ms ***********************/ void delay1ms() { unsigned char i,j; for (i=0;i<10;i++) for (j=0;j<33;j++) ; } /************************ 函数功能:延时n毫秒 入口参数:n ************************/ void delaynms(unsigned char n) { unsigned char i; for (i=0;i

基于-单片机的电子时钟设计报告(LCD显示)

单片机原理及应用课程设计任务书 题目:电子时钟(LCD显示) 1、设计要求以AT89C51单片机为核心的时钟,在LCD显示器上显示当前的时间: 使用字符型LCD显示器显示当前时间。显示格式为“时时:分分:秒秒”。用3个功能键操作来设置当前时间。功能键K1~K4功能下。 K1—设置小时。 K2—设置分钟。 K3—设置秒。 程序执行后工作指示灯LED发光,表示程序开始执行,LCD显示“23:59:00”,然后开始计时。 2、工作原理 本课题难点在于键盘的指令输入,由于每个按键都具有相应的一种功能,程序中有较多的循环结构用以判断按键是否按下,以及判断按键是否抬起,以及LCD显示器的初始化。 3、参考电路 硬件设计电路图如下图所示: 硬件电路原理图 单片机原理及应用课程设计任务书

题目:电子时钟(LCD显示) 1、设计要求以AT89C51单片机为核心的时钟,在LCD显示器上显示当前的时间: 使用字符型LCD显示器显示当前时间。显示格式为“时时:分分:秒秒”。用3个功能键操作来设置当前时间。功能键K1~K4功能下。 K1—设置小时。 K2—设置分钟。 K3—设置秒。 程序执行后工作指示灯LED发光,表示程序开始执行,LCD显示“23:59:00”,然后开始计时。 2、工作原理 本课题难点在于键盘的指令输入,由于每个按键都具有相应的一种功能,程序中有较多的循环结构用以判断按键是否按下,以及判断按键是否抬起,以及LCD显示器的初始化。 3、参考电路 硬件设计电路图如下图所示: 硬件电路原理图 基于AT89C51单片机的电子时钟设计报告

一、设计要求与目的 1)设计要求以AT89C51单片机为核心的时钟,在LCD显示器上显示当前的时间。 2)、使用字符型LCD显示器显示当前时间。显示格式为“时时:分分:秒秒”。3)、用3个功能键操作来设置当前时间。 4)、熟悉掌握proteus编成软件以及keil软件的使用 二、本设计原理 本设计以AT89C51单片机为核心,通过时钟程序的编写,并在LCD显示器上显示出来。该编程的核心在于定时器中断及循环往复判断是否有按键操作,并对每个按键的操作在LCD显示器上作出相应的反应。由于LCD显示器每八位对应一个字符,故把秒、分、时的个位和十位分开表示。 该课题中有三个控制开关KM1、KM2、KM3分别控制时、分、秒的调整,时间按递增的方式调整,每点一次按钮则相应的时间个位加以,且时间调整不干扰其他为调整时间的显示。 三、硬件设计原理(电路) 硬件电路原理图

51单片机控制1602LCD显示程序

LCD显示电路 #include sbit RS=P3^7; //寄存器选择位,将RS位定义为P2.0引脚 sbit RW=P3^6; //读写选择位,将RW位定义为P2.1引脚 sbit E=P2^7; //使能信号位,将E位定义为P2.2引脚 sbit BF=P0^7; //忙碌标志位,将BF位定义为P0.7引脚 #define Lcd_Data P0 #include #include //包含_nop_()函数定义的头文件 unsigned char code string1[ ]= {0x77,0x75,0x20,0x79,0x61,0x6E,0x67,0x20,0x79,0x61,0x6E,0x67,0x20,0x20,0x20,0x20}; //第一行显示的字符 void Lcd_delay1ms() // 函数功能:延时1ms //注:不同单片机不同晶振需要对此函数进行修改 { unsigned char i,j; for(i=0;i<90;i++) for(j=0;j<33;j++); } void Lcd_delay(unsigned int n) // 函数功能:延时若干毫秒,入口参数:n { unsigned int i; for(i=0;i

/***************************************************** 函数功能:判断液晶模块的忙碌状态 返回值:result。result=1,忙碌;result=0,不忙 ***************************************************/ bit Lcd_BusyTest(void) { bit result; RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1; //E=1,才允许读写 _nop_(); //空操作 _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 result=BF; //将忙碌标志电平赋给result E=0; return result; } /***************************************************** 函数功能:将模式设置指令或显示地址写入液晶模块 入口参数:dictate ***************************************************/ void Lcd_WriteCom (unsigned char dictate) { while(Lcd_BusyTest()==1); //如果忙就等待 RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令RW=0; E=0; //E置低电平(写指令时就是让E从0到1发生正跳变,所以应先置"0" _nop_(); _nop_(); //空操作两个机器周期,给硬件反应时间 Lcd_Data=dictate; //将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=1; //E置高电平 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令} /***************************************************** 函数功能:指定字符显示的实际地址 入口参数:x

LCD1602显示屏地驱动设置及例程

LCD1602显示屏的驱动设置及例程 一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线K(16脚)。我手里这块LCD1602的型号是HJ1602A,是绘晶科 技公司的产品,它有16条引脚。如图1所示: 图1 再来一张它的背面的,如图2所示: 引脚号符号引脚说明引脚号符号引脚说明 1 VSS 电源地9 D 2 数据端口 2 VDD 电源正极10 D 3 数据端口 3 VO 偏压信号11 D 4 数据端口 4 RS 命令/数据12 D 5 数据端口 5 RW 读/写13 D 6 数据端口 6 E 使能14 D 7 数据端口 7 D0 数据端口15 A 背光正极

图3

图4 二.基本操作 LCD1602的基本操作分为四种: 1. 读状态:输入RS=0,RW=1,E=高脉冲。输出:D0—D7为状态字。 2. 读数据:输入RS=1,RW=1,E=高脉冲。输出:D0—D7为数据。 3. 写命令:输入RS=0,RW=0,E=高脉冲。输出:无。 4. 写数据:输入RS=1,RW=0,E=高脉冲。输出:无。 读操作时序图(如图5): 图5 写操作时序图(如图6):

图6 时序时间参数(如图7): 图7 三.DDRAM、CGROM和CGRAM DDRAM(Display Data RAM)就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下(如图8): 图8 DDRAM相当于计算机的显存,我们为了在屏幕上显示字符,就把字符代码送入显存,这样该字符就可以显示在屏幕上了。同样LCD1602共有80个字节的显存,即DDRAM。但L CD1602的显示屏幕只有16×2大小,因此,并不是所有写入DDRAM的字符代码都能在屏幕上显示出来,只有写在上图所示范围内的字符才可以显示出来,写在范围外的字符不

相关文档
最新文档