标题: 1602显示程序 [打印本页]
作者: stupidqq 时间: 2017-5-19 22:35
标题: 1602显示程序
#include"stc12c5a60s2.h"
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^5;
sbit rw=P2^6;
sbit E=P2^7;
bit shuaxin=1;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
uchar name[]="Name: Xuwenlei ";
uchar tim[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x53,0x4a}; //0~9和: S J
uchar i;
uchar shan;
uchar js50ms,second,minut,hour;
uchar s1,s2,m1,m2,h1,h2;
void delay(uchar x) //延时函数
{ uint y;
for(;x>0;x--)
{
for(y=100;y>0;y--)
{};
}
}
void LCD_wrdata(uchar dat) //写数据到LCD
{
delay(6);
rs=1; //写数据时RS拉高
rw=0;
E=1;
P0=dat;
delay(6);
E=0;
delay(6);
}
void LCD_wrcom(uchar cdat)//写指令到LCD
{
delay(6);
rs=0;//写指令时RS拉低
rw=0;
E=1;
P0=cdat;//
delay(6);//不加此延时将导致不能写入指令,但能写入显示数据
E=0;
delay(6);
}
void LCD_Clear() //清屏函数
{
LCD_wrcom(0x01);
delay(6);
}
void initiate() //1602初始化函数
{
LCD_wrcom(0x38); // 显示模式设置:16*2显示,5*7点阵,8位数据接口
LCD_wrcom(0x06); // 显示模式设置:显示开,有光标,光标闪烁
LCD_wrcom(0x0c); // 显示模式设置:光标右移,字符不移
}
void T0_init() //T0初始化
{
TMOD=0x01; //T0方式1
TH0=0x4c;
TL0=0x00; //50ms初值
TR0=1;
ET0=1;
EX0=1;
IT0=1;
EA=1;
}
void LCD_wirte_setring(uchar x,uchar y,uchar *s) //写字符串函数
{
if(y==0){LCD_wrcom( 0x80+x);}
else{LCD_wrcom( 0xc0+x);}
while(*s)
{
LCD_wrdata(*s);
s++;
}
}
void LCD_wirte_data(uchar x,uchar y,uchar dat) //写字符函数
{
if(y==0){LCD_wrcom( 0x80+x);}
else{LCD_wrcom( 0xc0+x);}
LCD_wrdata(dat);
}
void LCD_Time() //时间显示函数
{ s1=second%10; // 时间赋值 秒分时
s2=second/10;
m1=minut%10;
m2=minut/10;
h1=hour%10;
h2=hour/10;
LCD_wirte_data(6,1,tim[h2]);
LCD_wirte_data(7,1,tim[h1]);
LCD_wirte_data(8,1,tim[10]);
LCD_wirte_data(9,1,tim[m2]);
LCD_wirte_data(10,1,tim[m1]);
LCD_wirte_data(11,1,tim[10]);
LCD_wirte_data(12,1,tim[s2]);
LCD_wirte_data(13,1,s1+'0');
}
void key_can() interrupt 0
{
key1=1;key2=1; key3=1;key4=1;
if(key1==0){ shan++; TR0=0;
if(shan==4)shan=0 ;
switch(shan){
case 0: shan=0;TR0=1;
LCD_wrcom(0x0c);
LCD_wirte_setring(1,0,"Name:Xuwenlei ") ;
break;
case 1:
LCD_wirte_setring(1,0,"Name:hour ") ;
LCD_wrcom(0x0f);
delay(10);
break;
case 2:
LCD_wirte_setring(1,0,"Name:mint ") ;
LCD_wrcom(0x0f);
delay(10);
break;
case 3:
LCD_wirte_setring(1,0,"Name:second ") ;
LCD_wrcom(0x0f);
delay(10);
break;
}
}
// if(key2==0&&shan==1)
if(key2==0){
if(shan==1) { hour++; shuaxin=1; //h加1
if(hour==24){hour=0;} }
else if(shan==2){minut++; shuaxin=1;
if(minut==60){minut=0;} }
else if(shan==3){second++;shuaxin=1;
if(second==60){second=0; }
}
}
if(key3==0){
if(shan==1) { //h减1
if(hour==0){hour=24;}
hour--;shuaxin=1;
}
else if(shan==2){
if(minut==0){minut=60;}minut--;shuaxin=1;
}
else if(shan==3){
if(second==0){second=60;} second--;shuaxin=1;
}
}
}
void T0_intop() interrupt 1
{
TH0=0x4c;
TL0=0x00; //50ms初值重装
js50ms++;
if(js50ms==20) //1s
{
js50ms=0;
shuaxin=1;
second++;
if(second==60) //60s
{
second=0;
minut++;
if(minut==60) //60m
{
minut=0;
hour++;
if(hour==24) //60h
{
hour=0;
}
}
}
}
}
void main()
{
initiate(); // 调1602初始化函数
T0_init(); //T0 初始化
LCD_Clear(); //清屏
LCD_wirte_setring(1,0,"Name:Xuwenlei") ;
LCD_wirte_setring(1,1,"Time:") ;
while(1)
{
// { LCD_Time(); }
if(shuaxin)
{
shuaxin=0;
LCD_Time();
}
}
}
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |