#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^0;// LCD寄存器选择位,定义P2^0口为RS
sbit RW=P2^1;// LCD读写选择位
sbit EN=P2^2;// LCD使能信号位
unsigned char character1[8] = {0x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0x00}, //日
character2[8] = {0x00,0x1f,0x14,0x1f,0x15,0x15,0x19,0x00}; //历
uchar time[]= " 12:30:00 ";
uchar date[]=" 2011-05-24 ";
uchar pinlv[]="Pinlv 000000Hz";
volatile unsigned int pin,n;//声明可在中断中可改变的量
volatile unsigned long f=0;//声明可在中断中可改变的量,为所测频率
int k,l; //两个全局变量,用来切换模式
uchar Hour =12, Minute =30, Second =0,Day=24,Month=5,Year=11,left=20,a=0,b=0,c=0,d=0,e=0;
sbit KC1 = P1^4;
sbit KC2 = P1^5;
sbit KC3 = P1^6;
sbit KR1 = P1^0;
sbit KR2 = P1^1;
sbit KR3 = P1^2;
sbit KR4 = P1^3;
//延时
void delay(int dly)
{
int i,j;
for(j=dly;j>0;j--)
for(i=0;i<120;i++);
}
//忙检查
uchar Busy_Check()
{
uchar LCD_Status; //定义LCD_Status为函数返回值
RS=0; //为零时输入指令
RW=1; //从LCD读取信息
EN=1; //开始读
delay(1); //延时使LCD有足够时间接收信号
LCD_Status=P0; //记下高八位数
EN=0; //EN恢复初值
return LCD_Status;
}
//写LCD命令
void Write_LCD_Command(uchar cmd,busy)
{ if (busy) Busy_Check(); //根据需要检测忙
RS=0; //为零时输入指令
RW=0; //为零时写入指令
EN=0;
P0=cmd; //将指令送到P0口
EN=1;delay(1);EN=0; //E恢复初值
}
//发送数据
void Write_LCD_Data(uchar dat)
{
while(Busy_Check==1); //忙等待
RS=1; //为1时输入数据
RW=0; //为零时写入数据
EN=0;
P0=dat; //将数据送到P0口
EN=1; //使其产生下降沿,从而写入数据
delay(1);
EN=0; //使其产生下降沿,从而执行指令
}
//LCD初始化
void Initialize_LCD()
{
Write_LCD_Command(0x38,0);delay(1);
Write_LCD_Command(0x01,1);delay(1); //清屏
Write_LCD_Command(0x06,1);delay(1); //字符进入模式:屏幕不动,字符后移
Write_LCD_Command(0x0c,1);delay(1); //显示开,光标关
}
//显示字符串
void ShowString(uchar x,uchar y,uchar *str)
{
uchar i=0;
if(y==0) Write_LCD_Command(0x80|x,1); //设置显示起始位置
if(y==1) Write_LCD_Command(0xc0|x,1);
if(y==2) Write_LCD_Command(0x90|x,1);
if(y==3) Write_LCD_Command(0xd0|x,1);
for(i=0;i<16;i++) //输出字符串
{
Write_LCD_Data(str[i]);
}
}
void displaytime()
{
time[5]= Hour / 10 + '0';
time[6]= Hour % 10 + '0';
time[8]= Minute / 10 + '0';
time[9]= Minute % 10 + '0';
time[11]= Second / 10 + '0';
time[12] = Second % 10 + '0';
}
void displaydate()
{
date[10] =Month/10+ '0';
date[11] =Month%10+ '0';
date[13] =Day/10+ '0';
date[14] =Day%10+ '0';
}
void jinwei(void)//进位函数,实现时间,日历,倒计时的进位
{
if(n>=100) //n=100*0.01=1s
{
n=0; //n清0
Second++; //实现秒自加1
}
if (Second == 60) //如果秒加到60
{
Second =0; //秒清0
Minute++; //实现分自加1
}
if(Minute == 60)
{
Minute = 0;
Hour++;
}
if(Hour == 24)
{
Hour = 0;Minute = 0;Second = 0;
}
if(Month==13)
{
Month=1;//月份如果加到13,月变为1
}
if(Day==32)
{
Day=1;
}
}
//获得键值函数,采用行列扫描法
char keyget(void)
{
unsigned char ucRt; //返回键值
ucRt=0;
while (1)
{
//所有列线设为输入状态
KC1=1;
KC2=1;
KC3=1;
//所有行线设为高电平
KR1=1;
KR2=1;
KR3=1;
KR4=1;
//扫描第一行
KR1=0; //将KR1清0
if (KC1==0){ //如果KC1==0,说明“1”已按下
ucRt=1; //键值为1
}
if (KC2==0){
ucRt=2;
}
if (KC3==0){
ucRt=3;
}
KR1=1;
KR2=0;
if (KC1==0){
ucRt=4;
}
if (KC2==0){
ucRt=5;
}
if (KC3==0){
ucRt=6;
}
KR2=1;
KR3=0;
if (KC1==0){
ucRt=7;
}
if (KC2==0){
ucRt=8;
}
if (KC3==0){
ucRt=9;
}
KR3=1;
KR4=0;
if (KC1==0){
l=1;
}
if (KC2==0){
ucRt=10;
}
if (KC3==0){
k=1;
}
KR4=1;
return ucRt;
}
}
void T1init(void) //定时器初始化
{
TMOD=0x11;
TL1=0x00;
TH1=0xdc;
ET1=1;
EA=1;
TR1=1;
}
void ISR_INT0(void) interrupt 0
{
if(pin<=100)//当为1秒时,停止计数
f++;
}
void INT0init(void)
{
IT0=1; //下降沿触发
}
void T0init(void)
{ //计数初值m=2^16-f(osc)*0.01/12=dc00
TMOD=(TMOD&0xF0)|0x01;//选择模式1
TH0=0xdc; //一秒钟中断100次
TL0=0x00;
TR0=1; //启动定时器
}
void ISR_T0(void) interrupt 1
{
TH0=0xdc; //一秒中断100次
TL0=0x00;
pin++; //中断一次加一次
}
void ISR_T1() interrupt 3
{
TH1=0xdc;
TL1=0x00;
n++;
}
int displayfren()
{
int a,b,c,d,e;
a=f%10000%1000%100%10;//得到频率个位
b=f%10000%1000%100/10; //得到频率十位
c=f%10000%1000/100; //得到频率百位
d=f%10000/1000; //得到频率千位
e=f/10000; //得到频率万位
pinlv[11]=a+ '0';
pinlv[10]=b+ '0';
pinlv[9]=c+ '0';
pinlv[8]=d+ '0';
pinlv[7]=e+ '0';
}
/******************************************
**********/
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
if(Y==0) Write_LCD_Command(0x80|X); //设置显示起始位置
if(Y==1) Write_LCD_Command(0xc0|X);
if(Y==2) Write_LCD_Command(0x90|X); //设置显示起始位置
if(Y==3) Write_LCD_Command(0xD0|X);
Write_LCD_Data(DData);
}
//=====================================================================================
//显示自定义字符
//void mychar(char xx,char yy,unsigned char *character,unsigned char saveto)
//说明:xx(0-15):为x参数.yy(0-1):y参数.character:要显示的字符的列表地址,在程序前面有定义
//saveto(1-7)为字符保存的RAM,每屏最多显示7个自定义字符
//(0x00-0x0h是自定义字符)
//=====================================================================================
void mychar(char xx,char yy,unsigned char *character,unsigned char saveto)
{
unsigned char add = (saveto<<3) | 0x40;
int i;
/*t=*(character+0);
Write_LCD_Command(add,0); //第1行
Write_LCD_Data(t);
t=*(character+1);
Write_LCD_Command(add+1,0); //第2行
Write_LCD_Data(t);
t=*(character+2);
Write_LCD_Command(add+2,0); //第3行
Write_LCD_Data(t);
t=*(character+3);
Write_LCD_Command(add+3,0); //第4行
Write_LCD_Data(t);
t=*(character+4);
Write_LCD_Command(add+4,0); //第5行
Write_LCD_Data(t);
t=*(character+5);
Write_LCD_Command(add+5,0); //第6行
Write_LCD_Data(t);
t=*(character+6);
Write_LCD_Command(add+6,0); //第7行
Write_LCD_Data(t);
t=*(character+7);
Write_LCD_Command(add+7,0); //第8行
Write_LCD_Data(t); */
for(i = 0;i<8;i++)
{
Write_LCD_Command(add+i, 0);
Write_LCD_Data(character[i]);
}
DisplayOneChar(xx,yy,saveto); //显示字符
}
/***************************************
********************/
//主程序
void main()
{
Initialize_LCD();
T0init();
T1init();//T1中断初始化
INT0init();//INIT中断初始化
while(1)
{
while(1)
{
ShowString(0,1,date);
ShowString(0,2,time);
delay(200);
jinwei();
displaydate();
displaytime();
mychar(0,0, character1,7);
mychar(1,0, character2,3);
switch(keyget())
{
case 1: Month++;break;
case 2: Month--;if(Month==0) Month=12; break;
case 3: Day++;break;
case 4: Day--; if(Day==0) Month=31; break;
case 5: Hour++;break;
case 6: Hour--;if(Hour==-1) Hour=23;break;
case 7: Minute++; break;
case 8: Minute--;if(Minute==0) Minute=59;break;
default:break;
}
if(k==1)
{
k=0;
break;
}
}
while(1)
{
ShowString(0,0,date);
ShowString(0,1,time);ShowString(0,2,pinlv);
delay(200);
displaydate();
displaytime();
jinwei();
没有合适的资源?快使用搜索试试~ 我知道了~
单片机8x8点阵电梯移动效果
共1171个文件
lst:128个
obj:102个
bak:97个
5星 · 超过95%的资源 需积分: 10 32 下载量 75 浏览量
2013-03-05
12:09:30
上传
评论
收藏 3.19MB ZIP 举报
温馨提示
这是我用c语言写的程序,用的是proutes仿真的电梯示数效果。我的其他资源都是免费的,是对于c语言初学者的帮助比较大的,其中有数据结构,window编程。我也在学c语言,每当我写完一个程序,我都会免费发上来。
资源推荐
资源详情
资源评论
收起资源包目录
单片机8x8点阵电梯移动效果 (1171个子文件)
01 17KB
01 14KB
01 12KB
01 10KB
01 10KB
01 10KB
01 9KB
01 8KB
01 7KB
01 7KB
01 7KB
01 5KB
01 5KB
01 5KB
01 3KB
01 3KB
01 3KB
01 3KB
01 2KB
01 2KB
01 2KB
0101 17KB
0101 17KB
0101 16KB
0101 16KB
0101 14KB
0101 14KB
0101 13KB
0101 12KB
0101 12KB
0101 12KB
0101 11KB
0101 11KB
0101 8KB
0101 8KB
0101 6KB
0101 5KB
0101 5KB
0101 5KB
0101 5KB
0101 4KB
0101 4KB
0101 3KB
0101 3KB
0101 3KB
0101 2KB
0101 2KB
02 2KB
03 2KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
STARTUP.A51 6KB
共 1171 条
- 1
- 2
- 3
- 4
- 5
- 6
- 12
资源评论
- zx1923262015-09-10不错,感觉还可以,有借鉴的地方
- kyozhu2014-04-23效果不错,赞一个
- a08dc5342014-06-23总体思路不错 程序貌似有点小问题
四夕立羽
- 粉丝: 1w+
- 资源: 275
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功