|
用52單片機(jī)做作息時間控制器
用protues仿真發(fā)現(xiàn)時間顯示界面可以正常修改,但是切換到鬧鐘設(shè)置界面
時鐘顯示I5-I5,且不能修改,請問這是為什么呢
#include "lcd1602.h"
/*******************************************************************************
* 函 數(shù) 名 : lcd1602_write_cmd
* 函數(shù)功能 : LCD1602寫命令
* 輸 入 : cmd:指令
* 輸 出 : 無
*******************************************************************************/
#if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCD
void lcd1602_write_cmd(u8 cmd)
{
LCD1602_RS=0;//選擇命令
LCD1602_RW=0;//選擇寫
LCD1602_E=0;
LCD1602_DATAPORT=cmd;//準(zhǔn)備命令
delay_ms(1);
LCD1602_E=1;//使能腳E先上升沿寫入
delay_ms(1);
LCD1602_E=0;//使能腳E后負(fù)跳變完成寫入
}
#else //4位LCD
void lcd1602_write_cmd(u8 cmd)
{
LCD1602_RS=0;//選擇命令
LCD1602_RW=0;//選擇寫
LCD1602_E=0;
LCD1602_DATAPORT=cmd;//準(zhǔn)備命令
delay_ms(1);
LCD1602_E=1;//使能腳E先上升沿寫入
delay_ms(1);
LCD1602_E=0;//使能腳E后負(fù)跳變完成寫入
LCD1602_DATAPORT=cmd<<4;//準(zhǔn)備命令
delay_ms(1);
LCD1602_E=1;//使能腳E先上升沿寫入
delay_ms(1);
LCD1602_E=0;//使能腳E后負(fù)跳變完成寫入
}
#endif
/*******************************************************************************
* 函 數(shù) 名 : lcd1602_write_data
* 函數(shù)功能 : LCD1602寫數(shù)據(jù)
* 輸 入 : dat:數(shù)據(jù)
* 輸 出 : 無
*******************************************************************************/
#if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCD
void lcd1602_write_data(u8 dat)
{
LCD1602_RS=1;//選擇數(shù)據(jù)
LCD1602_RW=0;//選擇寫
LCD1602_E=0;
LCD1602_DATAPORT=dat;//準(zhǔn)備數(shù)據(jù)
delay_ms(1);
LCD1602_E=1;//使能腳E先上升沿寫入
delay_ms(1);
LCD1602_E=0;//使能腳E后負(fù)跳變完成寫入
}
#else
void lcd1602_write_data(u8 dat)
{
LCD1602_RS=1;//選擇數(shù)據(jù)
LCD1602_RW=0;//選擇寫
LCD1602_E=0;
LCD1602_DATAPORT=dat;//準(zhǔn)備數(shù)據(jù)
delay_ms(1);
LCD1602_E=1;//使能腳E先上升沿寫入
delay_ms(1);
LCD1602_E=0;//使能腳E后負(fù)跳變完成寫入
LCD1602_DATAPORT=dat<<4;//準(zhǔn)備數(shù)據(jù)
delay_ms(1);
LCD1602_E=1;//使能腳E先上升沿寫入
delay_ms(1);
LCD1602_E=0;//使能腳E后負(fù)跳變完成寫入
}
#endif
/*******************************************************************************
* 函 數(shù) 名 : lcd1602_init
* 函數(shù)功能 : LCD1602初始化
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
#if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCD
void lcd1602_init(void)
{
lcd1602_write_cmd(0x38);//數(shù)據(jù)總線8位,顯示2行,5*7點陣/字符
lcd1602_write_cmd(0x0c);//顯示功能開,無光標(biāo),光標(biāo)閃爍
lcd1602_write_cmd(0x06);//寫入新數(shù)據(jù)后光標(biāo)右移,顯示屏不移動
lcd1602_write_cmd(0x01);//清屏
}
#else
void lcd1602_init(void)
{
lcd1602_write_cmd(0x28);//數(shù)據(jù)總線4位,顯示2行,5*7點陣/字符
lcd1602_write_cmd(0x0c);//顯示功能開,無光標(biāo),光標(biāo)閃爍
lcd1602_write_cmd(0x06);//寫入新數(shù)據(jù)后光標(biāo)右移,顯示屏不移動
lcd1602_write_cmd(0x01);//清屏
}
#endif
/*******************************************************************************
* 函 數(shù) 名 : lcd1602_clear
* 函數(shù)功能 : LCD1602清屏
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void lcd1602_clear(void)
{
lcd1602_write_cmd(0x01);
}
/*******************************************************************************
* 函 數(shù) 名 : lcd1602_show_string
* 函數(shù)功能 : LCD1602顯示字符
* 輸 入 : x,y:顯示坐標(biāo),x=0~15,y=0~1;
str:顯示字符串
* 輸 出 : 無
*******************************************************************************/
void lcd1602_show_string(u8 x,u8 y,u8 *str)
{
u8 i=0;
if(y>1||x>15)return;//行列參數(shù)不對則強(qiáng)制退出
if(y<1) //第1行顯示
{
while(*str!='\0')//字符串是以'\0'結(jié)尾,只要前面有內(nèi)容就顯示
{
if(i<16-x)//如果字符長度超過第一行顯示范圍,則在第二行繼續(xù)顯示
{
lcd1602_write_cmd(0x80+i+x);//第一行顯示地址設(shè)置
}
else
{
lcd1602_write_cmd(0x40+0x80+i+x-16);//第二行顯示地址設(shè)置
}
lcd1602_write_data(*str);//顯示內(nèi)容
str++;//指針遞增
i++;
}
}
else //第2行顯示
{
while(*str!='\0')
{
if(i<16-x) //如果字符長度超過第二行顯示范圍,則在第一行繼續(xù)顯示
{
lcd1602_write_cmd(0x80+0x40+i+x);
}
else
{
lcd1602_write_cmd(0x80+i+x-16);
}
lcd1602_write_data(*str);
str++;
i++;
}
}
}
#ifndef _lcd1602_H
#define _lcd1602_H
#include "public.h"
//LCD1602數(shù)據(jù)口4位和8位定義,若為1,則為LCD1602四位數(shù)據(jù)口驅(qū)動,反之為8位
#define LCD1602_4OR8_DATA_INTERFACE 0 //默認(rèn)使用8位數(shù)據(jù)口LCD1602
//管腳定義
//sbit LCD1602_RS=P2^6;//數(shù)據(jù)命令選擇
//sbit LCD1602_RW=P2^5;//讀寫選擇
//sbit LCD1602_E=P2^7; //使能信號
sbit LCD1602_RS=P2^0;//數(shù)據(jù)命令選擇
sbit LCD1602_RW=P2^1;//讀寫選擇
sbit LCD1602_E=P2^2; //使能信號
#define LCD1602_DATAPORT P0 //宏定義LCD1602數(shù)據(jù)端口
//函數(shù)聲明
void lcd1602_init(void);
void lcd1602_clear(void);
void lcd1602_show_string(u8 x,u8 y,u8 *str);
#endif
#ifndef __TIME_H
#define __TIME_H
#include "public.h"
void time0_init(void);
#endif
#include "time.h"
void time0_init(void)
{
TMOD|=0X01;
TH0=0xDC;
TL0=0x00;//定時10ms
ET0=1;
EA=1;
TR0=1;
}
|
|