打印

又有一句C程序看不明白,请大伙儿指教

[复制链接]
2367|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
anazel|  楼主 | 2011-12-29 07:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在一段1602垂直滚动显示的程序中有个地方看不明白:
.....................
for(j=i;j<16;j++)
   Disp_Buffer[j]=' ';
  while(F0)  
   Delayxms(5);
  ShowString(0,0,"      ");
  Delayxms(150);
  while(F0)
   Delayxms(5);
  ShowString(0,1,Disp_Buffer);
  Delayxms(150);
  while(F0)
   Delayxms(5);
  ShowString(0,0,Disp_Buffer);
  ShowString(0,1,"      ");
  Delayxms(150);

...........................................
这里的F0是显示控制标准位,请问F0是特殊功能寄存器还是1602中的控制位?在什么地方有定义呢?

相关帖子

沙发
ejack| | 2011-12-29 08:01 | 只看该作者
自己去前面找F0的定义。
也有可能在其它头文件里。

使用特权

评论回复
板凳
Ryanhsiung| | 2011-12-29 08:12 | 只看该作者
Ctrl+Shift +f 全局查找一下

使用特权

评论回复
地板
anazel|  楼主 | 2011-12-29 08:31 | 只看该作者
用Ctrl+Shift+f 全局搜了一下,显示如下:
Searching for 'F0'...
.\main.c(59):   while(F0)
.\main.c(63):   while(F0)
.\main.c(67):   while(F0)
.\main.c(106):     while(F0)
.\main.c(109):       while(F0)
.\main.c(122):   F0 = !F0;
.\main.c(130):  F0  = 0;
程序里只搜到这些,没有定义

使用特权

评论回复
5
ayb_ice| | 2011-12-29 08:33 | 只看该作者
多半是PSW的F0位,如果是的话,不安全

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
anazel + 1
6
anazel|  楼主 | 2011-12-29 08:45 | 只看该作者
本帖最后由 anazel 于 2011-12-29 08:50 编辑

#include <reg52.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
void Initialize_LCD();
void ShowString(uchar,uchar,uchar *);
sbit K1 = P3^0;
sbit K2 = P3^1;
sbit K3 = P3^2;

uchar code Prompt[]="PRESS K1--K4 TO START DEMO PROG";
uchar const Line_Count = 6;
uchar code Msg[][80]=
{
        "Many CAD users dismiss",
        "process of creating PCB",
        "of view.with PCB layout",
        "placement and track routing,",
        "can often be the most time",
        "And if you use circuit simulation",
        "you are going to spend even more"
};
uchar Disp_Buffer[32];
void Delayxms(uint ms)
{
        uchar i;
        while(ms--)
        {
                 for(i=0;i<120;i++);
        }
}

void V_Scroll_Display()
{
        uchar i,j,k = 0;
        uchar *p = Msg[0];
        uchar *q = Msg[Line_Count] + strlen(Msg[Line_Count]);
        while(p<q)
        {
                 for(i=0;(i<16)&&(p<q);i++)
                {
                         if(((i==0)||(i==15))&& *p == ' ')
                                p++;
                        if(*p != '\0')
                        {
                                 Disp_Buffer = *p++;
                        }
                        else
                        {
                                 if(++k>Line_Count)
                                        break;
                                p = Msg[k];
                                Disp_Buffer = *p++;
                        }
                }
                for(j=i;j<16;j++)
                        Disp_Buffer[j]=' ';
               
while(F0)
                        Delayxms(5);
                ShowString(0,0,"      ");
                Delayxms(150);
                while(F0)
                        Delayxms(5);
                ShowString(0,1,Disp_Buffer);
                Delayxms(150);
                while(F0)
                        Delayxms(5);
                ShowString(0,0,Disp_Buffer);
                ShowString(0,1,"      ");
                Delayxms(150);        
        }
        ShowString(0,0,"         ");
        ShowString(0,1,"         ");
}

