EDN首页   博客首页

1

关于投票
[转]液晶滚动显示汉字(仿真)

点击开大图

转自www.proteus.com.cn

点击下载

如下载不了请留下E-mail,我会发给您~

系统分类: 单片机
用户分类: 仿真(Proteus+Keil)
标签: 汉字 Proteus 仿真
来源: 整理
发表评论 阅读全文(247) | 回复(2)

2

关于投票
1602液晶动态显示字符

做了一下1602的仿真,如下图,“I LIKE MCU! ARM.Craftor”从屏幕右边慢慢移动到左边。

C代码如下:

#include<reg52.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char

uchar code tab1[]="I LIKE MCU!";
uchar code tab2[]="ARM.Craftor";
uchar num,len1,len2;

sbit RS="P1"^0;//位申明
sbit RW="P1"^1;
sbit EN="P1"^2;

void delay(uint x)//延时子程序
{
 while(--x);
}

void write_cmd(uchar cmd)//写命令子程序
{
 RS=0;
 RW=0;
 P0=cmd;
 delay(500);
 EN=1;
 delay(500);
 EN=0;

}

void write_dat(uchar dat)//写数据子程序
{
 RW=0;
 RS=1;
 P0=dat;
 delay(500);
 EN=1;
 delay(500);
 EN=0;
}

void init_lcd()//1602液晶初始化
{
 EN=0;
 write_cmd(0x38);//显示模式设置
 write_cmd(0x0f);//显示开关、光标设置
// write_cmd(0x05);//光标及屏幕显示方式设置
 write_cmd(0x01);//清屏
 write_cmd(0x80);//指针初始化
}

void main()
{
 init_lcd();
 len1=sizeof(tab1);
 len2=sizeof(tab2);

 write_cmd(0x80+0x10);//将第一行字符写入缓冲区
 for(num=0;num<len1;num++)
 {
  write_dat(tab1[num]);
  delay(100);
 }
 write_cmd(0x80+0x55);
 for(num=0;num<len2;num++)//将第二行字符写入缓冲区
 {
  write_dat(tab2[num]);
  delay(100);
 }

 for(num=0;num<16;num++)//屏幕整体左移
 {
  write_cmd(0x1f);
  delay(20000);
 }

 while(1);
}

系统分类: 单片机
用户分类: 仿真(Proteus+Keil)
标签: 仿真 液晶 1602
来源: 原创
发表评论 阅读全文(881) | 回复(4)

2

关于投票
交通灯-双向六车道

以前做一个交通灯的仿真,但是比较简单。现在这个是双向六车道的,也不太难,但感觉还不错吧!呵呵

(附件有PROTEUS的仿真图)

KEIL中的C代码如下:

//交通灯 双向六车道 By Craftor
#include
#include
unsigned char num[40]={ 1,1,1,1,
        1,1,1,0,
      1,1,0,1,
      1,1,0,0,
      1,0,1,1,
      1,0,1,0,
      1,0,0,1,
      1,0,0,0,
      0,1,1,1,
      0,1,1,0,}; //数字0~9 共阴
void delay10ms(void)  //延时10ms
{
  unsigned char i,j;
  for(i=20;i>0;i--)
  for(j=248;j>0;j--);
}     
void main()
{
  unsigned char i,j;
  unsigned char direction="0";
  while(1)
  {
   for(i=20;i>0;i--)//倒计时20秒
   {
 switch(direction)
 {
  case 0: //南北主方向   
  {
     if(i>10) //南北直行+右拐
  {
  P0_0=1;  P2_0=0;
  P0_1=1;  P2_1=0;
  P0_2=0;  P2_2=0;
  P0_3=0;  P2_3=1;
  P0_4=1;  P2_4=0;
  P0_5=1;  P2_5=0;
  P0_6=0;  P2_6=1;
  P0_7=1;  P2_7=0;
  if(i<=10+3) P0_7=0;  //三秒内右拐黄灯亮
  }
  else  //南北直行+左拐
  {
  P0_0=1;  P2_0=1;
  P0_1=1;  P2_1=0;
  P0_2=0;  P2_2=0;
  P0_3=1;  P2_3=0;
  P0_4=0;  P2_4=0;
  P0_5=0;  P2_5=1;
  P0_6=1;  P2_6=1;
  P0_7=1;  P2_7=0;
  if(i<=3) P0_1=0;  //三秒内左拐黄灯亮
  }
     break;
  }
  case 1: //东西主方向   
  {
   if(i>10)  //东西直行+右拐
  {
     P0_0=1;  P2_0=0;
  P0_1=1;  P2_1=0;
  P0_2=1;  P2_2=1;
  P0_3=0;  P2_3=1;
  P0_4=1;  P2_4=0;
  P0_5=1;  P2_5=0;
  P0_6=0;  P2_6=1;
  P0_7=1;  P2_7=0;
  if(i<=10+3) P2_7=1;  //三秒内右拐黄灯亮
  }
  else     //东西直行+左拐
  {
  P0_0=0;  P2_0=0;
  P0_1=1;  P2_1=0;
  P0_2=1;  P2_2=1;
  P0_3=1;  P2_3=0;
  P0_4=1;  P2_4=1;
  P0_5=0;  P2_5=1;
  P0_6=1;  P2_6=0;
  P0_7=1;  P2_7=0;
  if(i<=3) P2_1=1; //三秒内左拐黄灯亮
  }
     break;
  }
 }
 P1_0=num[(i%10)*4+0];   //两位数码数字显示倒计时
 P1_1=num[(i%10)*4+1];
 P1_2=num[(i%10)*4+2];
 P1_3=num[(i%10)*4+3];
 P1_4=num[(i/10)*4+0];
 P1_5=num[(i/10)*4+1];
 P1_6=num[(i/10)*4+2];
 P1_7=num[(i/10)*4+3];
 for(j=0;j<100;j++) delay10ms();   //软件延时1秒
   }
 direction=(direction+1)%2;  //方向改变
  }
}

