8
本帖最后由 yettt365 于 2013-5-18 19:28 编辑
刚写了一个可调时钟程序,用LCD1602显示的,分享一下
先上硬件图:
- /***************************
- *项目名称:LCD1602时钟;
- *编程时间:2013/05/17--18;
- *单 位:宁波大红鹰学院机电学院电气工程三班
- ****************************/
-
- /**程序头文件及数据类型**/
- #include
- #include
- typedef unsigned int uint16;
- typedef unsigned char uint8;
-
- /**LCD1602接口定义及其他**/
- #define LCD_DATA P0 /*液晶数据输入端*/
- ***it LCD_RS = P1^0; /*数据H/命令L选择端*/
- ***it LCD_RW = P1^1; /*读H/写L选择端*/
- ***it LCD_EN = P2^5; /*使能信号输入端*/
- ***it wela = P2^7; /*数码管位选*/
- ***it dula = P2^6; /*数码管段选*//*数码管接在P0口*/
- ***it K1 = P3^4; /*调时选择按键*/
- ***it K2 = P3^5; /*调时加数按键*/
- ***it K3 = P3^6; /*调时减数按键*/
- uint8 i,j;
- uint8 count ,shi,fen,miao; /*时间:时分秒*/
- uint8 K1num,K2num,K3num; /*按键次数*/
- /**液晶内容显示**/
- uint8 code table_1[] = " 2013/05/17 FR";
- uint8 code table_2[] = " 00:00:00";
-
- /*********调用函数声明*********/
- void Init(); /*初始化化函数*/
- void Delay_ms(uint16 z); /*延时函数*/
- void Stimer(); /*开定时器*/
- void Wtimer(uint8 ad,uint8 dat); /*时间显示*/
- void Keyscan(); /*调时独立按键*/
- /*LCD1602函数*/
- void LCDINIT(); /*LCD初始化*/
- void LCDWCOM(uint8 com); /*写指令*/
- void LCDWDAT(uint8 dat); /*写数据*/
- /*********调用函数声明*********/
- /******************************
- *函 数:主函数main()
- *功 能:
- *参 数: 无
- *返回值: 无
- *******************************/
- void main()
- {
- Init();
- LCDINIT();
- Stimer();
- while (1)
- {
- Keyscan();
- }
- }
-
- /******************************
- *函 数:初始化Init()
- *功 能:初始化
- *参 数: 无
- *返回值: 无
- *******************************/
- void Init()
- {
- P0 = 0x00;
- dula = 1;
- dula = 0;
- P0 = 0x00;
- wela = 1;
- wela = 0;
- }
- /******************************
- *函 数:延时Delay_ms()
- *功 能:实现软件延时
- *参 数: uint16 z
- *返回值: 无
- *******************************/
- void Delay_ms(uint16 z)
- {
- uint16 x,y;
- for (x = z; x > 0; x--)
- for (y = 125; y > 0; y--);
- }
- /******************************
- *函 数:Stimer()
- *功 能:开定时器
- *参 数: 无
- *返回值: 无
- *******************************/
- void Stimer()
- {
- TMOD = 0X01;
- TH0 = (65536 - 46080)/256; /*晶振11.0592MHz*/
- TL0 = (65536 - 46080)%256;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- /******************************
- *函 数:Timer0()
- *功 能:定时器0中断函数
- *参 数: 无
- *返回值: 无
- *******************************/
- void Timer0() interrupt 1
- {
- TH0 = (65536 - 46080)/256; /*晶振11.0592MHz*/
- TL0 = (65536 - 46080)%256;
- count++;
- if (20 == count)
- {
- count = 0;
- miao++;
- if (60 == miao)
- {
- miao = 0;
- fen++;
- if (60 == fen)
- {
- fen = 0;
- shi++;
- if (24 == shi)
- {
- shi = 0;
- }
- Wtimer(4,shi); /*显示小时*/
- }
- Wtimer(7,fen); /*显示分*/
- }
- Wtimer(10,miao); /*显示秒*/
-
-
-
- }
- }
- /******************************
- *函 数:Wtimer(uint8 ad,uint8 dat)
- *功 能:
- *参 数: 无
- *返回值: 无
- *******************************/
- void Wtimer(uint8 ad,uint8 dat)
- {
- uint8 sw,gw;
- sw = dat/10;
- gw = dat%10;
- LCDWCOM(0x80+0x40+ad);
- LCDWDAT(0x30+sw);
- LCDWDAT(0x30+gw);
- }
- /******************************
- *函 数:Keyscan()
- *功 能:调时独立按键
- *参 数: 无
- *返回值: 无
- *******************************/
- void Keyscan()
- {
- K1 = 1;
- K2 = 1;
- K3 = 1;
- if (0 == K1)
- {
- Delay_ms(5);
- if (0 == K1)
- {
- K1num++;
- while (!K1);
- if (1 == K1num)
- {
- TR0 = 0;
- LCDWCOM(0XC0+11);
- LCDWCOM(0X0F);
- }
-
- if (2 == K1num)
- {
- LCDWCOM(0XC0+8);
- }
-
- if (3 == K1num)
- {
- LCDWCOM(0XC0+5);
- }
-
- if (4 == K1num)
- {
- TR0 = 1;
- K1num = 0;
- LCDWCOM(0x0c);
- }
- }
- }
- if (0 != K1num)
- {
- if (0 == K2)
- {
- Delay_ms(5);
- while (!K2);
-
- if(1 == K1num)
- {
- miao++;
- if(60 == miao)
- miao = 0;
- LCDWCOM(0xc0+10);
- Wtimer(10,miao);
- LCDWCOM(0xc0+11);
- }
- if(2 == K1num)
- {
- fen++;
- if(60 == fen)
- fen = 0;
- LCDWCOM(0xc0+7);
- Wtimer(7,fen);
- LCDWCOM(0xc0+8);
- }
- if(3 == K1num)
- {
- shi++;
- if(24 == shi)
- shi = 0;
- LCDWCOM(0xc0+4);
- Wtimer(4,shi);
- LCDWCOM(0xc0+5);
- }
-
- }
- }
- if (0 != K1num)
- {
- if (0 == K3)
- {
- Delay_ms(5);
- while (!K3);
-
- if(1 == K1num)
- {
- miao--;
- if(255 == miao)
- miao = 59;
- LCDWCOM(0xc0+10);
- Wtimer(10,miao);
- LCDWCOM(0xc0+11);
- }
- if(2 == K1num)
- {
- fen--;
- if(255 == fen)
- fen = 59;
- LCDWCOM(0xc0+7);
- Wtimer(7,fen);
- LCDWCOM(0xc0+8);
- }
- if(3 == K1num)
- {
- shi--;
- if(255 == shi)
- shi = 23;
- LCDWCOM(0xc0+4);
- Wtimer(4,shi);
- LCDWCOM(0xc0+5);
- }
-
- }
- }
- }
- /******************************
- *函 数:LCDINIT()
- *功 能:LCD初始化
- *参 数: 无
- *返回值: 无
- *******************************/
- void LCDINIT()
- {
- LCDWCOM(0x38); /*开显示*/
- LCDWCOM(0x0c); /*光标显示闪烁0x0f,不闪烁0x0e,无光标0x0c*/
- LCDWCOM(0x06); /*指针光标加1*/
- LCDWCOM(0x01); /*数据清屏*/
- LCDWCOM(0X80); /*初始指针位置*/
- for (j = 0;j < 15;j++)
- {
- LCDWDAT(table_1[j]);
- }
- LCDWCOM(0Xc0); /*初始指针位置*/
- for (j = 0;j < 12;j++)
- {
- LCDWDAT(table_2[j]);
- }
- }
- /******************************
- *函 数:LCDWCOM()
- *功 能:写指令到LCD
- *参 数: com
- *返回值: 无
- *******************************/
- void LCDWCOM(uint8 com)
- {
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_EN = 0;
- LCD_DATA = com;
- Delay_ms(5);
- LCD_EN = 1;
- Delay_ms(5);
- LCD_EN = 0;
- }
- /******************************
- *函 数:LCDWDAT()
- *功 能:写数据到LCD
- *参 数: dat
- *返回值: 无
- *******************************/
- void LCDWDAT(uint8 dat)
- {
- LCD_RS = 1;
- LCD_RW =0;
- LCD_EN = 0;
- LCD_DATA = dat;
- Delay_ms(5);
- LCD_EN = 1;
- Delay_ms(5);
- LCD_EN = 0;
- }
复制代码
|
|