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

[复制链接]
 楼主| 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;
程序里只搜到这些,没有定义
ayb_ice 发表于 2011-12-29 08:33 | 显示全部楼层
多半是PSW的F0位,如果是的话,不安全

评分

参与人数 1威望 +1 收起 理由
anazel + 1

查看全部评分

 楼主| 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有什么关系来
delin17 发表于 2011-12-29 08:49 | 显示全部楼层
头文件里呢?
reg52.h里有定义没?
 楼主| 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位了
 楼主| anazel 发表于 2011-12-29 08:55 | 显示全部楼层
F0是用户标志
Cy是进借位标志
Ay是辅助进借位标志
RS0.RS1是工作寄存组
OV:溢出标志位,有溢出时置1.
P:奇数标志位,有奇数个1时置1.

F0是PSW寄存器的用户可编程位,他是一个用户可以自己设置的状态位,比如在两片单片机之间进行通信时,我们可以用这一位的状态来判断是否准备好接收,或是发送。因此可以作为你设置的标志位,你的程序可以根据需要对这个位进行置位或者清零、或者对这个位进行测试!
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楼正解,这个标志位太久没人用了,都忽略了,个个在找定义,哈哈……
dosculler 发表于 2011-12-29 16:44 | 显示全部楼层
这程序也真绝,
不舍得自己定义一个位,
竟然把这个位都给用上了。
估计是习惯问题或者是节省空间
 楼主| anazel 发表于 2011-12-29 22:30 | 显示全部楼层
现在单片机怎么用也不至于缺那一位吧,这个程序编的不好
程序匠人 发表于 2011-12-30 00:09 | 显示全部楼层
正是环保标兵啊~~

不过这种事情咱也干过。。。
 楼主| anazel 发表于 2011-12-30 07:04 | 显示全部楼层
有128个位还不够用啊
ejack 发表于 2011-12-30 07:54 | 显示全部楼层
勒紧裤腰带精打细算过日子,大家从8位机的时代都是这么一把血一把泪走过来的。
所以现在写32位程序时还经常分配Byte型局部变量而备受嘲笑……手头一把百元大钞总是习惯性地想破零……
苦日子过惯了,突然一下锦衣玉食,也得花点时间慢慢适应呢……
huzaizai007 发表于 2011-12-30 09:26 | 显示全部楼层
艰苦朴素的精神不能丢啊……学习了
huangqi412 发表于 2011-12-30 10:51 | 显示全部楼层
真够勤俭持家啊。。。、
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

448

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部