专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
回报阿莫:带任务调度的2051+18B20+HT1380+LS247电子钟
2020-01-27 11:31
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
10257
27
27
从阿莫的网站上下载了很多好资料,学到了很多东西.可是本人一直充当着超级潜水员的角 {MOD},嘿嘿,很是过意不去.今天把本人的小制作发上来,为论坛尽一点绵力..做的不好,还望大家包涵.多多指正..
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
26条回答
zlulu2006
1楼-- · 2020-01-29 09:19
汇编还是很难懂啊,呵呵
加载中...
6sfmwd
2楼-- · 2020-01-29 13:12
怎么没有原理图,楼主发一下图共同学习.
加载中...
tonyone
3楼-- · 2020-01-29 15:28
哈哈,汇编,顶一下!
加载中...
zuixin369
4楼-- · 2020-01-29 15:36
精彩回答 2 元偷偷看……
加载中...
zyx66a
5楼-- · 2020-01-29 15:43
汇编啊 我是不会编啊
加载中...
haohan007
6楼-- · 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)
加载中...
上一页
1
2
3
4
5
下一页
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
东软载波ESF0654 PDS开发板串口USART0代码分享
1 个回答
普通32位单片机使用linux的应用代码
5 个回答
东软载波ESF0654 PDS开发板AT24C04的调试
9 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
/***********************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)
一周热门 更多>