回报阿莫:带任务调度的2051+18B20+HT1380+LS247电子钟

2020-01-27 11:31发布

从阿莫的网站上下载了很多好资料,学到了很多东西.可是本人一直充当着超级潜水员的角 {MOD},嘿嘿,很是过意不去.今天把本人的小制作发上来,为论坛尽一点绵力..做的不好,还望大家包涵.多多指正..
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
27条回答
haohan007
2020-01-29 16:22
我帮着传个C51版本的。


/***********************bausrpgf6688 2010年3月作品1602四位初步测试通过*********************/

#include <at892051.h>
#include<intrins.h>
#define uchar unsigned char
#define        uint  unsigned int
#define MAXTASK 4
extern void oswait(uchar);
uchar SAVESP,SAVEWAIT,SAVEINIT;
uchar OSWAITBIT,OSINITBIT,TASKIDBIT,TASKIDNUM,OSREADYBIT;
uchar bdata OSSWFLAG;

uchar OSWAITRAM[3][MAXTASK];                 

/*注意:第一脚是5伏,第二脚是地!和普通的1602相反!

背光已经在内部接到电源上了,常亮。如需控制背光,需要断开液晶背后的J2跳线,从A引出背光线

  第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
  第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。
  第6脚:E(或EN)端为使能(enable)端 //当E脚由高电平跳变成低电平时液晶块执行命令
1.VDD
2.GND
3.VO
4.RS
5.R/W
6.E
7-14.DB0-DB7                                                                  */

uchar bdata lcdbuff;
uint cpuidl,cpuidl2=0;                                                 //CPU空闲计数
sbit e=P3^7;
sbit rs=P3^4;
sbit rw=P3^5;
sbit led=P3^3;
sbit AN=P3^0;
sbit LCD7=P1^7;
sbit LCD6=P1^6;
sbit LCD5=P1^5;
sbit LCD4=P1^4;
sbit lcdbuff0=lcdbuff^0;
sbit lcdbuff1=lcdbuff^1;
sbit lcdbuff2=lcdbuff^2;
sbit lcdbuff3=lcdbuff^3;
sbit lcdbuff4=lcdbuff^4;
sbit lcdbuff5=lcdbuff^5;
sbit lcdbuff6=lcdbuff^6;
sbit lcdbuff7=lcdbuff^7;

/**************字模*****************/
uchar code cc[12]="I LOVE MCU!";                   //字符加空格总共11个,第十二个是个0
uchar code cc2[9]="CPUWORK=";
/************函数声明***************/
void r_BF();
void w_cdata(void);
void w_com(uchar com);
void w_sting(uchar string[]);
void w_sting2(uchar string2);
void init_lcd();
void cg_w();
void w_word(uchar word);

/************函数说明*********************
**主要用来初始化一些设置显示、输入模式、**
**显示开关、光标、移位、功能、地址                **
******************************************/
void w_com(uchar com){
        r_BF();
        lcdbuff=com;
        rs=0;
        rw=0;
        w_cdata();
}
/*************写字符***************/

/************初始化函数*************/
void init_lcd()
{   w_com(0x2c);                 //功能设置为四位数据总线
        w_com(0x01);                 //清屏
        w_com(0x06);                 //设置显示输入模式(AC指针自加1显示不移位)
        w_com(0x0c);                 //显示开/关设置(设置显示、光标和闪烁开关)
}
/************读忙标志BF*************/
void r_BF()
{
        LCD7=1;                                          //BF端口在DB7
        rs=0;
        rw=1;                                          
        e=1;                                          //RS=0;RW=1;E=1表示读忙标志BF
        while(LCD7);                          //若内部操作位BF忙CPU就等待BF不忙才能操作
        e=0;
}
/*********写命令的公共部分**********
**************函数说明**************
**因为我们定义为四位数据总线所以每**
**发送一字节要做两次发送先发送高四**
**位再发送低四位                                  **
***********************************/
void w_cdata(void)
{
        LCD7=lcdbuff7;
        LCD6=lcdbuff6;
        LCD5=lcdbuff5;
        LCD4=lcdbuff4;
        e=1;                           //当E脚由高电平跳变成低电平时液晶块执行命令
        _nop_();
        _nop_();
        _nop_();
        e=0;                                //当E脚由高电平跳变成低电平时液晶块执行命令
       
        LCD7=lcdbuff3;
        LCD6=lcdbuff2;
        LCD5=lcdbuff1;
        LCD4=lcdbuff0;
        e=1;
        _nop_();
        _nop_();
        _nop_();
        e=0;                               
}


/************函数说明*********************
**用来把自己所创造的字符写入CGROM*********
******************************************/
void w_sting(uchar string[])
{        uchar ii=0,yy;
    while((yy=string[ii++]))
        {
        r_BF();
        rs=1;
        rw=0;
        lcdbuff=yy;
        w_cdata();
        }
}
void w_sting2(uchar string2)
{        uchar ii,yy;
    for(ii=0;ii!=3;ii++)
        {
        switch(ii)
        {
        case 0:     yy=string2/10+48; break;
        case 1:     yy=string2%10+48; break;
        case 2:         yy=37;            break;
        }
        r_BF();
        rs=1;
        rw=0;
        lcdbuff=yy;
        w_cdata();
        }

}

void TaskB(void){
                                                     //任务只在本任务中执行一次
        while(1){
                 w_com(0x01);                 //清屏
                 w_com(0x2c);                 //功能设置为四位数据总线,显示第二行。
                 w_com(0x80+0x02);    //第一行2列。
                     w_sting(cc2);                   
                         w_com(0x80+0x44);    //第二行4列。
                     w_sting(cc);
                 
                 oswait(255);
                 oswait(255);
         oswait(255);
                 w_com(0x2c-0x08);                 //功能设置为四位数据总线,不显示第二行。
                 oswait(255);
                 oswait(255);
         oswait(255);
                 
             }
                    }



void  TaskC(void)
            {  uchar tt;
                   while(1){
                                   cpuidl=TH1;
                                cpuidl=cpuidl<<8;
                                cpuidl=cpuidl|TL1;
                                cpuidl=cpuidl/99;
                                cpuidl=cpuidl+cpuidl2;
                                TH1=0;
                                TL1=0;
                            cpuidl2=cpuidl>>1;
                                tt=        cpuidl2;
                                w_com(0x80+10);    //第一行10列。
                                w_sting2(99-tt);          //CPU占用率
                                oswait(0);
                                }
                }
void  TaskD(void)
            {
                                   while(1){
                                   led=~led;
                                   oswait(10);
                                }
                }

void  TaskE(void)
            {
                                   while(1){
                                   AN=1;
                                while(AN==0) AN=1;
                                   oswait(0);
                                }
                }





void main(void)
{        TASKIDNUM=0;  //;任务指针指向第0个任务
    TASKIDBIT=1;   //;任务指针指向第0个任务
        OSREADYBIT=255;          //所有任务全准备好就绪
        OSSWFLAG=  0;      //
    TMOD = 17;                   //定时器0,1,都工作于16位定时模式
        TL0 = 0x0f0;
        TH0 = 0x0d8;
    TL1 = 0;
        TH1 = 0;                        //定时器1没充许启动和开放中断
        ET0 = 1;
        EA  = 1;
    init_lcd();
        TR0 = 1;
        TaskB();  //这里必需指向所要执行的第一个任务
}

下面是完整的工程:OS_1602_4BIT显示字符ourdev_684816HHAOB0.rar(文件大小:89K) (原文件名:OS_1602_4BIT显示字符.rar)

一周热门 更多>