void H_Scroll_Display()
{
        uchar m,n,t = 0,L=0;
        uchar *p = Msg[0];
        uchar *q = Msg[Line_Count] + strlen(Msg[Line_Count]);
        for(m=0;m<16;m++)
                        Disp_Buffer[m]=' ';        
        while(p<q)
        {
                 if((m=16||m==31)&& *p == ' ')
                        p++;
                for(m=16;m<32&&p<q;m++)
                {
                         if(*p != '\0')
                        {
                                Disp_Buffer[m] = *p++;         
                        }
                        else
                        {
                                 if(++t>Line_Count)
                                        break;
                                p = Msg[t];
                                Disp_Buffer[m] = *p++;
                        }
                }
                for(n=m;n<32;n++)
                        Disp_Buffer[n]=' ';
                for(m=0;m<=16;m++)
                {
                        
while(F0)
                                 Delayxms(5);
                           ShowString(0,L,Disp_Buffer+1);
                           while(F0)
                                 Delayxms(5);
                        Delayxms(20);
                }
                L = (L==0)? 1:0;
                Delayxms(200);
        }
        if(L==1)
                ShowString(0,1,"      ");        
}

void EX_INT0() interrupt 0
{
        F0 = !F0;
}

void main()
{
        uint Count = 0;
        IE = 0x81;
        IT0 = 1;
        F0  = 0;
        Initialize_LCD();
        ShowString(0,0,Prompt);
        ShowString(0,1,Prompt+16);
        while(1)
        {
                 if(K1 == 0)
                {
                         V_Scroll_Display();
                        Delayxms(200);
                }
                else if(K2 == 0)
                {
                         H_Scroll_Display();
                        Delayxms(200);        
                }
        }
}

这是主程序,看不出跟PSW的F0有什么关系来

使用特权

评论回复
7
delin17| | 2011-12-29 08:49 | 只看该作者
头文件里呢?
reg52.h里有定义没?

使用特权

评论回复
8
anazel|  楼主 | 2011-12-29 08:53 | 只看该作者
/*  PSW  */
sbit CY    = PSW^7;
sbit AC    = PSW^6;
sbit F0    = PSW^5;
sbit RS1   = PSW^4;
sbit RS0   = PSW^3;
sbit OV    = PSW^2;
sbit P     = PSW^0; //8052 only

看来就是PSW的第5位了

使用特权

评论回复
9
anazel|  楼主 | 2011-12-29 08:55 | 只看该作者
F0是用户标志
Cy是进借位标志
Ay是辅助进借位标志
RS0.RS1是工作寄存组
OV:溢出标志位,有溢出时置1.
P:奇数标志位,有奇数个1时置1.

F0是PSW寄存器的用户可编程位,他是一个用户可以自己设置的状态位,比如在两片单片机之间进行通信时,我们可以用这一位的状态来判断是否准备好接收,或是发送。因此可以作为你设置的标志位,你的程序可以根据需要对这个位进行置位或者清零、或者对这个位进行测试!

使用特权

评论回复
10
dosculler| | 2011-12-29 16:41 | 只看该作者
F0是用户标志
Cy是进借位标志
Ay是辅助进借位标志
RS0.RS1是工作寄存组
OV:溢出标志位,有溢出时置1.
P:奇数标志位,有奇数个1时置1.

F0是PSW寄存器的用户可编程位,他是一个用户可以自己设置的状态位,比如在两 ...
anazel 发表于 2011-12-29 08:55


9楼正解,这个标志位太久没人用了,都忽略了,个个在找定义,哈哈……

使用特权

评论回复
11
dosculler| | 2011-12-29 16:44 | 只看该作者
这程序也真绝,
不舍得自己定义一个位,
竟然把这个位都给用上了。
估计是习惯问题或者是节省空间

使用特权

评论回复
12
anazel|  楼主 | 2011-12-29 22:30 | 只看该作者
现在单片机怎么用也不至于缺那一位吧,这个程序编的不好

使用特权

评论回复
13
程序匠人| | 2011-12-30 00:09 | 只看该作者
正是环保标兵啊~~

不过这种事情咱也干过。。。

使用特权

评论回复
14
anazel|  楼主 | 2011-12-30 07:04 | 只看该作者
有128个位还不够用啊

使用特权

评论回复
15
ejack| | 2011-12-30 07:54 | 只看该作者
勒紧裤腰带精打细算过日子,大家从8位机的时代都是这么一把血一把泪走过来的。
所以现在写32位程序时还经常分配Byte型局部变量而备受嘲笑……手头一把百元大钞总是习惯性地想破零……
苦日子过惯了,突然一下锦衣玉食,也得花点时间慢慢适应呢……

使用特权

评论回复
16
huzaizai007| | 2011-12-30 09:26 | 只看该作者
艰苦朴素的精神不能丢啊……学习了

使用特权

评论回复
17
huangqi412| | 2011-12-30 10:51 | 只看该作者
真够勤俭持家啊。。。、

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

448

帖子

2

粉丝