点击开大图

 

点击下载

系统分类: 单片机
用户分类: 仿真(Proteus+Keil)
标签: 单片机 交通灯 Proteus Keil 仿真
来源: 原创
发表评论 阅读全文(271) | 回复(0)

0

关于投票
自己做的交通灯系统

下图为Proteus的仿真图,有红、绿、黄三灯,带外部中断。

 

点击看大图

 

 

//交通灯,以下为Keil中的代码:
#include
#include
#define UD 1 //定义两个方向,南北 和 东西
#define LR 0
unsigned char STOP="0";
unsigned char num[40]={ 1,1,1,1,
        1,1,1,0,
      1,1,0,1,
      1,1,0,0,
      1,0,1,1,
      1,0,1,0,
      1,0,0,1,
      1,0,0,0,
      0,1,1,1,
      0,1,1,0,}; //数字0~9 共阴
void delay10ms(void)  //延时10ms
{
  unsigned char i,j;
  for(i=20;i>0;i--)
  for(j=248;j>0;j--);
}
 void StopInt() interrupt 0 //外部中断INT0
{
  STOP = 1;
}
void main()
{
  unsigned char i,j,k;
  unsigned char direction="UD";
  TCON = 0x01;  // INT0 下沿中断
  IE   = 0x81;  // EA =1,  EX0=1
  while(1)
  {
   for(i=20;i>0;i--)  //倒计时
   {
 if(STOP) goto INT0;
 switch(direction)
 {
  case UD:    //如果是南北方向
  {
     if (i>3)
  {  
    P1_0=0;   //南北方向 红灯 1开 0关
   P1_1=0;   //南北方向 黄灯
   P1_2=1;   //南北方向 绿灯
   P1_3=1;   //东西方向 红灯
   P1_4=0;   //东西方向 黄灯
   P1_5=0;   //东西方向 绿灯 
  }
  else    //3秒内黄灯亮
  {
   P1_0=0;
   P1_1=1;
   P1_2=0;
   P1_3=1;
   P1_4=0;
   P1_5=0; 
  }
  break;
  }
  case LR:    //如果是东西方向
  {
     if (i>3)
  {
   P1_0=1;
   P1_1=0;
   P1_2=0;  
    P1_3=0;
   P1_4=0;
   P1_5=1; 
  }
  else
  {
   P1_0=1;
   P1_1=0;
   P1_2=0;
   P1_3=0;
   P1_4=1;
   P1_5=0; 
  }
  break;
  }
 }
 P0_0=num[(i%10)*4+0];   //两位数码的数字显示 南北方向
 P0_1=num[(i%10)*4+1];
 P0_2=num[(i%10)*4+2];
 P0_3=num[(i%10)*4+3];
 P0_4=num[(i/10)*4+0];
 P0_5=num[(i/10)*4+1];
 P0_6=num[(i/10)*4+2];
 P0_7=num[(i/10)*4+3];
 P2_0=num[(i%10)*4+0];   //东西方向
 P2_1=num[(i%10)*4+1];
 P2_2=num[(i%10)*4+2];
 P2_3=num[(i%10)*4+3];
 P2_4=num[(i/10)*4+0];
 P2_5=num[(i/10)*4+1];
 P2_6=num[(i/10)*4+2];
 P2_7=num[(i/10)*4+3];
 for(j=0;j<100;j++) delay10ms();   //软件延时1秒

 INT0:
  if(STOP)
  {
   P1_0=1;
   P1_1=0;
   P1_2=0;
   P1_3=1;
   P1_4=0;
   P1_5=0;
   for(j=10;j>0;j--)
   {
     P0_0=num[(j%10)*4+0];  
   P0_1=num[(j%10)*4+1];
   P0_2=num[(j%10)*4+2];
   P0_3=num[(j%10)*4+3];
   P0_4=num[(j/10)*4+0];
   P0_5=num[(j/10)*4+1];
   P0_6=num[(j/10)*4+2];
   P0_7=num[(j/10)*4+3];
   P2_0=num[(j%10)*4+0];
   P2_1=num[(j%10)*4+1];
   P2_2=num[(j%10)*4+2];
   P2_3=num[(j%10)*4+3];
   P2_4=num[(j/10)*4+0];
   P2_5=num[(j/10)*4+1];
   P2_6=num[(j/10)*4+2];
   P2_7=num[(j/10)*4+3];
   for(k=0;k<100;k++) delay10ms();
   }
   STOP="0";
  }
 }
 direction=(direction+1)%2;  //方向交换
  }
}

系统分类: 单片机
用户分类: 仿真(Proteus+Keil)
标签: 交通灯,Proteus,Keil
来源: 原创
发表评论 阅读全文(706) | 回复(1)
总共 , 当前 /